我正在创建一种实时视频流应用程序并使用许多不同的库。我正在使用 NAudio用于在音频流进入时解压缩。我在他们的讨论板this中发现了我使用过的线程;
BufferedWaveProvider mybufferwp = null;
WaveOut wo = new WaveOut();
WaveFormat wf = new WaveFormat(16000, 1);
void MainWindow()
{
_audioClient = new AudioClient();
_audioClient.AudioFrameReady += _audioClient_AudioFrameReady;
_audioClient.Connect(parent.TempIp, parent.AudioPort);
mybufferwp = new BufferedWaveProvider(wf);
mybufferwp.BufferDuration = TimeSpan.FromMinutes(5);
wo.Init(mybufferwp);
wo.Play();
}
void _audioClient_AudioFrameReady(object sender, AudioFrameReadyEventArgs e)
{
if (mybufferwp != null)
{
mybufferwp.AddSamples(e.AudioFrame.AudioData, 0, e.AudioFrame.AudioData.Length);
}
}
我的问题是音频稍有延迟。不是很多,但它很明显,我希望可能有一些我可以做的事情,以使它与我的视频源更加同步,这几乎完全是实时的。
额外信息 AudioClient来自Kinect Service,它允许我发送和接收Kinect Camera Data。
答案 0 :(得分:1)
您正在处理的问题称为延迟。此系统中有两个延迟源。第一个是记录缓冲区的大小。 Kinect将填充音频缓冲区,然后提升其AudioFrameReady事件。缓冲区大小(以毫秒为单位)越大,延迟时间越长。我不知道Kinect是否为您提供了最小化此缓冲区大小的选项。
然后在播放方面有更多缓冲。 NAudio的WaveOut默认设置是两个缓冲区,每个缓冲区为100毫秒 - 一个缓存,另一个填充。选择此值以便平滑播放 - 使缓冲区太小并且播放可能会断断续续。但是,它是完全可配置的,所以我建议减少WaveOut缓冲区大小,直到播放开始分解。