使用FFMPEG / FFMediaElement(FFME)在WPF应用程序中以低延迟播放RTSP

时间:2018-08-17 12:14:58

标签: c# wpf ffmpeg rtsp

我正尝试使用FFMediaElement(基于FFmpeg的FFME,WPF MediaElement替换)组件在WPF应用程序中播放RSTP实时视频。

我与相机的连接良好,我想以最小的可用延迟进行播放。

我通过将 1 10 11 100 101 110 111 1000 更改为最小值来减少了等待时间:

ProbeSize

但是,自流开始以来,我仍然有大约1秒钟的延迟。我的意思是,当我开始播放时,我必须等待1秒钟直到视频出现,然后才有1秒钟的延迟。

我还尝试更改以下参数:

private void Media_OnMediaInitializing(object Sender, MediaInitializingRoutedEventArgs e)
{
  e.Configuration.GlobalOptions.ProbeSize = 32;
}

但是没有结果。

我测量了FFmpeg输出线之间的时间间隔(第一栏中的数字是从上一行经过的时间,毫秒)

e.Configuration.GlobalOptions.EnableReducedBuffering = true;
e.Configuration.GlobalOptions.FlagNoBuffer = true;
e.Configuration.GlobalOptions.MaxAnalyzeDuration = TimeSpan.Zero;

因此,“同步缓冲”过程最多花费的时间最多。

是否有FFmpeg的任何参数可以减小缓冲区的大小?

2 个答案:

答案 0 :(得分:1)

我不知道这是否适用于WPF,但是我使用此代码来减少使用带有WIN32 API的C ++的Microsoft H.264解码器的延迟。但是即使这样,我仍然会在启动时出现短暂的延迟(估计为0.5s到1s),但它比默认值要好。解码器在开始吐出之前仍会吸收一些传入的数据包。不确定是否会改善您的1秒延迟。这是一些代码,可让您了解其中涉及的内容。

IMFTransform* pDecoderTransform;
// ...Set up pDecoderTransform
ICodecAPI* mpCodecAPI = NULL;
hr = pDecoderTransform->QueryInterface(IID_PPV_ARGS(&mpCodecAPI));

VARIANT var;
var.boolVal = VARIANT_TRUE;
hr = mpCodecAPI->SetValue(&CODECAPI_AVLowLatencyMode, &var);

答案 1 :(得分:0)

我是FFME的作者。这是一个常见的问题。除了MediaInitializing事件中的容器配置选项外,您还可以处理MediaOpening事件并更改以下选项:(仅适用于4.1.280及更高版本)

    // You can render audio and video as it becomes available but the downside of disabling time
    // synchronization is that video and audio will run on their own independent clocks.
    // Do not disable Time Sync for streams that need synchronized audio and video.
    e.Options.IsTimeSyncDisabled =
        e.Info.Format == "libndi_newtek" ||
        e.Info.InputUrl.StartsWith("rtsp://uno");

    // You can disable the requirement of buffering packets by setting the playback
    // buffer percent to 0. Values of less than 0.5 for live or network streams are not recommended.
    e.Options.MinimumPlaybackBufferPercent = e.Info.Format == "libndi_newtek" ? 0 : 0.5;

    // The audio renderer will try to keep the audio hardware synchronized
    // to the playback position by default.
    // A few WMV files I have tested don't have continuous enough audio packets to support
    // perfect synchronization between audio and video so we simply disable it.
    // Also if time synchronization is disabled, the recommendation is to also disable audio synchronization.
    Media.RendererOptions.AudioDisableSync =
        e.Options.IsTimeSyncDisabled ||
        e.Info.InputUrl.EndsWith(".wmv");