如何使用OpenCV将MP4文件的FPS值从30修改为5
你之前调用set(cv2.CAP_PROP_FPS)不生效是正常的,该属性仅对摄像头等实时采集设备有效,已存储的本地视频文件的帧率是封装在文件元数据中的,无法通过直接修改属性生效,需要重新编码输出新的视频文件才能完成帧率调整。
方案1:基于OpenCV的实现方法
思路:读取原视频的每帧,按比例抽帧后以5fps的参数写入新视频文件。你可以直接修改原有代码如下:
import cv2 # 原视频路径 input_path = './data/video/7e2.mp4' # 输出视频路径 output_path = './data/video/output_5fps.mp4' # 目标帧率 target_fps = 5 cap = cv2.VideoCapture(input_path) # 获取原视频参数 original_fps = int(cap.get(cv2.CAP_PROP_FPS)) width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) # 计算抽帧间隔:原帧率/目标帧率,30fps转5fps就是每6帧保留1帧 frame_interval = int(original_fps / target_fps) if not cap.isOpened(): print("Error opening video stream or file") # 初始化视频写入器,fourcc用mp4对应的编码 fourcc = cv2.VideoWriter_fourcc(*'mp4v') writer = cv2.VideoWriter(output_path, fourcc, target_fps, (width, height)) frame_count = 0 while cap.isOpened(): ret, frame = cap.read() if ret: # 每间隔frame_interval帧写入一次 if frame_count % frame_interval == 0: writer.write(frame) cv2.imshow('Frame', frame) if cv2.waitKey(25) & 0xFF == ord('q'): break frame_count += 1 else: break cap.release() writer.release() cv2.destroyAllWindows()
如果原帧率不能被目标帧率整除,可以调整抽帧逻辑避免出现时长偏差。
方案2:基于FFmpeg的实现方法
该方法无需写代码,执行效率更高,适合快速处理视频:
- 基础转换命令:
ffmpeg -i 输入视频路径.mp4 -r 5 输出视频路径.mp4
- 参数说明:
-r 5指定输出视频的帧率为5,FFmpeg会自动处理帧的保留与丢弃- 如果需要保留更高画质,可以添加crf参数控制压缩质量:
ffmpeg -i 输入视频路径.mp4 -r 5 -crf 18 输出视频路径.mp4,crf取值范围0-51,数值越小画质越高,默认值为23,18通常被认为是视觉无损的级别。
内容的提问来源于stack exchange,提问作者Roshani
相关产品推荐
相关产品推荐

