2

我正在编写一个 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);
        }
    }
4

2 回答 2

1

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

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

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

WASAPI 怎么了?- 马克希思

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

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

你会在这里找到一个有趣的回顾:NAudio 输出设备 - Mark Heath

于 2016-08-05T11:14:09.810 回答
0

奇怪的是,延迟出现在客户端。在尝试了各种设置组合后,我最终决定给出DirectSoundOutago 而不是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();
于 2013-06-27T22:18:53.693 回答