【问题标题】:Audio Streaming Latency音频流延迟
【发布时间】:2013-06-27 20:32:28
【问题描述】:

我正在编写一个 UDP 局域网视频聊天系统,并且已经让视频和音频流正常工作。但是,我在音频中遇到了一点延迟(大约半秒),并且想知道哪种编解码器可以提供最少的延迟。我正在使用 NAudio (http://naudio.codeplex.com/),它让我可以访问以下编解码器进行流式传输;

  • Speex 窄带 (VBR)
  • Speex 宽带 (16kHz)(VBR)
  • Speex 超宽带 (32kHz)(VBR)
  • DSP 组 TrueSpeech (8.5kbps)
  • GSM 6.10 (13kbps)
  • 微软 ADPCM (32.8kbps)
  • G.711 a-law (64kbps)
  • G.722 16kHz (64kbps)
  • G.711 mu-law (64kbps)
  • PCM 8kHz 16 位未压缩 (128kbps)

我已经尝试过它们,但我并没有注意到太大的不同。还有其他我应该下载并尝试减少延迟的吗?我只会通过连接发送语音,但我并不太担心质量或背景噪音。

更新

我正在像这样以块的形式发送音频;

        waveIn = new WaveIn();
        waveIn.BufferMilliseconds = 50;
        waveIn.DeviceNumber = inputDeviceNumber;
        waveIn.WaveFormat = codec.RecordFormat;
        waveIn.DataAvailable += waveIn_DataAvailable;

void waveIn_DataAvailable(object sender, WaveInEventArgs e)
    {
        if (connected)
        {
            byte[] encoded = codec.Encode(e.Buffer, 0, e.BytesRecorded);
            udpSender.Send(encoded, encoded.Length);
        }
    }

【问题讨论】:

  • 有时延迟是无法控制的。我可以运行相同的设备,运行低延迟的驱动程序,但运行不同的程序,差异是惊人的。有些程序有延迟缓冲区。我想你必须自己写。我想说1/2秒很长。在专业音频中,您与 ms 打交道。我不明白为什么如果你在交流为什么噪音和质量不重要。
  • 哦,是的。我注意到 naudio 有一个 ASIO 选项。您在使用它吗(即您的硬件是否支持它?)?
  • 我从 i5 MS Surface 运行到 Windows 7 i7 笔记本电脑,但我知道瓶颈可能在其他地方。我的意思是我愿意对我的背景噪音/质量进行打击,以减少延迟。我刚刚在两个系统中都安装了 ASIO4All,但我不熟悉它。它有助于编码/解码吗?
  • 音乐对我来说是一种爱好,我不会为它编程。我来自使用音频 progs 的经验。它的好处是低延迟音频制作。编辑:我认为您可以将设备本身视为流。所以它就像一个 IO 连接,如果这有意义的话,音频被“记录”在接收器上。
  • 不,通过路由器。根据研究,我猜你需要一个相当耐用的声卡才能使用 ASIO,而不仅仅是 ASIO4All。

标签: c# audio codec


【解决方案1】:

您的延迟问题可能不是来自您选择的编解码器,而是来自您选择的音频 API。 WinMM 和 DirectSound API 相当古老,正如 NAudio Libray 的创建者 Mark Heath 所指出的那样:

WinMM - 这些是已经存在多年的 API(例如 waveOut... 和 waveIn... 函数)。它们的主要限制是延迟很差(很难在没有丢包的情况下低于 50 毫秒)。

DirectSound - 有其用途,尤其是用于游戏开发,但微软似乎也在逐步淘汰它。

What's up with WASAPI? - Mark Heath

如果您使用 Window 7 或更高版本,我建议您改用 WASAPI。此 API 已包含在 NAudio 中,如 WinMM 和 DirectSound,它将帮助您实现低延迟的音频传输。

另外,Asio4All 也是一个很好的解决方案。但是,根据我的经验,如果您想以编程方式将特定音频流重定向到系统上的特定输出设备,Asio4All 将不适合(在您的代码中,每个设备看起来都像一个,您稍后在 Asio4All GUI 中配置音频流重新分区)。

你会在这里找到一个有趣的回顾:NAudio Output Devices - Mark Heath

【讨论】:

    【解决方案2】:

    奇怪的是,延迟出现在客户端。在尝试了各种设置组合后,我最终决定给DirectSoundOut 之前而不是WaveOut。我震惊地发现延迟大幅下降。我想我将来会使用它。

            dso= new DirectSoundOut();         //Direct Sound Removed nearly all latency
            //WaveOut waveOut = new WaveOut();
            waveProvider = new BufferedWaveProvider(codec.RecordFormat);
    
            //WaveOut.Init(waveProvider);
            //WaveOut.Play();
            dso.Init(waveProvider);
            dso.Play();
    

    【讨论】:

      猜你喜欢
      • 2012-09-16
      • 2013-06-12
      • 2019-01-04
      • 1970-01-01
      • 1970-01-01
      • 2018-09-02
      • 1970-01-01
      • 2015-12-28
      • 1970-01-01
      相关资源
      最近更新 更多