0、硬件平台和测试环境说明
感觉网上看这一类说明,常常最大的疑惑就是,为什么别人能用,我自己就不成了,其实很多时候都是各自的环境交代不清楚所致。所以我觉得讲操作前,必须先交代自己的测试环境。
我自己使用的是TX1核心模块,安装ubuntu 18.04 的环境。安装了英伟达配套的所有cuda的套件库。
nvidia@nvidia-desktop:~$ 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摄像头可用的分辨率
nvidia@nvidia-desktop:~$ 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信息主要应用在多媒体光盘上,用来保存电视、电影等各种影像信息。
#采集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
文章来源:https://www.toymoban.com/news/detail-492864.html
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
实际效果感觉比较卡顿
文章来源地址https://www.toymoban.com/news/detail-492864.html
到了这里,关于【GStreamer 】3-2 gstreamer实现USB相机采集图片和录像的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!