天天看點

【GStreamer 】3-2 gstreamer實作USB相機采集圖檔和錄像

【GStreamer 】3-2 gstreamer實作USB相機采集圖檔和錄像

0、硬體平台和測試環境說明

        感覺網上看這一類說明,常常最大的疑惑就是,為什麼别人能用,我自己就不成了,其實很多時候都是各自的環境交代不清楚所緻。是以我覺得講操作前,必須先交代自己的測試環境。

        我自己使用的是TX1核心子產品,安裝ubuntu 18.04 的環境。安裝了英偉達配套的所有cuda的套件庫。

【GStreamer 】3-2 gstreamer實作USB相機采集圖檔和錄像
[email protected]:~$ sudo lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 18.04.5 LTS
Release:    18.04
Codename:   bionic
           

1 、檢視usb攝像頭可用的分辨率

[email protected]:~$ v4l2-ctl --device=/dev/video0 --list-formats-ext
ioctl: VIDIOC_ENUM_FMT
    Index       : 0
    Type        : Video Capture
    Pixel Format: 'MJPG' (compressed)
    Name        : Motion-JPEG
        Size: Discrete 1280x720
            Interval: Discrete 0.033s (30.000 fps)
        Size: Discrete 800x600
            Interval: Discrete 0.033s (30.000 fps)
        Size: Discrete 640x480
            Interval: Discrete 0.033s (30.000 fps)
        Size: Discrete 640x360
            Interval: Discrete 0.033s (30.000 fps)
        Size: Discrete 352x288
            Interval: Discrete 0.033s (30.000 fps)
        Size: Discrete 320x240
            Interval: Discrete 0.033s (30.000 fps)
​
    Index       : 1
    Type        : Video Capture
    Pixel Format: 'YUYV'
    Name        : YUYV 4:2:2
        Size: Discrete 1280x720
            Interval: Discrete 0.200s (5.000 fps)
        Size: Discrete 800x600
            Interval: Discrete 0.050s (20.000 fps)
        Size: Discrete 640x480
            Interval: Discrete 0.040s (25.000 fps)
        Size: Discrete 640x360
            Interval: Discrete 0.033s (30.000 fps)
        Size: Discrete 352x288
            Interval: Discrete 0.033s (30.000 fps)
        Size: Discrete 320x240
            Interval: Discrete 0.033s (30.000 fps)
           

        可以看到,我測試使用的USB相機可以支援MJPG格式的壓縮視訊,恒定30HZ幀率,也可以提供YUYV這種RAW格式的視訊,但是圖像分辨率越大,幀率也會變低,需要根據情況做一定的調整。

2、采集USB攝像頭儲存至圖檔

2.1 采集YUV格式的圖檔

#jpegenc 輸入video/x-raw個數,輸出image/jpeg格式
gst-launch-1.0 v4l2src device=/dev/video0 num-buffers=1 \
! 'video/x-raw,format=YUY2,width=1280, height=720, framerate=5/1' \
! jpegenc ! filesink location=/home/nvidia/Pictures/file_1280_720_YUV_1401.jpg
​
#采集Size: Discrete 640x480 圖檔
gst-launch-1.0 v4l2src device=/dev/video0 num-buffers=1 \
! 'video/x-raw,format=YUY2,width=640, height=480, framerate=25/1' \
! jpegenc ! filesink location=/home/nvidia/Pictures/file_640_480_YUV_1401.jpg
           
【GStreamer 】3-2 gstreamer實作USB相機采集圖檔和錄像

2.2 采集jpeg格式的圖檔

#指定裝置 /dev/video0 采集一幀 num-buffers=1 ,資料格式 image/jpeg,width=1280,height=720
#filesink 這是一個隻消費資料的對象,傳入儲存位置,将資料輸出到指定位置
gst-launch-1.0 v4l2src device=/dev/video0 num-buffers=1 \
! image/jpeg,width=1280,height=720 ! \
filesink location=/home/nvidia/Pictures/file_1280_720_1724.jpg
​
#也可以補全所有的參數framerate=30/1
gst-launch-1.0 v4l2src device=/dev/video0 num-buffers=1 \
! image/jpeg,width=1280,height=720,framerate=30/1 ! \
filesink location=/home/nvidia/Pictures/file_jpeg_1280_720_1417.jpg
​
#采集不同的分辨率
gst-launch-1.0 v4l2src device=/dev/video0 num-buffers=1 \
! image/jpeg,width=640,height=480,framerate=30/1 ! \
filesink location=/home/nvidia/Pictures/file_jpeg_640_480_1417.jpg
           

3、采集USB攝像頭儲存成視訊

3.1 采集yuv格式輸入的,輸出AVI視訊

        AVI英文全稱為Audio Video Interleaved,即音頻視訊交錯格式,是微軟公司于1992年11月推出、作為其Windows視訊軟體一部分的一種多媒體容器格式。

        AVI檔案将音頻(語音)和視訊(影像)資料包含在一個檔案容器中,允許音視訊同步回放。類似DVD視訊格式,AVI檔案支援多個音視訊流。AVI資訊主要應用在多媒體CD光牒上,用來儲存電視、電影等各種影像資訊。

