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