在 NAudio waveOut 上无法流畅播放,WaveProvider 被清空太快
Posted
技术标签:
【中文标题】在 NAudio waveOut 上无法流畅播放,WaveProvider 被清空太快【英文标题】:Can't get smooth playback on NAudio waveOut, WaveProvider being emptied too quickly 【发布时间】:2012-06-21 21:23:58 【问题描述】:我正在尝试创建一个类似于 NAudio 中的网络聊天演示的应用程序。
然而,在接收/收听端,我正在缓冲接收到的音频数据包,直到在调用 WaveProvider.addSamples() 之前获得其中的 2 个。我已经尝试过完全不缓冲,缓冲大量等,但问题仍然存在,所以我认为这不是明确的原因。
我遇到的问题是,无论我尝试添加采样的速度有多快,播放音频时 WaveProvider 都会反复耗尽(BufferedBytes == 0)。我运行了一些测试,我的调试输出是这样的:
-
0.690s WaveProvider Empty
0.695s 样本添加到 WaveProvider
0.871s WaveProvider Empty
0.875s 样本添加到 WaveProvider
1.013s WaveProvider Empty
...等等
直到每 150 毫秒左右,WaveProvider 才会显示“空”,这是有意义的,因为 addSamples 调用会添加与 100 毫秒音频数据相对应的数据。
有趣的部分是从 WaveProvider 为空到尝试下一个 addSamples 之间的 4 毫秒到 5 毫秒的时间。缓冲区大小没有变化或加快 addSamples 的努力似乎减少了这种差距,因此播放的音频总是有这些微小的静音间隙,听起来像是爆裂声/中断。
我想知道这个微小的时间延迟是否可能是由于 WaveOut 设备正在播放时 WaveProvider 被锁定而导致的,因此我被锁定无法将样品添加到 WaveProvider 直到它完成播放?有什么办法可以纠正吗?
我的初始化代码如下:(希望正常)
WaveProvider = new BufferedWaveProvider(new WaveFormat(16000, 1));
WaveProvider.BufferDuration = new TimeSpan(0, 0, 10);
AudioPlayer = new WaveOut(WaveCallbackInfo.FunctionCallback());
AudioPlayer.Init(WaveProvider);
我将不胜感激有关此事的任何帮助。 谢谢
【问题讨论】:
【参考方案1】:如果您在播放数据时接收数据的速度不快,那么您将在播放过程中出现间隙,您对此无能为力。但是,您可以通过在缓冲(最多一秒钟)音频时自动暂停来改善体验。然后,如果缓冲区用完,您将再次暂停。这样一来,音频听起来就不会那么断断续续了。
【讨论】:
感谢马克的建议。如果确实我接收数据的速度太慢,那么如果我接收到的数据的大小更大,这应该有望缓解一些问题。我以前尝试过,但我会继续尝试和测试所有选项。以上是关于在 NAudio waveOut 上无法流畅播放,WaveProvider 被清空太快的主要内容,如果未能解决你的问题,请参考以下文章
NAudio - WaveOut 与 WaveOffsetStream 一起使用时不会引发 PlaybackStopped 事件