Gstreamer 带延迟的流水线Gstremer视频流

Gstreamer 带延迟的流水线Gstremer视频流,gstreamer,Gstreamer,在将解复用的h264解码输出发送到gstreamer管道中的autovideosink之前,是否可能在这两者之间提供一些延迟。如果是这样,任何人都可以发布示例管道来实现这一点。 我使用的管道是 udpsrc端口=5000!mpegtsdemux name=demux!队列ffdec_h264!ffmpegcolorspace!自动视频接收器分接器!队列ffdec_mp3!音频转换!alsasink demux 在这种情况下,一旦在upd端口5000接收到流,它将在解复用队列解码后立即开始播放。是

在将解复用的h264解码输出发送到gstreamer管道中的autovideosink之前,是否可能在这两者之间提供一些延迟。如果是这样,任何人都可以发布示例管道来实现这一点。 我使用的管道是 udpsrc端口=5000!mpegtsdemux name=demux!队列ffdec_h264!ffmpegcolorspace!自动视频接收器分接器!队列ffdec_mp3!音频转换!alsasink demux


在这种情况下,一旦在upd端口5000接收到流,它将在解复用队列解码后立即开始播放。是否有延迟的可能,比如说在发送到实际播放的autovideosink之前60秒。是否有任何Gstreamer插件/元素来执行此操作。

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

通过设置
min threshold time
可以将输出延迟n纳秒。
我刚刚用我的网络摄像头尝试了一下,它成功了(延迟60秒):

请注意,我已将
max size-*
参数设置为0,因为如果队列在达到阈值之前填满,您将无法从队列中获取数据

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

我的解决方案是将延迟添加到autoaudiosink。一个漂亮的特性,隐晦地称为ts偏移:

$ 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网络上的计算机声卡实时生成数据流。这仅适用于实时流。如果流的数据已预先确定,则此操作将不起作用,在这种情况下,将尽快下载整个流,从而使整个内容或多或少以快进方式播放。

谢谢您的回答。我想试试你的帖子。用来延迟视频流。作为旁注,如果你在视频上使用时间覆盖,那么在视频之后设置队列,这样时间就可以正确显示。这对我根本不起作用。看看我的问题。
$ 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