2015-10-02 148 views
1

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

这似乎开始工作。例如延迟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 

是否有一个命令来强制队列冲洗框架,其他的一些元素更适合,或者一些其他技巧来做到这一点?

+1

暂停更改参数和播放怎么样?我不确定是否动态更改元素参数只需设置参数即可使用 - 也许您将不得不做一些填充块阻塞等,就像您[动态改变管道]时一样(http://gstreamer.freedesktop.org /data/doc/gstreamer/head/manual/html/section-dynamic-pipelines.html) – nayana

+0

@otopolsky:您的建议是一项改进。暂停和重新播放的确能起作用,但是当延迟时间减少时,什么都不会发生。 –

+0

很高兴能有所帮助,你的解决方案是相当先进的使用延迟事件..很好地完成 – nayana

回答

1

得到它的工作。这里是我的解决方案:

管道:

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在消费税单位时间=最大的视频延迟的延迟
  • $ SMALL_DELAY =最小延迟,例如以毫秒为单位,单位gst时间单位

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

运行时间:

当需要改变的延迟,则$延迟值在第二队列改变。在此之后,流水线需要发送一个延迟事件使用新的延迟作为延迟。这导致管道暂时冻结(如果延迟增加),或者快速前进以追上(如果延迟减少)。

通过读取第一个队列的当前级别时间属性并将其与设置的延迟进行比较,可以获得缓冲状态。

+0

嗨,你怎么发送延迟事件到管道?从命令行?谢谢! – herrfz

+0

@herrfz事件不能在命令行中发送,因为它用于创建静态管道,对于更动态的管道操作,您将不得不使用编程语言来访问gstreamer API。 –