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.
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
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()
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