为建立中文知识库加块砖 ——中科大胡不归
问题描述
使用gstreamer,如何查看并同时录制一个来自摄像头的UDP推流?
解决办法
关键代码
gst-launch-1.0 udpsrc ! application/x-rtp ! rtpjitterbuffer ! rtph264depay ! decodebin ! tee name=t \
! queue leaky=1 ! clockoverlay ! autovideosink sync=false t. ! queue ! videoconvert \
! x264enc ! mpegtsmux ! filesink location=e:/h1.mp4
方法分析
application/x-rtp两个element必须通过pad才能连接起来,pad拥有当前element能处理数据类型的能力(capabilities),会在连接时通过比较src pad和sink pad中所支持的能力,来选择最恰当的数据类型用于传输,如果element不支持,程序会直接退出。在element通过pad连接成功后,数据会从上一个element的src pad传到下一个element的sink pad然后进行处理。 当element支持多种数据处理能力时,我们可以通过Cap来指定数据类型。 例如,下面的命令通过Cap指定了视频的宽高,videotestsrc会根据指定的宽高产生相应数据:
gst-launch-1.0 videotestsrc ! "video/x-raw,width=1280,height=720" ! autovideosink
-
rtph264depayUDP播放需要根据发送端数据源封装格式来决定采用哪些Gstreamer插件,如果进行了RTP封装,则需要先用rtph264depay进行解包,如果包含自定义帧头的情况,应该编程对帧头进行处理,不然会显示异常,比如部分花屏现象。 -
tee使用tee命令分支管道数据。 -
queue可以理解为gstreamer的线程