实时音频流延迟

时间:2013-06-16 18:41:03

标签: kinect audio-streaming naudio

我正在创建一种实时视频流应用程序并使用许多不同的库。我正在使用 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。

1 个答案:

答案 0 :(得分:1)

您正在处理的问题称为延迟。此系统中有两个延迟源。第一个是记录缓冲区的大小。 Kinect将填充音频缓冲区,然后提升其AudioFrameReady事件。缓冲区大小(以毫秒为单位)越大,延迟时间越长。我不知道Kinect是否为您提供了最小化此缓冲区大小的选项。

然后在播放方面有更多缓冲。 NAudio的WaveOut默认设置是两个缓冲区,每个缓冲区为100毫秒 - 一个缓存,另一个填充。选择此值以便平滑播放 - 使缓冲区太小并且播放可能会断断续续。但是,它是完全可配置的,所以我建议减少WaveOut缓冲区大小,直到播放开始分解。