gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 01:24:43 31 4
gpt4 key购买 nike

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

  1. 首先发送文件头信息(采样率、每个样本的位数和 channel 数)。
  2. 根据上述参数初始化音频waveout设备。
  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 文件,这似乎完美无缺,只有当我自己初始化设备后添加样本时才会出现问题。

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

谢谢,

维克拉姆

最佳答案

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

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

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

new DirectSoundOut(guid, 50);

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

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

在声音流畅度方面还有一些工作要做,但总体上我们现在没有延迟。

关于c# - 流式音频播放延迟(约 200 毫秒),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8655313/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com