OpenCV获取MKV视频帧率与总帧数异常的解决咨询
解决OpenCV读取MKV视频帧率和帧数错误的问题
针对你遇到的cv2.VideoCapture读取MKV视频时帧率返回1000.0、总帧数返回负数的问题,可尝试以下几种解决方案:
1. 强制指定FFmpeg后端读取视频
MKV作为容器格式,FFmpeg对其支持更完善。初始化VideoCapture时显式指定使用FFmpeg后端:
import time import cv2 video_file_name = 'my_video_0.mkv' # 强制使用FFmpeg后端 cap = cv2.VideoCapture(video_file_name, cv2.CAP_FFMPEG) if not cap.isOpened(): print("视频文件无法打开") else: fps = cap.get(cv2.CAP_PROP_FPS) frame_count = int(cap.get(cv2.CAP_PROP_FRAME_COUNT)) print(f"帧率: {fps}") print(f"总帧数: {frame_count}")
2. 手动遍历帧获取准确的帧数和帧率
若元数据读取始终异常,可通过逐帧读取的方式计算真实帧数和帧率:
import time import cv2 video_file_name = 'my_video_0.mkv' cap = cv2.VideoCapture(video_file_name, cv2.CAP_FFMPEG) if not cap.isOpened(): print("视频文件无法打开") exit() frame_count = 0 start_time = time.time() # 逐帧读取直到结束 while True: ret, frame = cap.read() if not ret: break frame_count += 1 # 若需要保存帧,可在此处添加保存逻辑 # cv2.imwrite(f"frame_{frame_count}.jpg", frame) end_time = time.time() actual_fps = frame_count / (end_time - start_time) print(f"实际总帧数: {frame_count}") print(f"实际帧率: {actual_fps:.2f} FPS") cap.release()
3. 确认OpenCV已集成FFmpeg支持
检查你的OpenCV是否包含FFmpeg后端支持,运行以下代码查看编译信息:
print(cv2.getBuildInformation())
在输出中查找FFmpeg相关条目,若显示NO,则需要重新安装带FFmpeg的OpenCV版本。推荐使用conda安装:
conda install -c conda-forge opencv-python-headless
4. 修复视频元数据
若视频本身元数据损坏,可使用FFmpeg重新封装视频(不重新编码,速度快):
ffmpeg -i my_video_0.mkv -c copy fixed_video.mkv
之后用修复后的fixed_video.mkv重新测试读取。
内容的提问来源于stack exchange,提问作者pfc
相关产品推荐
相关产品推荐

