如何使用cv2获取视频的持续时间

时间:2018-03-01 10:54:35

标签: python video cv2

我只能使用CV2获得帧CAP_PROP_FRAME_COUNT

但是,我找不到使用cv2获取视频持续时间的参数。

怎么做?

非常感谢。

5 个答案:

答案 0 :(得分:10)

cv2并非旨在探索视频元数据,因此VideoCapture没有API直接检索它。

您可以改为"衡量"流的长度:寻找到最后,然后得到时间戳:

>>> v=cv2.VideoCapture('sample.avi')
>>> v.set(cv2.CAP_PROP_POS_AVI_RATIO,1)
True
>>> v.get(cv2.CAP_PROP_POS_MSEC)
213400.0

检查显示这会设置最后一帧之后(而不是之前)的点,因此时间戳确实是流的确切总长度:

>>> v.get(cv2.CAP_PROP_POS_FRAMES)
5335.0
>>>> v.get(cv2.CAP_PROP_FRAME_COUNT)
5335.0

>>> v.set(cv2.CAP_PROP_POS_AVI_RATIO,0)
>>> v.get(cv2.CAP_PROP_POS_FRAMES)
0.0        # the 1st frame is frame 0, not 1, so "5335" means after the last frame

答案 1 :(得分:8)

在OpenCV 3中,解决方案是:

import cv2

cap = cv2.VideoCapture("./video.mp4")
fps = cap.get(cv2.CAP_PROP_FPS)      # OpenCV2 version 2 used "CV_CAP_PROP_FPS"
frame_count = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
duration = frame_count/fps

print('fps = ' + str(fps))
print('number of frames = ' + str(frame_count))
print('duration (S) = ' + str(duration))
minutes = int(duration/60)
seconds = duration%60
print('duration (M:S) = ' + str(minutes) + ':' + str(seconds))

cap.release()

答案 2 :(得分:4)

捕获视频并输出持续时间为秒

vidcapture = cv2.VideoCapture('myvideo.mp4')
fps = vidcapture.get(cv2.CAP_PROP_FPS)
totalNoFrames = vidcapture.get(cv2.CAP_PROP_FRAME_COUNT);
durationInSeconds = float(totalNoFrames) / float(fps)

print("durationInSeconds: ",durationInSeconds,"s")

答案 3 :(得分:3)

首先像这样计算每秒帧数

fps = cap.get(cv2.cv.CV_CAP_PROP_FPS)

然后持续时间可以计算为(帧数)/(每秒帧数)

 duration = float(num_frames) / float(fps) # in seconds

答案 4 :(得分:0)

我注意到一种奇怪的现象,即许多视频没有totalLoanCost = 26028.256199301475一样多。

我认为视频时长应该是“总帧数(FPS)除以FPS”的值,但始终不匹配。视频时长将比我们计算的长。考虑到FFMPEG的作用,原始视频可能会有一些空白帧。

希望此帮助。