pav*_*din 19 webcam ffmpeg v4l2 mjpeg
我需要 ffmpeg 在 MJPEG 模式下打开网络摄像头(罗技 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
Run Code Online (Sandbox Code Playgroud)
我当前的命令行:
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
Run Code Online (Sandbox Code Playgroud)
当我从网络摄像头录制时,ffmpeg 会产生损坏的 h264 流,但是当我从 x11grab 录制时会产生正常的 h264 流。另一种编解码器(mjpeg、mpeg4)适用于网络摄像头……但这是另一回事。
更新完整的 ffmpeg 控制台输出:http : //pastebin.com/Hzem6CKF(您可以看到它以 YUV 模式打开视频设备,但该设备也可以提供 MJPEG 输出)。
llo*_*gan 18
您可以列出有关您的网络摄像头可以使用v4l2-ctl --list-formats-ext. 您还可以使用-list_formats输入选项通过 ffmpeg 显示网络摄像头信息:
$ 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
Run Code Online (Sandbox Code Playgroud)
我的示例中的这个网络摄像头可以支持原始 ( yuyv422) 和压缩 ( mjpeg) 格式,您可以ffmpeg通过-input_format输入选项判断您想要哪种格式。
流复制 MJPEG 视频流(无需重新编码):
ffmpeg -f v4l2 -input_format mjpeg -i /dev/video0 -c:v copy output.mkv
Run Code Online (Sandbox Code Playgroud)
将原始网络摄像头视频重新编码为 H.264:
ffmpeg -f v4l2 -input_format yuyv422 -i /dev/video0 -c:v libx264 -vf format=yuv420p output.mp4
Run Code Online (Sandbox Code Playgroud)
与上面相同,但手动选择帧速率和视频大小(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
Run Code Online (Sandbox Code Playgroud)
有关更多选项,请参阅video4linux2 输入设备文档。
如果输出的帧率低于预期,则添加更多光线:网络摄像头可能会降低帧率以在昏暗环境中获得更长的曝光时间。
| 归档时间: |
|
| 查看次数: |
52467 次 |
| 最近记录: |