Gstreamer:即时增加和减少延迟

Gstreamer: increase and decrease delay on-the-fly

我有一个 GStreamer 管道来播放来自 RTSP 源的实时视频。我希望用户能够增加/减少延迟。我的方法是拥有一个 queue 元素并操纵其 min-threshold-time 参数。

这似乎在开始时有效。例如延迟 10 秒,管道开始冻结,并在 10 秒后继续。但如果我操纵时间,什么也不会发生。我也尝试过其他参数,例如 max-size-time,但没有成功。 leaky 参数导致视频不稳定且质量差。

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

我正在使用的管道:

gst-launch-1.0 rtspsrc location=<...> ! rtph264depay ! h264parse ! capsfilter caps=video/x-h264 ! avdec_h264 ! videoconvert ! queue min-threshold-delay=<delay> ! autovideosink

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

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

管道:

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

其中:

  • $DELAY = gst 时间单位的视频延迟
  • $MAX_DELAY = gst 时间单位的最大视频延迟
  • $SMALL_DELAY = 最小延迟,例如一毫秒,以 gst 时间单位表示

策略是有两个队列,第一个充当缓冲区,第二个充当平衡器,确保所有消息都被延迟正好 $DELAY 时间量。这无法使用一个队列来完成。

运行时间:

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

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