我需要 ffmpeg 以 MJPEG 模式打开网络摄像头(Logitech C910),因为网络摄像头使用 MJPEG“协议”可以提供 ~24 fps,而使用 YUYV 只能提供 ~10 fps。我可以使用 ffmpeg 命令行在它们之间进行选择吗?
xx@(none) ~ $ v4l2-ctl --list-formats
ioctl: VIDIOC_ENUM_FMT
Index : 0
Type : Video Capture
Pixel Format: 'YUYV'
Name : YUV 4:2:2 (YUYV)
Index : 1
Type : Video Capture
Pixel Format: 'MJPG' (compressed)
Name : MJPEG
我当前的命令行:
ffmpeg -y -f alsa -i hw:3,0 -f video4linux2 -r 20 -s 1280x720 -i /dev/video0 -acodec libfaac -ab 128k -vcodec libx264 /tmp/web.avi
当我从网络摄像头录制时,ffmpeg 会产生损坏的 h264 流,但当我从 x11grab 录制时,h264 流是正常的。其他编解码器(mjpeg、mpeg4)与网络摄像头配合良好……但这是另一个故事。
更新完整的 ffmpeg 控制台输出:http://pastebin.com/Hzem6CKF(您可以看到它以 YUV 模式打开视频设备,但该设备也可以提供 MJPEG 输出)。
答案1
您可以使用 列出有关网络摄像头可以输出的内容的其他信息v4l2-ctl --list-formats-ext
。您还可以使用输入选项通过 ffmpeg 显示网络摄像头信息-list_formats
:
$ ffmpeg -f video4linux2 -list_formats all -i /dev/video0
[...]
[video4linux2,v4l2 @ 0x1fb7660] Raw : yuyv422 : YUV 4:2:2 (YUYV) : 640x480 160x120 176x144 320x176 320x240 352x288 432x240 544x288 640x360
[video4linux2,v4l2 @ 0x1fb7660] Compressed: mjpeg : MJPEG : 640x480 160x120 176x144 320x176 320x240 352x288 432x240 544x288 640x360
我示例中的这个网络摄像头可以支持原始(yuyv422
)和压缩(mjpeg
)格式,您可以ffmpeg
通过输入选项判断您想要哪一种-input_format
。
例子
流复制 MJPEG 视频流(无需重新编码):
ffmpeg -f v4l2 -input_format mjpeg -i /dev/video0 -c:v copy output.mkv
将原始网络摄像头视频重新编码为 H.264:
ffmpeg -f v4l2 -input_format yuyv422 -i /dev/video0 -c:v libx264 -vf format=yuv420p output.mp4
与上述相同,但手动选择帧速率和视频大小(v4l2-ctl --list-formats-ext
对于可用的帧速率和视频大小):
ffmpeg -f v4l2 -input_format yuyv422 -framerate 30 -video_size 640x480 -i /dev/video0 -c:v libx264 -vf format=yuv420p output.mp4
查看video4linux2 输入设备文档以获取更多选项。
如果输出的帧速率低于预期,则添加更多光线:网络摄像头可能会降低帧速率以在昏暗的环境中获得更长的曝光时间。
答案2
ffmpeg -t 60 -f video4linux2 -input_format mjpeg -i /dev/video0 -c:v libx264 -strict -2 /DataVolume/share/Public/v/outputs.mp4