GStreamer 打开活动流(播放)
GStreamer open active stream (playing)
我正在接收视频流(mpegts
over rtp
over udp
)。目前我需要在“streamer”gstreamer 命令之前启动“receiver”。有没有办法在活动时接收流?
所以我不需要在流媒体之前启动接收器。
我可能无法选择流的开始或停止时间,因此重要的是即使已经在播放也能接收到它。
gst-launch-1.0 -v udpsrc port=XXXX \
caps="application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)MP2T, payload=(int) 33" \
! queue leaky=upstream min-threshold-time=10000000 ! rtpmp2tdepay ! tsparse ! tsdemux name=DEM \
DEM. ! video/x-h264 ! queue ! decodebin ! queue autovideosink \
DEM. ! queue ! aacparse ! decodebin ! audioconvert ! queue ! autoaudiosink
非常感谢
编辑
所以多亏了@SeB,我才能让它工作。重点是:
- 使用
h264parse config-interval=1
每秒发送一次配置。
- 使用
rtpjitterbuffer latency=500
重新排序rtpmp2tdemux
之前的rtp流数据包
- 不要在流式传输命令中的
tsmux
之后使用 tsparse
。如果我这样做,很多帧丢失或损坏,结果我得到一些非常不稳定的东西。
尽管如此,
- 我不需要
videoconvert
元素
- 我还在用
autovideosink
- 我用真正的管道
替换了decodebin
结果
生成的管道看起来像这样:
gst-launch-1.0 -v udpsrc port=5000 \
caps="application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)MP2T, payload=(int) 33" \
! queue leaky=upstream min-threshold-time=10000000 \
! rtpjitterbuffer latency=500 ! rtpmp2tdepay
! tsparse ! tsdemux name=DEM \
DEM. ! video/x-h264 ! queue ! h264parse ! avdec_h264 ! queue autovideosink \
DEM. ! queue ! aacparse ! avdec_aac \
! audioresample ! audioconvert ! queue ! autoaudiosink
最简单的方法是让发送方定期发送配置,以便您的接收方可以设置。有多种方法可以做到这一点:
# Using config-interval property of h264parse:
gst-launch-1.0 videotestsrc ! x264enc ! h264parse config-interval=1 ! mpegtsmux ! tsparse ! rtpmp2tpay ! udpsink port=5000
# Using insert-vui in x264enc:
gst-launch-1.0 videotestsrc ! x264enc insert-vui=1 ! h264parse ! mpegtsmux ! tsparse ! rtpmp2tpay ! udpsink port=5000
# For NVIDIA encoder:
gst-launch-1.0 videotestsrc ! nvvidconv ! nvv4l2h264enc insert-sps-pps=1 ! h264parse ! mpegtsmux ! tsparse ! rtpmp2tpay ! udpsink port=5000
然后您可以随时获取视频(虽然设置和显示可能需要几秒钟),例如(此处为 Linux 运行 X):
gst-launch-1.0 -v udpsrc port=5000 ! application/x-rtp,media=video,encoding-name=MP2T,clock-rate=90000,payload=33 ! rtpjitterbuffer latency=300 ! rtpmp2tdepay ! tsdemux ! h264parse ! avdec_h264 ! videoconvert ! xvimagesink
我正在接收视频流(mpegts
over rtp
over udp
)。目前我需要在“streamer”gstreamer 命令之前启动“receiver”。有没有办法在活动时接收流?
所以我不需要在流媒体之前启动接收器。
我可能无法选择流的开始或停止时间,因此重要的是即使已经在播放也能接收到它。
gst-launch-1.0 -v udpsrc port=XXXX \
caps="application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)MP2T, payload=(int) 33" \
! queue leaky=upstream min-threshold-time=10000000 ! rtpmp2tdepay ! tsparse ! tsdemux name=DEM \
DEM. ! video/x-h264 ! queue ! decodebin ! queue autovideosink \
DEM. ! queue ! aacparse ! decodebin ! audioconvert ! queue ! autoaudiosink
非常感谢
编辑
所以多亏了@SeB,我才能让它工作。重点是:
- 使用
h264parse config-interval=1
每秒发送一次配置。 - 使用
rtpjitterbuffer latency=500
重新排序rtpmp2tdemux
之前的rtp流数据包
- 不要在流式传输命令中的
tsmux
之后使用tsparse
。如果我这样做,很多帧丢失或损坏,结果我得到一些非常不稳定的东西。
尽管如此,
- 我不需要
videoconvert
元素 - 我还在用
autovideosink
- 我用真正的管道 替换了
decodebin
结果
生成的管道看起来像这样:
gst-launch-1.0 -v udpsrc port=5000 \
caps="application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)MP2T, payload=(int) 33" \
! queue leaky=upstream min-threshold-time=10000000 \
! rtpjitterbuffer latency=500 ! rtpmp2tdepay
! tsparse ! tsdemux name=DEM \
DEM. ! video/x-h264 ! queue ! h264parse ! avdec_h264 ! queue autovideosink \
DEM. ! queue ! aacparse ! avdec_aac \
! audioresample ! audioconvert ! queue ! autoaudiosink
最简单的方法是让发送方定期发送配置,以便您的接收方可以设置。有多种方法可以做到这一点:
# Using config-interval property of h264parse:
gst-launch-1.0 videotestsrc ! x264enc ! h264parse config-interval=1 ! mpegtsmux ! tsparse ! rtpmp2tpay ! udpsink port=5000
# Using insert-vui in x264enc:
gst-launch-1.0 videotestsrc ! x264enc insert-vui=1 ! h264parse ! mpegtsmux ! tsparse ! rtpmp2tpay ! udpsink port=5000
# For NVIDIA encoder:
gst-launch-1.0 videotestsrc ! nvvidconv ! nvv4l2h264enc insert-sps-pps=1 ! h264parse ! mpegtsmux ! tsparse ! rtpmp2tpay ! udpsink port=5000
然后您可以随时获取视频(虽然设置和显示可能需要几秒钟),例如(此处为 Linux 运行 X):
gst-launch-1.0 -v udpsrc port=5000 ! application/x-rtp,media=video,encoding-name=MP2T,clock-rate=90000,payload=33 ! rtpjitterbuffer latency=300 ! rtpmp2tdepay ! tsdemux ! h264parse ! avdec_h264 ! videoconvert ! xvimagesink