管道Gstreamer视频流延迟

时间:2013-06-07 05:59:56

标签: gstreamer

在gstreamer管道中将解复用的,h264解码的输出发送到autovideosink之前,是否有可能给出一些延迟。如果是这样,任何人都可以发布样本管道。 我使用的管道是 udpsrc port = 5000! mpegtsdemux name = demux!排队! ffdec_h264! ffmpegcolorspace! autovideosink demux。 !排队! ffdec_mp3! audioconvert! alsasink demux

在这种情况下,一旦在upd-port 5000接收到流,它将在解复用 - 排队 - 解码后立即开始播放。是否有任何可能的延迟说60秒befoe发送到autovideosink实际播放它。有任何Gstreamer插件/元素来做到这一点。

2 个答案:

答案 0 :(得分:4)

您可能需要查看queue的参数(运行gst-inspect queue):

max-size-buffers    : Max. number of buffers in the queue (0=disable)
                      flags: lesbar, schreibbar
                      Unsigned Integer. Range: 0 - 4294967295 Default: 200
max-size-bytes      : Max. amount of data in the queue (bytes, 0=disable)
                      flags: lesbar, schreibbar
                      Unsigned Integer. Range: 0 - 4294967295 Default: 10485760
max-size-time       : Max. amount of data in the queue (in ns, 0=disable)
                      flags: lesbar, schreibbar
                      Unsigned Integer64. Range: 0 - 18446744073709551615 Default: 1000000000
min-threshold-buffers: Min. number of buffers in the queue to allow reading (0=disable)
                      flags: lesbar, schreibbar
                      Unsigned Integer. Range: 0 - 4294967295 Default: 0
min-threshold-bytes : Min. amount of data in the queue to allow reading (bytes, 0=disable)
                      flags: lesbar, schreibbar
                      Unsigned Integer. Range: 0 - 4294967295 Default: 0
min-threshold-time  : Min. amount of data in the queue to allow reading (in ns, 0=disable)
                      flags: lesbar, schreibbar
                      Unsigned Integer64. Range: 0 - 18446744073709551615 Default: 0

通过设置min-threshold-time,您可以将输出延迟n纳秒 我刚刚尝试使用我的网络摄像头并且工作正常(延迟60秒):

gst-launch v4l2src ! queue max-size-buffers=0 max-size-time=0 max-size-bytes=0 min-threshold-time=60000000000 ! autovideosink

请注意,我已将max-size-*参数设置为0,因为如果队列在满足阈值之前填满,则不会从队列中获取数据。

请记住,对已解码的视频流进行排队可能会导致大量内存使用。 使用编码的udpsrc,我建议延迟编码的h264流。您可能需要以字节为单位设置阈值而不是纳秒(我不认为队列对编码数据了解得足以猜测比特率)。

答案 1 :(得分:2)

我的解决方案是将延迟添加到autoaudiosink。一个漂亮的功能,隐藏称为ts-offset:

$ gst-launch-1.0 souphttpsrc location=http://server:10000/ ! queue \
    max-size-bytes=1000000000 max-size-buffers=0 max-size-time=0 ! \
    decodebin ! autoaudiosink ts-offset=500000000

min-threshold- *不适合我。

延迟有效。禁用同步也有效:

$ gst-launch-1.0 souphttpsrc location=http://server:10000/ ! \
    decodebin ! autoaudiosink sync=false

对于音乐,就像我正在使用它一样,同步并不重要,除了在改变曲目时让下一首歌早晚出现是很好的。所以我仍然倾向于半秒延迟。

通常,禁用同步时,流会慢慢失去同步。对于实时生成数据的实时流,可以通过要求队列转储额外数据来维护流同步:

gst-launch-1.0 souphttpsrc location=http://server:10000/ ! \
    queue max-size-bytes=65536 max-size-buffers=0 max-size-time=0 \
    leaky=downstream ! decodebin ! autoaudiosink sync=false

这使流在服务器上首次提供数据时保持同步到64KiB以内。这最终成为我的首选解决方案,因为我正在通过同一wifi网络上的计算机的声卡实时生成数据流。这仅适用于直播。如果已经预先确定了流的数据,则这将不起作用,在这种情况下,将尽快下载整个流,导致整个事情在快进中或多或少地播放。