在 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 设备 ID

NAudio - WaveOut 与 WaveOffsetStream 一起使用时不会引发 PlaybackStopped 事件

NAudio:在保持声卡打开的同时播放许多音频文件

NAudio WaveOut.PlaybackState 属性未更新

使用 nAudio 播放多个文件时的音量控制

[C#] NAudio 各种常见使用方式 播放 录制 转码 音频可视化