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

