You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

如何用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

火山引擎 最新活动