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

如何使用OpenCV按指定固定FPS值提取视频帧

OpenCV视频帧提取速率控制实现方案

OpenCV原生VideoCapture接口没有提供直接配置提取帧率的参数,所有帧率控制逻辑都可以通过帧计数、时间戳匹配两种方式自定义实现,对应两种常见的使用场景:

场景1:按指定抽帧频率抽取离散帧

适合需要从视频中按固定间隔提取样本帧的场景,比如每秒提取2帧做数据集、内容分析等,实现逻辑如下:

  1. 读取视频原始帧率:调用cap.get(cv2.CAP_PROP_FPS)获取视频本身的帧率参数
  2. 计算帧间隔:按帧间隔 = 原始帧率 / 目标抽帧帧率计算需要跳过的帧数,最小取1避免间隔为0
  3. 顺序读取视频帧,每读取到满足间隔要求的帧就做保存/处理操作

场景2:控制提取过程的实时执行速率

适合需要模拟实时播放速度处理帧的场景,比如推流模拟、实时预览等,实现逻辑如下:

  1. 按目标提取帧率计算每帧的预期耗时:单帧等待时间 = 1 / 目标提取帧率
  2. 每次读取并处理完一帧后,统计本次处理的实际耗时,和单帧等待时间对比,缺多少就调用time.sleep()补多少时间
  3. 若单帧处理耗时已经超过等待时间,就直接进入下一帧的读取,避免累积延迟

可运行示例代码

import cv2
import time
import os

# 自定义配置参数
VIDEO_PATH = "test_video.mp4"
TARGET_EXTRACT_FPS = 3  # 目标提取帧率
SAVE_FRAME_DIR = "./extracted_frames"
os.makedirs(SAVE_FRAME_DIR, exist_ok=True)

# 初始化视频读取对象
cap = cv2.VideoCapture(VIDEO_PATH)
if not cap.isOpened():
    raise Exception("视频文件打开失败,请检查路径是否正确")

# 获取视频基础参数
original_fps = cap.get(cv2.CAP_PROP_FPS)
frame_interval = max(1, int(original_fps / TARGET_EXTRACT_FPS))
single_frame_wait = 1 / TARGET_EXTRACT_FPS

current_frame_idx = 0
saved_frame_cnt = 0

while True:
    start_time = time.time()
    ret, frame = cap.read()
    if not ret:
        break

    # 按间隔保存帧
    if current_frame_idx % frame_interval == 0:
        save_path = os.path.join(SAVE_FRAME_DIR, f"frame_{saved_frame_cnt:05d}.jpg")
        cv2.imwrite(save_path, frame)
        saved_frame_cnt += 1

    # 控制执行速率(不需要实时控制可以删掉下面这段)
    process_cost = time.time() - start_time
    if process_cost < single_frame_wait:
        time.sleep(single_frame_wait - process_cost)

    current_frame_idx += 1

cap.release()
print(f"帧提取完成,共保存{saved_frame_cnt}帧")

注意事项

  • 不要直接调用cap.set(cv2.CAP_PROP_POS_FRAMES)强制跳帧,部分可变帧率、非标准封装的视频会出现花帧、时间戳错乱的问题,顺序读取后按间隔丢弃帧的兼容性最好
  • 对抽帧时间精度要求高的场景,可以用cap.get(cv2.CAP_PROP_POS_MSEC)获取当前帧的实际时间戳,和目标时间比对判断是否需要保留,比帧计数更准确
  • 目标提取帧率高于视频原始帧率时,默认只会逐帧提取,不会生成额外的插值帧,需要补帧的话要额外结合RIFE等插帧算法实现

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 16:30:05