J’étais en train de sauvegarder une vidéo afin de pouvoir analyser les résultats obtenus par un algorithme quand tout à coup je me suis rendu compte que le fichier que j’étais en train de sauvegarder dépassait les 2 Go.  Ce qui m’a semblé étrange vu que la vidéo d’origine d’une durée de 16 min 42 a une taille de 68 Mo et les transformations effectuées dessus n’ont pas lieu à augmenter significativement la taille.

Je vous propose donc aujourd’hui un post sur la façon de sauvegarder une vidéo ainsi que mon retour sur des codecs utilisés.

Enregistrer une vidéo

Pour entrer en matière je vais vous proposer un exemple simple: on lit une vidéo, on change de repère colorimétrique et on enregistre la vidéo.

import cv2

cap=cv2.VideoCapture("B1.webm")
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('output.avi', fourcc, 25.0, (1280,720))

while(cap.get(cv2.CAP_PROP_POS_FRAMES) != cap.get(cv2.CAP_PROP_FRAME_COUNT)):
	print(cap.get(cv2.CAP_PROP_POS_FRAMES))
	_,frame=cap.read()
	frame_out=cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
	out.write(frame_out)

out.release()
cap.release()

Nous déclarons la classe videoCapture à la ligne 3. La fonction cv2.videoCapture prend en entrée un flux vidéo (fichier, caméra, flux rtsp, …) et renvoie une classe (cap dans notre cas).

Comme pour la lecture, nous déclarons notre enregistreur aux lignes 4-5. La ligne 4 permet de préciser quel codec vidéo nous allons utiliser pour enregistrer la vidéo. Pour ce faire, nous devons fournir à OpenCV l’identifiant du codec vidéo à travers un code fourcc (Four Charactere Code). La liste des codes est disponible sur le site fourcc.org. Il y ‘a deux façons de fournir le code: soit en séparant chaque lettre VideoWriter_fourcc(‘X’,’V’,’I’,’D’), soit sous la forme présentée dans l’exemple ci-dessus.

La ligne 5 permet de déclarer la classe VideoWriter, correspondant à notre enregistreur. La fonction cv2.VideoWriter prend en entrée le fichier de sortie , le code fourcc, le fps et la taille des images trames et enfin un booléen iscolor, qui définit si les trames sont en couleurs (True par défaut) ou en niveau de gris (iscolor=False).

La ligne 7 est une boucle permettant de lire la vidéo. A chaque trame nous regardons si la trame courante cap.get(cv2.CAP_PROP_POS_FRAMES) est différente de la dernière trame cap.get(cv2.CAP_PROP_FRAME_COUNT) .

Nous lisons l’image de la vidéo à la ligne 9. La méthode .read() permet de récupérer, décoder et de renvoyer la trame suivante de la vidéo.

Nous changeons de repère colorimétrique à la ligne 10 (cf cet article).  Et nous sauvegardons la trame suivante de la vidéo ligne 11.

Une fois toutes les trames traitées, nous fermons nos fichiers vidéos lignes 13-14.

Quel codec vidéo utilisé ?

Je ne sauvegarde pas souvent de vidéo, c’est pourquoi je ne m’étais jamais posé la question. Mais en voyant la taille grandissante de mon fichier de sortit, je me suis dit qu’il y avait sans doute un moyen de diminuer la bête sans pour autant diminuer la taille où le nombre des trames.

Je me suis donc intéressé aux codecs vidéos que l’on utilisait, en étudiant les temps de calcul et la taille de fichier obtenus par l’utilisation de 3 codecs connus : VP8, H.264 et Xvid

La vidéo d’origine est en .webm avec l’utilisation du codec de Google VP8 d’une taille d’environ 68 Mo

Lors de l’utilisation du codec VP8 (fourcc: VP8) la taille de la vidéo est de 66 Mo avec un temps de calcul d’environ  14 min.

Lors de l’utilisation du codec H264 (fourcc: H264) la taille de la vidéo est de 88.9 Mo avec un temps de calcul d’environ  6 min 30 .

Lors de l’utilisation du codec Xvid (fourcc: XVID) la taille de la vidéo est de 247 Mo avec un temps de calcul d’environ   4 min 12.

Tout ça pour dire que le choix du codec à utiliser, dépend de notre besoin.

Si l’on a besoin de notre vidéo rapidement et que l’on a un gros disque dur, alors le codec Xvid est plus intéressant. A l’inverse si le temps n’est pas un problème contrairement au stockage, le VP8 est la solution.


0 commentaire

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.