You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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?

完全有可能! 你可以通过这几个方式验证:

  1. 计算实际帧率:从你的mediainfo输出看,视频时长是17秒252ms。用ffmpeg统计实际帧数:

    ffmpeg -i output.avi -vcodec copy -f rawvideo -y /dev/null 2>&1 | grep frame
    

    如果输出的帧数≈20×17.252≈345,那实际帧率就是20FPS,只是元数据有误。

  2. 直接播放视频:如果播放时速度正常(没有快进30倍的诡异效果),说明实际帧率是对的,只是文件头的信息写错了。

  3. 修正元数据验证:用ffmpeg重新封装视频,只修正帧率元数据不重新编码:

    ffmpeg -i output.avi -c:v copy -r 20 fixed_output.avi
    

    之后用mediainfo查看fixed_output.avi,帧率会显示为20.0,且播放速度和原视频完全一致,这就能证明原视频的实际帧率是正常的。

额外建议

  1. 优先通过摄像头本身设置捕获帧率:打开摄像头后添加一行capture.set(cv2.CAP_PROP_FPS, 20),让摄像头直接输出20FPS的流,比用time.sleep(0.05)人为控制更可靠。
  2. 如果需要稳定的XVID编码输出,可以尝试升级OpenCV或FFmpeg版本,新版本可能修复了这个元数据写入的bug。

内容的提问来源于stack exchange,提问作者Jamboree

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:36:56