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
相关产品推荐
相关产品推荐

