如何使用cv2获取视频的持续时间
How to get the duration of video using cv2
我只能用CV2得到帧数CAP_PROP_FRAME_COUNT
。
但是,我找不到使用 cv2 获取视频持续时间的参数。
怎么做?
非常感谢。
首先像这样计算每秒帧数
fps = cap.get(cv2.cv.CV_CAP_PROP_FPS)
那么持续时间可以计算为(帧数)/(每秒帧数)
duration = float(num_frames) / float(fps) # in seconds
cv2
并非旨在探索视频元数据,因此 VideoCapture
没有 API 可以直接检索它。
您可以改为 "measure" 流的长度:搜索到末尾,然后获取时间戳:
>>> 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
在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()
我注意到一个奇怪的现象,许多视频 没有 与 vid.get(cv2.CAP_PROP_FRAME_COUNT)
一样多的帧。
我想视频时长应该是 TOTAL FRAMES 除以 FPS 的值,但它总是不匹配。视频持续时间会比我们计算的要长。考虑到 FFMPEG 的作用,原始视频可能会有一些空帧。
希望对您有所帮助。
Capture the video and output the duration is seconds
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")
根据我个人的经验,我一直在使用 opencv
方法。
试试这个代码:
import cv2
def get_dur(filename):
video = cv2.VideoCapture(filename)
fps = video.get(cv2.CAP_PROP_FPS)
frame_count = video.get(cv2.CAP_PROP_FRAME_COUNT)
seconds = frame_count / fps
minutes = int(seconds / 60)
rem_sec = int(seconds % 60)
return f"{minutes}:{rem_sec}"
print(get_dur("dafuck.mp4"))
我只能用CV2得到帧数CAP_PROP_FRAME_COUNT
。
但是,我找不到使用 cv2 获取视频持续时间的参数。
怎么做?
非常感谢。
首先像这样计算每秒帧数
fps = cap.get(cv2.cv.CV_CAP_PROP_FPS)
那么持续时间可以计算为(帧数)/(每秒帧数)
duration = float(num_frames) / float(fps) # in seconds
cv2
并非旨在探索视频元数据,因此 VideoCapture
没有 API 可以直接检索它。
您可以改为 "measure" 流的长度:搜索到末尾,然后获取时间戳:
>>> 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
在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()
我注意到一个奇怪的现象,许多视频 没有 与 vid.get(cv2.CAP_PROP_FRAME_COUNT)
一样多的帧。
我想视频时长应该是 TOTAL FRAMES 除以 FPS 的值,但它总是不匹配。视频持续时间会比我们计算的要长。考虑到 FFMPEG 的作用,原始视频可能会有一些空帧。
希望对您有所帮助。
Capture the video and output the duration is seconds
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")
根据我个人的经验,我一直在使用 opencv
方法。
试试这个代码:
import cv2
def get_dur(filename):
video = cv2.VideoCapture(filename)
fps = video.get(cv2.CAP_PROP_FPS)
frame_count = video.get(cv2.CAP_PROP_FRAME_COUNT)
seconds = frame_count / fps
minutes = int(seconds / 60)
rem_sec = int(seconds % 60)
return f"{minutes}:{rem_sec}"
print(get_dur("dafuck.mp4"))