2025.4.10
在 OpenCV 中,可以通过 cv2.CAP_PROP_FRAME_COUNT
获取视频的总帧数。以下是具体方法和完整代码示例:
1. 获取视频总帧数的方法
import cv2
# 打开视频文件或摄像头
video_path = "your_video.mp4" # 替换为你的视频路径
cap = cv2.VideoCapture(video_path)
# 获取总帧数
total_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
print(f"视频总帧数: {total_frames}")
# 释放资源
cap.release()
2. 注意事项
-
摄像头输入无法直接获取总帧数
如果是实时摄像头(如cv2.VideoCapture(0)
),CAP_PROP_FRAME_COUNT
会返回0
,因为摄像头是实时流,没有固定帧数。 -
视频格式支持
某些视频格式(如动态生成的流或部分编码)可能无法正确返回帧数,此时需要逐帧读取计数:total_frames = 0 while True: ret, _ = cap.read() if not ret: break total_frames += 1 print(f"实际解码帧数: {total_frames}")
-
精度问题
CAP_PROP_FRAME_COUNT
的值可能因视频编码方式略有误差,建议对关键应用逐帧验证。
3. 完整代码(含异常处理)
import cv2
def get_video_frame_count(video_path):
cap = None
try:
cap = cv2.VideoCapture(video_path)
if not cap.isOpened():
raise ValueError("无法打开视频文件")
# 方法1:直接获取元数据中的帧数(可能不准确)
total_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
# 方法2:逐帧计数(准确但较慢)
# total_frames = 0
# while True:
# ret, _ = cap.read()
# if not ret:
# break
# total_frames += 1
return total_frames
except Exception as e:
print(f"错误: {e}")
return 0
finally:
if cap is not None:
cap.release()
# 使用示例
video_path = "test.mp4"
frame_count = get_video_frame_count(video_path)
print(f"视频总帧数: {frame_count}")
4. 为什么需要两种方法?
-
CAP_PROP_FRAME_COUNT
快速但依赖视频元数据,某些编码格式(如部分MP4)可能不准确。 -
逐帧计数
100% 准确但速度慢,适合对精度要求高的场景(如视频编辑)。
5. 扩展:计算视频时长(秒)
如果还需要视频时长,可以通过帧率和总帧数计算:
fps = cap.get(cv2.CAP_PROP_FPS)
duration_sec = total_frames / fps
print(f"视频时长: {duration_sec:.2f}秒")
通过上述方法,你可以灵活应对不同场景下的帧数统计需求!