流式音频播放延迟(约 200 毫秒)

2024-04-29

我有一个播放流式音频数据的应用程序(如聊天客户端)。该工作流程涉及三个简单步骤:

  1. 首先发送文件头信息(采样率、每个样本的位数和通道数)。
  2. 音频波形输出设备根据上述参数进行初始化。
  3. 音频(pcm)数据被发送并在上述设备上播放。

数据接收代码是本机的(C 代码)。它读取套接字上的数据。然后它调用托管 C# 代码,该代码使用 Naudio 库来初始化设备并播放音频。

现在的问题是,我发现音频播放有一些延迟。我已经检测了其余的代码(特别是:在套接字上传输数据并将其传递回托管代码),这似乎没问题。整个传输过程大约需要 600 微秒,但是在我将缓冲区分配给Naudio,似乎在一段时间后(大约 200-250 毫秒)开始播放。

这是我的 C# 类,用于处理音频播放部分:

class foo
{
    static  IWavePlayer     s_WaveOut;
    static  WaveFormat      s_WaveOutFormat;
    static  BufferedWaveProvider    s_WaveProvider;
    static  byte[]          s_Samples       = new byte[10000];

    // called from native code to init deivce with specified sample rate and num of channels
    private static void DeviceInit(int rate, int bits, int channels)
    {
        s_WaveOut   = new WaveOut(WaveCallbackInfo.FunctionCallback());
        s_WaveOutFormat = new WaveFormat(rate, bits, channels);
        s_WaveProvider  = new BufferedWaveProvider(s_WaveOutFormat);

        s_WaveProvider.DiscardOnBufferOverflow      = true;
        s_WaveProvider.BufferLength         = 5 * 1024 * 1024;

        s_WaveOut.Init(s_WaveProvider);
        s_WaveOut.Play();
    }

    // called from native 'C' code upon receiving audio packates
    private unsafe static void PlayDataCallback(
        IntPtr buff,
        Int32 size) 
    {
        Marshal.Copy(buff, s_Samples, 0, size);
        s_WaveProvider.AddSamples(s_Samples, 0, size);
    }
}

任何人都知道可能导致延迟的原因,或者我是否以某种错误的方式使用它(Naudio)。

我尝试使用相同的 Naudio 库来播放 wav 文件,似乎工作完美,只有当我自己初始化设备后添加样本时,问题才会出现。

[update]如果我改变s_WaveOut = new WaveOut(WaveCallbackInfo.FunctionCallback()); to s_WaveOut = new DirectSound();,性能好很多。如果在此之后,我修改 Naudio 源以将播放线程优先级设置为Highest(默认为“正常”),性能进一步提高,但正如预期的那样,该进程开始消耗大量资源。

谢谢你,

Vikram


我还使用 NAudio 开发音频流应用程序。我们还存在延迟问题。达到300毫秒。

捕获每秒发生 10 次(每 100 毫秒一次)。

使用 Vikram.exe 的建议来使用 DirectSoundOut 而不是 WaveOut 有一点帮助。延迟减少了 50 或 100 毫秒,但前提是我将所需延迟设置为 50 毫秒。

new DirectSoundOut(guid, 50);

另一项技巧已将延迟降低了 100 或 200 毫秒。我们检查是否正在播放声音,如果有则跳过新帧。

if (s_WaveProvider.BufferedDuration <= 100)
    s_WaveProvider.AddSamples(s_Samples, 0, size);

在声音流畅度方面还有一些工作要做,但现在基本上已经没有延迟了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

流式音频播放延迟(约 200 毫秒) 的相关文章

随机推荐