我正在编写UDP局域网视频聊天系统,并且视频和音频流正常工作。但是我在音频中遇到了一点延迟(大约半秒钟),并且想知道哪些编解码器会提供最少的延迟。我正在使用NAudio(http://naudio.codeplex.com/),它允许我访问以下用于流式传输的编解码器;
我已经尝试过了,我没注意到很多不同。还有其他我应该下载并尝试减少延迟吗?我只会通过连接发送声音,但我并不是真的担心质量或背景噪音过多。
更新
我正在以这样的方式发送音频;
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);
}
}
答案 0 :(得分:1)
您的延迟问题可能不是来自您选择的编解码器,而是来自您的音频API选择。 WinMM和DirectSound API非常古老,正如NAudio Libray的创建者Mark Heath指出的那样:
WinMM - 这些是已经存在多年的API(例如waveOut ...和waveIn ...函数)。它们的主要限制是延迟很差(很难在没有辍学的情况下远低于50ms)。
DirectSound - 有其用途,特别是对于游戏开发,但似乎微软也在逐步淘汰它。
What's up with WASAPI? - Mark Heath
如果您使用的是Window 7或更高版本,我建议您使用 WASAPI 代替。此API已包含在NAudio中,如WinMM和DirectSound,它将帮助您实现低延迟音频传输。
此外, Asio4All 也是一个非常好的解决方案。但是,根据我的经验,如果您希望以编程方式将特定音频流重定向到系统上的特定输出设备,则Asio4All将不适合(在您的代码中,每个设备看起来都像一个,您稍后在Asio4All GUI中配置音频流重新分区)。 / p>
你会在这里找到一个有趣的回顾:NAudio Output Devices - Mark Heath
答案 1 :(得分:0)
奇怪的是,延迟出现在客户端。在尝试各种设置组合后,我最终决定提前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();