常?插件
- 1、Source
- 1.1、filesrc
- 1.2. videotestsrc
- 1.3. v4l2src
- 1.4. rtspsrc和rtspclientsink
- 2、 Sink
- 2.1. filesink
- 2.2. fakesink
- 2.3. xvimagesink
- 2.4. kmssink
- 2.5. waylandsink
- 2.6. rkximagesink
- 2.7. fpsdisplaysink
- 3 、視頻推流/拉流
- 3.1. 本地推流/拉流
- 3.1.1 USB攝像頭
- 3.1.2 ov8858 mipi攝像頭
- 3.2. RTSP推流/拉流
1、Source
GStreamer的Source插件用于生成和提供媒體數據流。它們可以從不同的數據源讀取音頻或視頻,比如文件、網絡、設備等。 常見的Source插件包括文件源(如 filesrc)、網絡源(如 tcpserversrc)、設備源(如 v4l2src),這些插件允許開發者靈活地構建多媒體管道, 以滿足不同的應用需求。通過配置Source插件,用戶可以輕松獲取和處理多種類型的媒體數據。
1.1、filesrc
從?件讀取數據,?例如下:
#創建/tmp/test
echo 666 > /tmp/test#讀取文件數據到/tmp/test2
gst-launch-1.0 filesrc location=/tmp/test ! filesink location=/tmp/test2#查看
cat /tmp/test2
1.2. videotestsrc
?成視頻數據,?例如下:
# 使?默認格式輸出視頻
gst-launch-1.0 videotestsrc ! xvimagesink
# 使?指定格式輸出視頻
gst-launch-1.0 videotestsrc ! "video/x-raw,width=1920,height=1080,format=(string)NV12" ! xvimagesink
1.3. v4l2src
從攝像頭獲取視頻數據,?例如下:
#如果不指定攝像頭編號,默認使用系統的第一個視頻設備/dev/video0
gst-launch-1.0 v4l2src ! video/x-raw,width=1920,height=1080,format=NV12 ! xvimagesink#如果需要使用特定的攝像頭,可以通過device屬性指定設備,例如
gst-launch-1.0 v4l2src device=/dev/video0 ! video/x-raw,width=1920,height=1080,format=NV12 ! xvimagesink
1.4. rtspsrc和rtspclientsink
rtspsrc和rtspclientsink是GStreamer中用于處理RTSP流的兩個不同元素。
rtspsrc:這是一個源元素,用于接收RTSP流。它可以從RTSP服務器拉取音視頻流,并將其傳遞給管道的下游元素進行處理。
rtspclientsink:這是一個接收元素,用于將處理后的音視頻流發送到RTSP服務器。
簡單來說,rtspsrc用于接收流,rtspclientsink用于發送流。
系統默認沒有安裝插件,需要進行安裝:
#安裝插件
sudo apt install gstreamer1.0-rtsp
具體使用方法,參考本章節推流、拉流部分。
2、 Sink
GStreamer的Sink插件用于接收和處理媒體數據流,通常用于輸出到不同的目標,例如文件、音頻設備、視頻顯示等。 常見的Sink插件包括文件接收器(如filesink)、音頻輸出(如 alsasink)、視頻顯示(如 ximagesink)。 這些插件使開發者能夠靈活地將媒體數據導出到所需的格式或設備,方便實現多媒體播放和錄制功能。
2.1. filesink
將收到的數據保存為?件,?例如下:
#創建/tmp/test
echo 666 > /tmp/test#讀取文件數據到/tmp/test2
gst-launch-1.0 filesrc location=/tmp/test ! filesink location=/tmp/test2#查看
cat /tmp/test2
2.2. fakesink
將收到的數據全部丟棄,?例如下:
gst-launch-1.0 filesrc location=/tmp/test ! fakesink
2.3. xvimagesink
視頻Sink,接收視頻并顯?,使?X11接口實現,?例如下:
gst-launch-1.0 videotestsrc ! xvimagesink
2.4. kmssink
視頻Sink,接收視頻并顯?,使?kms接口實現,需要獨占硬解圖層,?例如下:
gst-launch-1.0 videotestsrc ! kmssink
# 常?命令
connector-id #指定屏幕
plane-id #指定硬件圖層
render-rectangle #指定渲染范圍
2.5. waylandsink
視頻Sink,接收視頻并顯?,使?wayland接口實現,?例如下:
gst-launch-1.0 videotestsrc ! waylandsink
2.6. rkximagesink
視頻Sink,接收視頻并顯?,使?drm接口實現零拷?等功能,性能較好,但需要獨占硬解圖層。?例如下:
gst-launch-1.0 videotestsrc ! rkximagesink
2.7. fpsdisplaysink
視頻Sink,接收視頻并統計幀率,同時會將視頻中轉?下?級Sink顯?,?例如下:
#?志等級為TRACE(7)即可查看實時幀率,設置為DEBUG(5)則只顯?最?/最小幀率
GST_DEBUG=fpsdisplaysink:7 gst-play-1.0 --flags=3 --videosink="fpsdisplaysink \
video-sink=xvimagesink signal-fps-measurements=true text-overlay=false \
sync=false" test.mp4#信息輸出如下
Press 'k' to see a list of keyboard shortcuts.
Now playing /home/cat/test.mp4
0:00:00.111413754 7044 0x5580fc5d90 DEBUG fpsdisplaysink fpsdisplaysink.c:440:fps_display_sink_start:<fpsdisplaysink0> Use text-overlay? 0
Redistribute latency...
0:00:02.035048410 7044 0x7f6004e2d0 DEBUG fpsdisplaysink fpsdisplaysink.c:372:display_current_fps:<fpsdisplaysink0> Updated max-fps to 44.703224
0:00:02.036371046 7044 0x7f6004e2d0 DEBUG fpsdisplaysink fpsdisplaysink.c:376:display_current_fps:<fpsdisplaysink0> Updated min-fps to 44.703224
0:00:02.037667141 7044 0x7f6004e2d0 LOG fpsdisplaysink fpsdisplaysink.c:381:display_current_fps:<fpsdisplaysink0> Signaling measurements: fps:44.703224 droprate:0.000000 avg-fps:44.703224
0:00:02.552749637 7044 0x7f6004e2d0 DEBUG fpsdisplaysink fpsdisplaysink.c:372:display_current_fps:<fpsdisplaysink0> Updated max-fps to 46.356696
0:00:02.554009567 7044 0x7f6004e2d0 LOG fpsdisplaysink fpsdisplaysink.c:381:display_current_fps:<fpsdisplaysink0> Signaling measurements: fps:46.356696 droprate:0.000000 avg-fps:45.532539
3 、視頻推流/拉流
3.1. 本地推流/拉流
3.1.1 USB攝像頭
攝像頭接口為device=/dev/video9,需要先運行接收端命令,然后再運行服務端(注意如果是ssh需要指定export DISPLAY=:0環境變量)
#板卡接收端
gst-launch-1.0 udpsrc port=1234 ! "application/x-rtp, payload=96" ! rtph264depay ! decodebin ! autovideosink sync=false#板卡服務端測試1
gst-launch-1.0 v4l2src device=/dev/video9 ! video/x-raw,width=640,height=480,framerate=30/1 ! videoconvert ! video/x-raw,format=UYVY ! mpph264enc ! queue ! h264parse ! rtph264pay ! udpsink host=127.0.0.1 port=1234#板卡服務端測試2
gst-launch-1.0 v4l2src device=/dev/video9 ! image/jpeg ! mppjpegdec ! videoconvert ! video/x-raw,height=1080,width=1920,frame=30/1,format=NV12 ! mpph264enc ! queue ! h264parse ! rtph264pay ! udpsink host=127.0.0.1 port=1234
說明如下:
接收端,命令通過udpsrc從指定的端口(1234)接收RTP數據流,使用rtph264depay解封裝RTP數據,接著通過decodebin解碼視頻流,最后將解碼后的視頻輸出到自動選擇的視頻窗口(autovideosink)。
服務端測試1:使用v4l2src直接捕獲原始視頻流,輸出為YUYV格式,并進行H.264編碼,然后通過rtph264pay封裝成RTP數據包,最后使用udpsink將數據推送到指定的地址(127.0.0.1:1234)。
服務端測試2:同樣使用v4l2src,但輸入的是JPEG格式的圖像,通過解碼后再轉換成NV12格式,并進行H.264編碼,然后通過rtph264pay封裝成RTP數據包,最后使用udpsink將數據推送到指定的地址(127.0.0.1:1234)。
3.1.2 ov8858 mipi攝像頭
攝像頭接口為device=/dev/video0,需要先運行接收端命令,然后再運行服務端(注意如果是ssh需要指定export DISPLAY=:0環境變量)
#板卡接收端
gst-launch-1.0 udpsrc port=1234 ! "application/x-rtp, payload=96" ! rtph264depay ! decodebin ! autovideosink sync=false#板卡服務端測試1
gst-launch-1.0 v4l2src device=/dev/video0 ! video/x-raw,width=640,height=480,framerate=23/1 ! videoconvert ! video/x-raw,format=UYVY ! mpph264enc ! queue ! h264parse ! rtph264pay ! udpsink host=127.0.0.1 port=1234#板卡服務端測試2
gst-launch-1.0 v4l2src device=/dev/video0 ! video/x-raw,width=1280,height=960,framerate=23/1 ! videoconvert ! video/x-raw,format=NV12 ! mpph264enc ! queue ! h264parse ! rtph264pay ! udpsink host=127.0.0.1 port=1234
以上和usb相似,只是ov8858不支持輸出JPEG格式,測試1和測試2分辨率和格式不同。
3.2. RTSP推流/拉流
系統默認沒有安裝插件,需要進行安裝:
#安裝插件
sudo apt install gstreamer1.0-rtsp
推流前需要啟動RTSP服務器,需要運行mediamtx
訪問: mediamtx,下載mediamtx_vx.x.x_linux_arm64v8.tar.gz
將mediamtx_v1.9.1_linux_arm64v8.tar.gz傳到板卡解壓并運行:
#運行mediamtx
sudo ./mediamtx &#信息輸出如下
2024/09/18 16:24:54 INF MediaMTX v1.9.1
2024/09/18 16:24:54 INF configuration loaded from /home/cat/mediamtx.yml
2024/09/18 16:24:54 INF [RTSP] listener opened on :8554 (TCP), :8000 (UDP/RTP), :8001 (UDP/RTCP)
2024/09/18 16:24:54 INF [RTMP] listener opened on :1935
2024/09/18 16:24:54 INF [HLS] listener opened on :8888
2024/09/18 16:24:54 INF [WebRTC] listener opened on :8889 (HTTP), :8189 (ICE/UDP)
2024/09/18 16:24:54 INF [SRT] listener opened on :8890 (UDP)
將視頻流發送到RTSP服務器,簡單?例如下:
以下測試USB攝像頭,攝像頭接口為device=/dev/video9
gst-launch-1.0 v4l2src device=/dev/video9 ! image/jpeg ! mppjpegdec ! videoconvert ! video/x-raw,height=1080,width=1920,frame=30/1,format=NV12 ! tee name=t \
t. ! queue ! videoconvert ! autovideosink \
t. ! videoconvert ! mpph264enc ! queue ! h264parse ! rtspclientsink location=rtsp://127.0.0.1:8554/live
以下測試mipi攝像頭,攝像頭接口為device=/dev/video0
gst-launch-1.0 v4l2src device=/dev/video0 ! video/x-raw,width=1920,height=1080,framerate=23/1 ! tee name=t \
t. ! queue ! videoconvert ! autovideosink \
t. ! videoconvert ! mpph264enc ! queue ! h264parse ! rtspclientsink location=rtsp://127.0.0.1:8554/live
從RTSP服務器中獲取視頻流,簡單?例如下:
#指定為實際推流板卡ip
gst-launch-1.0 rtspsrc location=rtsp://192.168.103.101:8554/live ! rtph264depay ! h264parse ! mppvideodec ! xvimagesink
或者使用VLC工具,打開左上角媒體->打開網絡串流
然后根據推流板卡實際IP輸入RTSP地址
如果鏈接成功則會出現攝像頭畫面。