Gstreamer:即时增加和减少延迟

时间:2015-10-02 13:16:50

标签: video-streaming delay gstreamer

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

这似乎在开始时起作用。例如,延迟10秒,管道开始冻结,并在10秒后继续。但如果我操纵时间,没有任何反应。我也试过了其他参数,比如min-threshold-time,没有运气。 max-size-time参数会导致视频不稳定且质量不佳。

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

我正在使用的管道:

leaky

是否有命令强制队列刷新帧,其他一些元素更合适,或者其他一些技巧可以实现这一点?

1 个答案:

答案 0 :(得分:2)

搞定了。这是我的解决方案:

管道:

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属性并将其与设置的延迟进行比较来获得缓冲状态。