【问题标题】:Can't get smooth playback on NAudio waveOut, WaveProvider being emptied too quickly在 NAudio waveOut 上无法流畅播放,WaveProvider 被清空太快
【发布时间】:2012-06-21 21:23:58
【问题描述】:

我正在尝试创建一个类似于 NAudio 中的网络聊天演示的应用程序。

然而,在接收/收听端,我正在缓冲接收到的音频数据包,直到在调用 WaveProvider.addSamples() 之前获得其中的 2 个。我已经尝试过完全不缓冲,缓冲大量等,但问题仍然存在,所以我认为这不是明确的原因。

我遇到的问题是,无论我尝试添加采样的速度有多快,播放音频时 WaveProvider 都会反复耗尽(BufferedBytes == 0)。我运行了一些测试,我的调试输出是这样的:

  1. 0.690s WaveProvider Empty
  2. 0.695s 样本添加到 WaveProvider
  3. 0.871s WaveProvider Empty
  4. 0.875s 样本添加到 WaveProvider
  5. 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);

我将不胜感激有关此事的任何帮助。 谢谢

【问题讨论】:

    标签: c# naudio


    【解决方案1】:

    如果您在播放数据时接收数据的速度不快,那么您将在播放过程中出现间隙,您对此无能为力。但是,您可以通过在缓冲(最多一秒钟)音频时自动暂停来改善体验。然后,如果缓冲区用完,您将再次暂停。这样一来,音频听起来就不会那么断断续续了。

    【讨论】:

    • 感谢马克的建议。如果确实我接收数据的速度太慢,那么如果我接收到的数据的大小更大,这应该有望缓解一些问题。我以前尝试过,但我会继续尝试和测试所有选项。
    猜你喜欢
    • 1970-01-01
    • 2012-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-14
    • 1970-01-01
    • 2021-05-09
    相关资源
    最近更新 更多