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

cv2.VideoCapture读取长视频时CAP_PROP_FPS返回inf、总帧数异常

OpenCV读取长视频帧率、总帧数异常解决方案

问题根因

你遇到的返回值-9223372036854775808是64位有符号整数的最小值,inf代表无穷大,二者均为OpenCV解析视频元数据失败的异常返回值,触发原因通常有两个:

  • 长视频的帧计数、时长相关元数据超出了OpenCV默认后端支持的32位数值范围,触发溢出
  • 旧版本OpenCV自带的FFmpeg后端对大体积/长时长视频的元数据解析存在bug

解决方案

方案1:指定FFmpeg后端打开视频

读取视频时主动指定FFmpeg作为解析后端,避免默认后端适配问题,修改打开代码为:

cap = cv2.VideoCapture(video_path, cv2.CAP_FFMPEG)

打开后再调用cap.get()读取帧率和总帧数即可,该方法可以解决80%以上的同类异常。

方案2:调用FFprobe解析元数据

如果指定后端后仍有异常,直接调用FFprobe解析视频元数据,准确率远高于OpenCV自带的读取接口,示例代码如下:

import subprocess
import json

def get_video_meta(video_path):
    # 调用本地ffprobe解析元数据
    cmd = [
        'ffprobe',
        '-v', 'quiet',
        '-print_format', 'json',
        '-show_streams',
        video_path
    ]
    result = subprocess.run(cmd, capture_output=True, text=True)
    meta = json.loads(result.stdout)
    # 筛选视频流数据
    video_stream = next(s for s in meta['streams'] if s['codec_type'] == 'video')
    # 计算真实帧率和总帧数
    fps = eval(video_stream['avg_frame_rate'])
    frame_count = int(video_stream['nb_frames'])
    return fps, frame_count

使用该方法需要提前在运行环境安装FFmpeg套件(包含ffprobe工具)。

方案3:逐帧计数兜底

如果没有安装FFmpeg的权限,且需要读取的长视频数量不多,可以用逐帧遍历的方式获取准确总帧数:

import cv2

def get_video_frame_count(video_path):
    cap = cv2.VideoCapture(video_path)
    frame_count = 0
    while cap.isOpened():
        ret, _ = cap.read()
        if not ret:
            break
        frame_count += 1
    cap.release()
    # 若帧率仍为inf,可通过 总帧数/视频总时长 手动计算帧率
    return frame_count

注意事项

  • 优先将OpenCV升级到4.5及以上版本,3.x版本的长视频解析bug更多
  • 读取前确认视频文件本身无损坏,元数据缺失的损坏文件也会触发同类异常

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 09:45:01