![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnL1MDN5UDMhFmN0AjY1kTZiZTNjRzN4AzM5ATZmV2MlJ2Lc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
0、硬體平台和測試環境說明
感覺網上看這一類說明,常常最大的疑惑就是,為什麼别人能用,我自己就不成了,其實很多時候都是各自的環境交代不清楚所緻。是以我覺得講操作前,必須先交代自己的測試環境。
我自己使用的是TX1核心子產品,安裝ubuntu 18.04 的環境。安裝了英偉達配套的所有cuda的套件庫。
[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
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
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
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
拷貝到WIN下可以直接播放。
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
實際效果感覺比較卡頓