Video streaming Gstreamer:动态增加和减少延迟

Video streaming Gstreamer:动态增加和减少延迟,video-streaming,delay,gstreamer,Video Streaming,Delay,Gstreamer,我有一个GStreamer管道来播放来自RTSP源的实时视频。我希望用户能够增加/减少延迟。我的方法是使用队列元素并操作其最小阈值时间参数 这似乎在一开始就奏效了。例如,延迟10秒时,管道开始冻结,并在10秒后继续。但是如果我操纵时间,什么也不会发生。我也尝试过其他参数,比如max size time,但运气不佳泄漏参数导致视频抖动和质量差 目前我正在停止并重新启动管道,这看起来很糟糕 我正在使用的管道: gst-launch-1.0 rtspsrc location=<...> !

我有一个GStreamer管道来播放来自RTSP源的实时视频。我希望用户能够增加/减少延迟。我的方法是使用
队列
元素并操作其
最小阈值时间
参数

这似乎在一开始就奏效了。例如,延迟10秒时,管道开始冻结,并在10秒后继续。但是如果我操纵时间,什么也不会发生。我也尝试过其他参数,比如
max size time
,但运气不佳<代码>泄漏参数导致视频抖动和质量差

目前我正在停止并重新启动管道,这看起来很糟糕

我正在使用的管道:

gst-launch-1.0 rtspsrc location=<...> ! rtph264depay ! h264parse ! capsfilter caps=video/x-h264 ! avdec_h264 ! videoconvert ! queue min-threshold-delay=<delay> ! autovideosink
gst-launch-1.0 rtspsrc位置=!rtph264depay!h264parse!capsfilter caps=视频/x-h264!avdec_h264!视频转换!队列最小阈值延迟=!自动视频接收器

是否有命令强制队列刷新帧、其他更合适的元素或其他一些技巧来完成此任务?

成功了。以下是我的解决方案:

管道:

rtspsrc location=<...> ! rtph264depay ! queue max-size-buffers=0 max-size-bytes=0 max-size-time=$MAX_DELAY ! queue max-size-time=$SMALL_DELAY min-threshold-time=$DELAY ! decodebin ! autovideosink
rtspsrc位置=!rtph264depay!队列最大大小缓冲区=0最大大小字节=0最大大小时间=$max\u延迟!队列最大大小时间=$SMALL\u延迟最小阈值时间=$DELAY!德克宾!自动视频接收器
其中:

  • $DELAY=以gst时间单位表示的视频延迟
  • $MAX_DELAY=以gst时间单位表示的最大视频延迟
  • $SMALL_DELAY=以gst时间单位表示的最小延迟,例如一毫秒
该策略是有两个队列,其中第一个作为缓冲区,第二个作为平衡器,确保所有消息的延迟时间正好为$DELAY。这不能使用一个队列来完成

运行时:

当需要更改延迟时,在第二个队列上更改$delay值。在此之后,需要使用新延迟作为延迟向管道发送延迟事件。这会导致管道冻结片刻(如果延迟增加),或快进以赶上(如果延迟减少)


通过读取第一个队列上的current level time属性并将其与设置的延迟进行比较,可以获得缓冲状态。

暂停更改参数并播放如何?我不确定仅仅通过设置参数来动态更改元素参数是否有效-也许你将不得不像你@otopolsky时那样进行一些pad阻塞等:你的建议是一种改进。当增加延迟时,暂停和重新播放确实有效,但当减少延迟时,什么也不会发生。很高兴能提供一点帮助,您的解决方案使用延迟事件非常先进。。很好,doneHi,您究竟如何将延迟事件发送到管道?从命令行?谢谢@herrfz事件不能在命令行中发送,因为它用于创建静态管道和更动态的管道操作,您必须使用编程语言来访问gstreamer API。