#采集video/x-raw格式,生成AVI
#avimux 要向生成AVI,必須用的插件多路複用,常用來做音視訊混合成一個檔案,實作AVI格式交錯
gst-launch-1.0 videotestsrc num-buffers=100 \
! 'video/x-raw,format=YUY2,width=1280, height=720, framerate=10/1' \
! avimux  ! filesink location=/home/nvidia/Pictures/x-raw.avi
​
gst-launch-1.0 v4l2src device=/dev/video0 num-buffers=100 \
! 'video/x-raw,format=YUY2,width=1280, height=720, framerate=5/1' \
! avimux  ! filesink location=/home/nvidia/Pictures/video0-x-raw.avi
​
#jpegenc 是GStreamer 中迎來實作JPEG image 編碼的插件。其輸入為 video/x-raw ,輸出為image/jpeg
#将video/x-raw格式編碼成image/jpeg,生成AVI,都是可以的
gst-launch-1.0 videotestsrc num-buffers=100 \
! 'video/x-raw,format=YUY2,width=1280, height=720, framerate=5/1' \
! jpegenc ! avimux ! filesink location=/home/nvidia/Pictures/jpeg.avi
​
gst-launch-1.0 v4l2src device=/dev/video0 num-buffers=100 \
! 'video/x-raw,format=YUY2,width=1280, height=720, framerate=5/1' \
! jpegenc ! avimux ! filesink location=/home/nvidia/Pictures/video0-jpeg.avi
           
【GStreamer 】3-2 gstreamer實作USB相機采集圖檔和錄像
【GStreamer 】3-2 gstreamer實作USB相機采集圖檔和錄像

3.2 采集MJPG格式輸入的,輸出AVI視訊

#使用USB相機采集 Size: Discrete 1280x720
gst-launch-1.0 v4l2src device=/dev/video0 num-buffers=100 \
! image/jpeg,width=1280,height=720,framerate=30/1 ! \
avimux ! filesink location=/home/nvidia/Pictures/jpeg_1280_720_1417.avi
           
【GStreamer 】3-2 gstreamer實作USB相機采集圖檔和錄像

3.3 采集YUV格式輸入的,編碼成 H.264格式,輸出MP4檔案

        從 v4l2 裝置擷取視訊流,編碼成 H.264格式,并混合到一個MP4檔案中

#x264enc 其輸入為 video/x-raw ,輸出為video/x-h264
gst-launch-1.0 v4l2src device=/dev/video0 num-buffers=100 \
! 'video/x-raw,format=YUY2,width=1280, height=720, framerate=5/1' \
! videoconvert  \
! x264enc ! mp4mux ! filesink location=/home/nvidia/Pictures/x264-video-1280-720.mp4

#也有人這麼寫,單獨開一個隊列去做,也是可以的
gst-launch-1.0 v4l2src device=/dev/video0 num-buffers=100 \
! 'video/x-raw,format=YUY2,width=640, height=480, framerate=25/1' \
! videoconvert \
! queue ! x264enc ! mp4mux ! filesink sync=false location=/home/nvidia/Pictures/camera-h264-640x480.mp4
           

        不使用videoconvert 會報錯

pipeline: could not link v4l2src0 to x264enc0, x264enc0 can't handle caps video/x-raw, format=(string)YUY2, width=(int)1280, height=(int)720, framerate=(fraction)5/1
           
【GStreamer 】3-2 gstreamer實作USB相機采集圖檔和錄像

拷貝到WIN下可以直接播放。

【GStreamer 】3-2 gstreamer實作USB相機采集圖檔和錄像

3.4 采集MJPG格式輸入的,輸出MP4檔案

gst-launch-1.0 v4l2src device=/dev/video0  num-buffers=100 \
! image/jpeg,width=1280,height=720,framerate=30/1 ! \
! jpegdec ! videoconvert \
! tee name=srctee srctee. \
! queue2 ! xvimagesink srctee. \
! queue2 ! x264enc threads=4 sliced-threads=TRUE tune=zerolatency ! matroskamux ! filesink location = output.mp4 srctee. \
! queue2 ! videoconvert ! video/x-raw,format=RGB ! fakesink
           
# jpegdec jpeg解碼
# x264enc 編碼成X264
# mp4mux 混合生成MP4 
gst-launch-1.0 v4l2src device=/dev/video0  num-buffers=100 \
! image/jpeg,width=1280,height=720,framerate=30/1  \
! jpegdec ! videoconvert \
! x264enc ! mp4mux ! filesink location=/home/nvidia/Pictures/x264-video-1280-720.mp4
           

【GStreamer 】3-2 gstreamer實作USB相機采集圖檔和錄像

3.5 一邊顯示,一邊錄視訊

gst-launch-1.0 v4l2src device=/dev/video0  num-buffers=300 \
! image/jpeg,width=1280,height=720,framerate=30/1  \
! jpegdec ! videoconvert \
! tee name=srctee srctee. \
! queue2 ! xvimagesink srctee. \
! queue2 ! x264enc threads=4 sliced-threads=TRUE tune=zerolatency ! matroskamux ! filesink location = /home/nvidia/Pictures/output.mp4 
​
​
#不同分辨率
gst-launch-1.0 v4l2src device=/dev/video0  num-buffers=300 \
! image/jpeg,width=640,height=480,framerate=30/1  \
! jpegdec ! videoconvert \
! tee name=srctee srctee. \
! queue2 ! xvimagesink srctee. \
! queue2 ! x264enc threads=4 sliced-threads=TRUE tune=zerolatency ! matroskamux ! filesink location = /home/nvidia/Pictures/output2.mp4 
           
​實際效果感覺比較卡頓      

繼續閱讀