我有一个GStreamer管道来播放来自RTSP源的实时视频。我希望用户能够增加/减少延迟。我的方法是使用async
元素并操纵其queue
参数。
这似乎在开始时起作用。例如,延迟10秒,管道开始冻结,并在10秒后继续。但如果我操纵时间,没有任何反应。我也试过了其他参数,比如min-threshold-time
,没有运气。 max-size-time
参数会导致视频不稳定且质量不佳。
目前我正在停止并重新启动管道,这看起来很糟糕。
我正在使用的管道:
leaky
是否有命令强制队列刷新帧,其他一些元素更合适,或者其他一些技巧可以实现这一点?
答案 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的时间。使用一个队列无法实现这一点。
运行时:
当需要更改延迟时,在第二个队列上更改$ DELAY值。在此之后,需要使用新延迟作为延迟向管道发送延迟事件。这会导致管道冻结片刻(如果延迟增加),或者快速赶上(如果延迟减少)。
可以通过读取第一个队列上的current-level-time属性并将其与设置的延迟进行比较来获得缓冲状态。