声音播放的开始被切断

Posted

技术标签:

【中文标题】声音播放的开始被切断【英文标题】:Beginning of sound playback is cut off 【发布时间】:2013-08-19 04:05:50 【问题描述】:

我正在尝试从嵌入式资源中播放 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() 时被切断。随后的调用似乎工作正常。

【问题讨论】:

【参考方案1】:

我也遇到了同样的问题。在应用程序中和通过外部媒体播放器(如 VLC)播放时,声音的开头都会被切断。就我而言,问题与蓝牙扬声器有关。将声音输出切换到有线扬声器后,效果很好。

【讨论】:

我遇到了同样的问题,但我以相反的方式解决了它:我从有线切换到蓝牙(这是在 Mac 上)。 这个问题与我使用 USB 线连接的扬声器有关。尝试将有关 Idlesomething 的注册表设置归零并在设备管理器的 USV 集线器设置中关闭电源 - 没有任何帮助。扬声器在约 3.5 秒后进入睡眠状态,并在此之后延迟任何声音的前 0.5 秒。【参考方案2】:

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

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

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

【讨论】:

感谢您的尝试,但我认为这没有帮助。声音 is 在文件中。作为嵌入式资源,它存储在程序的 EXE 文件中。在程序需要它之前,它不会加载到 RAM 中。 LoadASync 调用将声音加载到 RAM 中,并在完成后调用 LoadCompleted 处理程序。然后事件处理程序调用 Play 函数。不涉及可能影响播放的声卡设置。 我知道它在一个文件中,嵌入。不过,它们可以以不同的方式处理。您应该尝试两种实验并报告观察结果...当然,如果您想解决问题。 对不起,我只是不明白这样的实验会有什么帮助。假设我尝试将声音放在自己的文件中,但问题仍然存在。这并没有让我更接近解决方案。假设我试过了,问题不存在。这仍然没有让我更接近解决方案。我没有选择将声音数据放在单独的文件中。它们必须是嵌入式资源。 测试文件存储有助于缩小问题的范围。例如,测试短声音会显示是否是跳过开头的问题或任何音效问题。如果您不愿意花一分钟时间做简单的测试,那就只能靠自己了。 好的,只是为了争论,我尝试使用您发布的代码从文件中播放声音。不播放声音。现在我们已经按照您想要的方式缩小范围,解决方案是什么?【参考方案3】:

如果您对“同步”播放没有任何问题,请尝试SoundPlayer.PlaySync() 方法。在完全相同的情况下(即使用“嵌入式资源”),这对我来说效果很好。

【讨论】:

必须是异步的。

以上是关于声音播放的开始被切断的主要内容,如果未能解决你的问题,请参考以下文章

Omxplayer 大约会切断最后一秒的声音

开始播放时声音随机中断

如何确切地知道为啥声音开始播放?

SKAction 播放声音不是从头开始的

在 iPhone 上完美连续播放声音

AVAudioPlayer 重置当前播放的声音并从头开始播放