声音播放的开始被截断

5
我正在尝试从嵌入资源中回放WAV文件,但通常会在开头剪掉0.5到2.0秒。也就是说,如果WAV是一段录制的声音,说“大家好。今天的新闻……”然后播放通常会剪掉开头的“大家好——”。
播放代码非常简单:
using System.Media;

play(GetResourceStream(audioItem));

...

private static void play(UnmanagedMemoryStream sndData)
{
   SoundPlayer sp = new SoundPlayer(sndData);
   sp.LoadCompleted += delegate( object sender, System.ComponentModel.AsyncCompletedEventArgs e)
   {
      sp.Play();
   };    
   sp.LoadAsync();
}

原始代码仅创建了 SoundPlayer 对象,然后调用了 Play() 方法。我添加了 LoadAsync() 调用和 LoadCompleted 事件处理程序,以查看是否可以解决问题,但似乎并没有表现出任何不同。
额外信息:似乎只有应用程序第一次调用 SoundPlayer.Play() 时才会截断声音播放。随后的调用似乎正常工作。
4个回答

2

我刚刚也遇到了同样的问题。在应用程序中和通过外部媒体播放器(如VLC)播放时,声音开头都被剪掉了。在我的情况下,该问题与蓝牙扬声器有关。将声音输出切换到有线扬声器后,它正常工作了。


我曾经遇到过同样的问题,但我采用了相反的解决方法:我从有线转换为蓝牙(这是在Mac上)。 - David Figatner
这个问题出现在我连接了USB线的扬声器上。我尝试了清空有关“Idlesomething”的注册表设置和在设备管理器中关闭USV集线器设置中的电源节省,但都没有起作用。扬声器在约3.5秒后进入睡眠状态,并在此后的任何声音的前0.5秒内出现延迟。 - Nakilon

0
如果您对“同步”播放没有问题,只需尝试{{link1:SoundPlayer.PlaySync()}}方法。在完全相同的情况下(即使用“嵌入式资源”),这对我很有效。

必须是异步的。 - Mike Fulton

0

我的问题确实是由于蓝牙音箱引起的...我将其断开连接,然后重新连接,之后就一切正常了。我不需要切换到有线扬声器。

这个问题发生在两个不同的微软播放器和 VLC 上。


0

不应该有问题。尝试将wav文件存储到文件中并从文件中播放。如果问题仍然存在,我认为您应该检查声卡的各种效果设置,例如淡入淡出。

尝试播放“C:\ Windows \ Media \ chord.wav”,它非常短,甚至不到一秒钟。

System.Media.SoundPlayer player = new System.Media.SoundPlayer(@"C:\Windows\Media\chord.wav");
player.Play();

我知道它是嵌入在文件中的。不过,它们可以有不同的处理方式。如果你想解决这个问题,你应该尝试两种实验并报告观察结果。 - Codeguard
抱歉,但我不认为这样的实验会有所帮助。假设我尝试将声音放在单独的文件中,问题仍然存在。这并没有让我更接近解决方案。假设我尝试过了,问题并不存在。这仍然没有让我更接近解决方案。我不能选择将声音数据放在单独的文件中。它们必须是嵌入式资源。 - Mike Fulton
测试文件存储有助于缩小问题范围。例如,测试短声音可以显示是否存在跳过开头或其他声音效果问题。如果您不愿意花一分钟进行简单的测试,那么您就只能自己解决问题了。 - Codeguard
好的,只是为了论证,我尝试使用您发布的代码从文件播放声音。声音没有播放。既然我们已经按照您的意愿缩小了范围,那么解决方案是什么? - Mike Fulton
让我们继续在聊天室里讨论 - Codeguard
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接