web-dev-qa-db-fra.com

Comment obtenir la durée de la vidéo en utilisant cv2

Je ne peux obtenir que le nombre d'images CAP_PROP_FRAME_COUNT en utilisant CV2.

Cependant, je ne trouve pas le paramètre pour obtenir la durée de la vidéo en utilisant cv2.

Comment faire ça?

Merci beaucoup.

10
Frankie

cv2 n'est pas conçu pour explorer les métadonnées vidéo, donc VideoCapture n'a pas d'API pour les récupérer directement.

Vous pouvez à la place "mesurer" la longueur du flux: rechercher jusqu'à la fin, puis obtenir l'horodatage:

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

La vérification montre que cela définit le point après la dernière image (pas avant), donc l'horodatage est en effet la longueur totale exacte du flux:

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

Dans OpenCV 3, la solution est:

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

Calculez d'abord l'image par seconde comme ceci

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

La durée peut ensuite être calculée comme (nombre d'images)/(images par seconde)

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