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

OpenCV VideoWriter保存视频时FPS被取整至29.0的问题求助

解决OpenCV保存视频时FPS被取整的问题

我太懂这种头疼了——明明输入视频的FPS是带小数的精确值,结果保存后直接被砍成整数,完全影响后续的事件测量精度!咱们来一步步搞定这个问题:

问题根源

OpenCV的VideoWriter在使用某些老旧编码器(比如XVID)时,会默认把FPS参数当作整数处理,自动截断小数部分。另外,如果传递参数时不小心把浮点型转成了整数,也会导致这个问题。

解决方案

1. 选用支持浮点FPS的编码器

优先选择支持非整数帧率的编码器,比如针对MP4格式的mp4v或者avc1(H.264编码),这些编码器能正确识别并保存浮点FPS。

2. 精确传递FPS参数

直接把从原视频获取的浮点FPS值传递给VideoWriter,不要做任何类型转换(比如int())。

完整代码示例

import cv2
import sys

# 读取输入视频
inputfilepath = "test.mp4"
cap = cv2.VideoCapture(inputfilepath)
if not cap.isOpened():
    print("无法打开输入视频")
    sys.exit()

# 获取原视频的精确FPS(浮点型)
original_fps = cap.get(cv2.CAP_PROP_FPS)
print(f"原视频FPS: {original_fps}")

# 获取视频的宽度、高度
frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
frame_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))

# 设置VideoWriter:使用支持浮点FPS的编码器
# 对于MP4格式,编码器选择mp4v或avc1
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
# 直接传入original_fps(浮点值),不要转成整数
out = cv2.VideoWriter("output.mp4", fourcc, original_fps, (frame_width, frame_height))

# 处理并写入帧
while cap.isOpened():
    ret, frame = cap.read()
    if not ret:
        break
    # 这里添加你的视频处理逻辑,比如事件测量操作
    processed_frame = frame  # 示例:直接使用原帧,替换成你的处理代码
    
    out.write(processed_frame)

# 释放资源
cap.release()
out.release()
cv2.destroyAllWindows()

额外检查项

  • 确认你使用的OpenCV版本是较新的(3.4以上),旧版本对浮点FPS的支持可能不好。
  • 如果保存后的视频还是有问题,可以尝试用ffmpeg验证输出视频的FPS:
    ffprobe -v error -select_streams v:0 -show_entries stream=r_frame_rate -of default=noprint_wrappers=1:nokey=1 output.mp4
    
    这个命令会输出精确的帧率值,确认是否和原视频一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 07:43:42