linux系统上一般使用 video4linux2来操作系统摄像。
1.安装一个 v4l2-ctrl工具:
sudo apt install v4l-utils
2.查看摄像头支持的视频参数
sudo v4l2-ctl --all --list-formats-ext
显示信息参考如下(这是我的摄像头,不同的摄像头会有区别 ):
------
ioctl: VIDIOC_ENUM_FMT
Index : 0
Type : Video Capture
Pixel Format: 'YUYV'
Name : YUYV 4:2:2
Size: Discrete 640x480
Interval: Discrete 0.033s (30.000 fps)
Interval: Discrete 0.042s (24.000 fps)
Interval: Discrete 0.050s (20.000 fps)
Interval: Discrete 0.067s (15.000 fps)
Interval: Discrete 0.100s (10.000 fps)
Interval: Discrete 0.133s (7.500 fps)
Interval: Discrete 0.200s (5.000 fps)
------
这里要注意3个参数,Pixel Format 是视频的格式,Size是视频分辨率,Interval是支持帧率。
通常的USB摄像头,对高清视频,如1080,在YUYV格式下,都支持不到25-30帧,一般在3-5帧,原因可能是考虑USB的传输速度;同时,摄像头一般会提供MJPEG的压缩视频格式,内容参考如下:
Index : 1
Type : Video Capture
Pixel Format: 'MJPG' (compressed)
Name : Motion-JPEG
......
Size: Discrete 1920x1080
Interval: Discrete 0.033s (30.000 fps)
Interval: Discrete 0.042s (24.000 fps)
Interval: Discrete 0.050s (20.000 fps)
Interval: Discrete 0.067s (15.000 fps)
Interval: Discrete 0.100s (10.000 fps)
Interval: Discrete 0.133s (7.500 fps)
Interval: Discrete 0.200s (5.000 fps)
------
因此在使用USB摄像头进行1080分辨率的采集时,需要指定视频格式为MJPEG,参考的ffmpeg命令如下:
ffmpeg -f v4l2 -s 1920x1080 -r 30 -vcodec mjpeg -i /dev/video0 -pix_fmt yuv420p -b:v 2000k -vcodec libx264 -preset veryfast -an usb-1080-x264-2m.mp4