フレーム数のみを取得できますCAP_PROP_FRAME_COUNT
CV2を使用します。
ただし、cv2を使用してビデオの継続時間を取得するパラメーターが見つかりません。
どうやってするか?
どうもありがとうございました。
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
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()
最初にこのように1秒あたりのフレームを計算します
fps = cap.get(cv2.cv.CV_CAP_PROP_FPS)
次に、期間は(フレーム数)/(1秒あたりのフレーム数)として計算できます。
duration = float(num_frames) / float(fps) # in seconds