我正尝试使用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的任何参数可以减小缓冲区的大小?
答案 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");