0

我正在创建一种实时视频流应用程序并使用许多不同的库。我正在使用 NAudio在音频流进入时对其进行解包。我在他们的讨论板上发现了我这样使用的这个线程;

    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 服务,它允许我发送和接收 Kinect 相机数据。

4

1 回答 1

1

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

然后在播放端有更多的缓冲。NAudio 对 WaveOut 的默认设置是两个缓冲区,每个缓冲区为 100 毫秒——一个被播放,另一个被填充。选择此值是为了平滑播放 - 使缓冲区太小,播放可能会卡顿。但是,它是完全可配置的,因此我建议减少 WaveOut 缓冲区大小,直到播放开始中断。

于 2013-06-17T08:13:13.343 回答