0%

GStreamer添加流延时操作

GStreamer添加流延时操作

手动添加直播流延时,延时时间可以控制。输入源为测试视频、桌面截屏、rtmp视频流

测试视频测试通过

1
2
3
4
5
6
//默认的几种模式 videotestsrc  延时通过 音频也通过 \
gst-launch-1.0 videotestsrc is-live=true ! videoconvert ! x264enc bitrate=1000 tune=zerolatency ! video/x-h264 ! h264parse ! video/x-h264 ! \
queue ! flvmux name=mux ! \
queue max-size-buffers=0 max-size-bytes=0 max-size-time=90000000000 ! queue max-size-buffers=0 max-size-time=90000000000 min-threshold-time=6000000000 ! \
rtmpsink location='rtmp://192.168.18.188/live/999' \
audiotestsrc is-live=true ! audioconvert ! audioresample ! audio/x-raw,rate=48000 ! voaacenc bitrate=96000 ! audio/mpeg ! aacparse ! audio/mpeg, mpegversion=4 ! mux.

输入源为videotestsrc,包括多种模式显示不同视频。输入不同视频的时候在videotestsrc后面跟上参数pattern=snow,可以选择不听的图案,集体包括那些图案参考官方文档。

videotestsrc官方文档

flvmux将不同的流复合到flv文件中,这里是将不同的流混合后输出为rtmp流,可以理解为音频流和视频流的混合。

videoconvert后面跟的是视频格式

flvmux name=mux后面的是添加延时的操作。

1
2
queue max-size-buffers=0 max-size-bytes=0 max-size-time=$MAX_DELAY ! \
queue max-size-time=$SMALL_DELAY min-threshold-time=$DELAY
  • $DELAY = 延时时间
  • $MAX_DELAY = 最多延时时间
  • $SMALL_DELAY = 最小延时时间

测试后发现,$DELAY是起作用的参数。

该策略是具有两个队列,其中第一个作为缓冲区,第二个队列作为一个平衡器,确保所有消息都被精确延迟$DELAY时间。 这不能使用一个队列来完成。

当需要更改延迟时,$DELAY值将在第二个队列中更改。 之后,管道需要使用新的延迟作为延迟发送延迟事件。 这会导致流水线冻结一段时间(如果延迟增加),或快速向前追赶(如果延迟减少)。

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

stackoverflow参考资料

rtmpsink:是把视频流达到后面的rtmp地址上去。

这里的Sink Element是媒体处理pipline的终点。可以理解成最后收集媒体流的地方。

更多资料参考rtmpsink官方文档

audiotestsrc这里和video类似,都是测试用的。

截取屏幕打流测试通过

1
2
3
4
5
6
//屏幕打流延时 15秒延时 通过 加上音频也通过
gst-launch-1.0 ximagesrc startx=0 use-damage=0 ! \
videoconvert ! x264enc bitrate=1000 tune=zerolatency ! video/x-h264 ! h264parse ! video/x-h264 ! \
queue ! flvmux name=mux ! queue max-size-buffers=0 max-size-bytes=0 max-size-time=90000000000 ! queue max-size-buffers=0 max-size-time=90000000000 min-threshold-time=15000000000 ! \
rtmpsink location='rtmp://192.168.18.188/live/999' \
audiotestsrc is-live=true ! audioconvert ! audioresample ! audio/x-raw,rate=48000 ! voaacenc bitrate=96000 ! audio/mpeg ! aacparse ! audio/mpeg, mpegversion=4 ! mux.

拉取rtmp流打流到新的地址测试通过(不加延时)

1
2
//拉取rtmp流不加延时通过   decodebin 要加这个 然后音视频合并
gst-launch-1.0 -v rtmpsrc location=rtmp://192.168.18.188/live/1 ! decodebin ! x264enc bitrate=1000 tune=zerolatency ! video/x-h264 ! h264parse ! video/x-h264 ! ! flvmux ! rtmpsink location='rtmp://192.168.18.188/live/999'

拉取rtmp流打流到新的地址测试通过(加延时无音频)

1
2
3
4
5
6
// 拉取rtmp流加延时 通过
gst-launch-1.0 -v rtmpsrc location=rtmp://192.168.18.188/live/1 !
decodebin ! videoconvert ! x264enc bitrate=1000 tune=zerolatency ! video/x-h264 ! h264parse ! video/x-h264 !
queue ! flvmux streamable=true !
queue max-size-buffers=0 max-size-bytes=0 max-size-time=90000000000 ! queue max-size-buffers=0 max-size-time=90000000000 min-threshold-time=15000000000 !
rtmpsink location='rtmp://192.168.18.188/live/999'

拉取rtmp流打流到新地址测试通过(有延时音频同步)

1
2
3
4
5
6
//rtmp输入 视频 音频 flvdemux 后 flvmux 然后添加延时。 测试通过 
gst-launch-1.0 rtmpsrc location=rtmp://192.168.18.188/live/1 ! \
flvdemux name=mydemuxer flvmux name=mymuxer ! \
queue max-size-buffers=0 max-size-bytes=0 max-size-time=90000000000 ! queue max-size-buffers=0 max-size-time=90000000000 min-threshold-time=15000000000 !
queue ! rtmpsink location=rtmp://192.168.18.188/live/999 \
mydemuxer.audio ! queue ! mymuxer.audio mydemuxer.video ! queue ! mymuxer.video