如何用OpenCV获取视频总时长(秒)?CAP_PROP_*能否实现?
OpenCV 获取视频总时长相关问题解答
1. 如何使用OpenCV获取视频的总时长(单位为秒)?
这里有两种实用的实现方式,我用Python代码给你演示:
方法一:通过总帧数与帧率计算(推荐)
这是兼容性最好、最可靠的方法,步骤很清晰:
- 先初始化视频捕获对象,确认能正常打开视频
- 获取视频的总帧数(
cv2.CAP_PROP_FRAME_COUNT)和帧率(cv2.CAP_PROP_FPS) - 用总帧数除以帧率得到总时长,记得处理帧率为0的异常情况
代码示例:
import cv2 def calculate_video_duration(video_path): # 初始化视频捕获对象 cap = cv2.VideoCapture(video_path) if not cap.isOpened(): print("无法打开目标视频文件,请检查路径是否正确") return 0.0 # 获取总帧数和帧率 total_frames = cap.get(cv2.CAP_PROP_FRAME_COUNT) fps = cap.get(cv2.CAP_PROP_FPS) # 计算总时长(保留两位小数) duration = total_frames / fps if fps > 0 else 0.0 # 释放资源 cap.release() return round(duration, 2) # 调用示例 print(calculate_video_duration("test_video.mp4"))
方法二:跳转至视频末尾读取时间戳
部分视频可以通过将播放位置跳转到末尾,读取当前位置的毫秒数来转换为总时长,但这种方法兼容性较差,不是所有格式都支持:
import cv2 def get_duration_by_end_position(video_path): cap = cv2.VideoCapture(video_path) if not cap.isOpened(): print("无法打开目标视频文件") return 0.0 # 跳转到视频末尾(1.0代表最后位置) cap.set(cv2.CAP_PROP_POS_AVI_RATIO, 1.0) # 获取当前位置的毫秒数 total_milliseconds = cap.get(cv2.CAP_PROP_POS_MSEC) # 转换为秒 duration = total_milliseconds / 1000 cap.release() return round(duration, 2)
2. 是否存在CAP_PROP_*属性可直接获取视频总时长(秒)?还是必须通过总帧数除以帧率(fps)来计算?
首先明确:OpenCV的CAP_PROP_*系列属性里没有直接返回视频总时长(秒)的选项。
你可能会注意到cv2.CAP_PROP_POS_MSEC,但它的作用是获取当前播放位置的毫秒数,而非总时长。虽然可以通过跳转至视频末尾再读取这个属性来间接估算总时长,但这种方法的兼容性很差——部分视频格式、编码或者损坏的视频会返回不准确的数值,甚至0。
所以最稳妥的方案还是通过总帧数(cv2.CAP_PROP_FRAME_COUNT)除以帧率(cv2.CAP_PROP_FPS)来计算总时长。不过有两个细节需要注意:
- 个别视频的帧率读取可能不准确(比如非标准帧率),计算时要先判断帧率是否大于0,避免除以0的错误
- 少数视频的总帧数读取也会有误差,这种情况下可以结合两种方法交叉验证结果
内容的提问来源于stack exchange,提问作者user239457




