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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 05:15:05