使用ffmpeg录制摄像头YUYV原始流时挂起无响应是什么原因
问题原因
- 核心参数输入错误:你的摄像头仅支持
yuyv422格式,你使用的yuyv442是不存在的格式,ffmpeg尝试匹配设备支持的格式时会进入阻塞逻辑。 - 原始格式带宽不足:即使修正参数,
yuyv422是无压缩原始视频格式,1920*1080分辨率30帧率下的码率高达约995Mbps,远超过USB2.0接口的480Mbps上限,摄像头无法稳定传输帧数据,导致ffmpeg挂起等待帧输入。 - 覆盖提示延迟是ffmpeg的执行逻辑导致:ffmpeg会先完成输入设备初始化,再检查输出文件是否存在、弹出覆盖提示,设备初始化阶段阻塞时,就不会提前触发覆盖提示,只有中断初始化后才会走到文件检查步骤。
修复方案
- 修正格式参数:将
-input_format yuyv442替换为正确的-input_format yuyv422 - 优先使用MJPEG格式录制:MJPEG是摄像头硬件压缩格式,带宽占用远低于原始YUV格式,兼容性和稳定性更好,就是你原本可以正常运行的方案
- 若必须使用YUYV422格式,先降低采集参数测试:
ffmpeg -f v4l2 -input_format yuyv422 -framerate 15 -video_size 1280x720 -i /dev/video0 -t 30 output.mp4 - 调整v4l2缓冲区大小缓解阻塞:增加
-v4l2_buffer_size 16参数,提升ffmpeg的帧缓存能力 - 自动跳过覆盖提示:在命令中添加
-y参数,ffmpeg会自动覆盖已存在的输出文件,无需手动确认
内容的提问来源于stack exchange,提问作者Sam Middleton
相关产品推荐
相关产品推荐

