OpenCV存储视频XVID编码FPS显示异常的原因咨询
XVID编码下OpenCV VideoWriter帧率元数据异常的原因与验证
你遇到的这个问题其实是OpenCV在处理AVI容器+XVID编码时的常见兼容性小问题,我来帮你拆解清楚:
为什么XVID编码会导致FPS显示异常?
核心原因是OpenCV的VideoWriter在写入XVID编码的AVI文件时,没有正确填充文件头的帧率元数据。
AVI容器通过dwRate和dwScale两个字段定义帧率(计算公式:帧率 = dwRate / dwScale)。当你设置fps=20.0时,理论上应该写入dwRate=20、dwScale=1,但在XVID编码场景下,OpenCV(或它依赖的FFmpeg后端)可能错误设置了这两个值——比如把dwRate设为600、dwScale设为1,直接导致mediainfo读取到600FPS的错误结果。
而MJPG编码的AVI处理逻辑不同,OpenCV能正确处理它的元数据写入,所以mediainfo显示的帧率是正常的。
是不是只有属性写错了,实际视频还是20FPS?
完全有可能! 你可以通过这几个方式验证:
计算实际帧率:从你的mediainfo输出看,视频时长是17秒252ms。用ffmpeg统计实际帧数:
ffmpeg -i output.avi -vcodec copy -f rawvideo -y /dev/null 2>&1 | grep frame如果输出的帧数≈20×17.252≈345,那实际帧率就是20FPS,只是元数据有误。
直接播放视频:如果播放时速度正常(没有快进30倍的诡异效果),说明实际帧率是对的,只是文件头的信息写错了。
修正元数据验证:用ffmpeg重新封装视频,只修正帧率元数据不重新编码:
ffmpeg -i output.avi -c:v copy -r 20 fixed_output.avi之后用mediainfo查看
fixed_output.avi,帧率会显示为20.0,且播放速度和原视频完全一致,这就能证明原视频的实际帧率是正常的。
额外建议
- 优先通过摄像头本身设置捕获帧率:打开摄像头后添加一行
capture.set(cv2.CAP_PROP_FPS, 20),让摄像头直接输出20FPS的流,比用time.sleep(0.05)人为控制更可靠。 - 如果需要稳定的XVID编码输出,可以尝试升级OpenCV或FFmpeg版本,新版本可能修复了这个元数据写入的bug。
内容的提问来源于stack exchange,提问作者Jamboree
相关产品推荐
相关产品推荐

