web-dev-qa-db-ja.com

cv2を使用してビデオの継続時間を取得する方法

フレーム数のみを取得できますCAP_PROP_FRAME_COUNT CV2を使用します。

ただし、cv2を使用してビデオの継続時間を取得するパラメーターが見つかりません。

どうやってするか?

どうもありがとうございました。

10
Frankie

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
14
ivan_pozdeev

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()
12
Ryan Loggerythm

最初にこのように1秒あたりのフレームを計算します

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

次に、期間は(フレーム数)/(1秒あたりのフレーム数)として計算できます。

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