Si vous suivez régulièrement ce blog, vous savez que je m'intéresse au Framework multimédia GStreamer présent de base dans les systèmes d'exploitations GNU/Linux. Nous allons dans ce billet voir comment encoder en ligne de commande une source vidéo vers des fichiers aux formats OGG (Theora/Vorbis) et/ou MP4 (H264/AAC).
Pourquoi ces formats ?
Je me limite à ces deux formats pour la simple et bonne raison qu'il se complète dans mon utilisation quotidienne. En effet, le format OGG (Theora/Vorbis), outre le fait qu'il soit basée sur des codecs libres, permet une intégration simplifié des vidéos dans les navigateurs supportant le HTML5 (lire ce billet), de son coté le format MP4 (H264/AAC) est un standard qui permet de lire ce type de fichiers sur une PlayStation 3.
Avant d'encoder...
Avant de commencer, il faut choisir une source de bonne qualité. Les codecs ne font pas des miracles et si la source est mauvaise, les fichiers encodés le seront aussi. Pour mes tests, j'ai récupéré un trailer haute définition sur le site HD-Trailers.net. Les caractéristiques du fichier sont les suivantes:
ffmpeg -i shutterisland-tlr1r2r_h720p.mov Duration: 00:02:22.27, start: 0.000000, bitrate: 6178 kb/s Stream #0.0(eng): Video: h264, yuv420p, 1280x544, 23.98 tbr, 23.98 tbn, 47.95 tbc Stream #0.1(eng): Audio: aac, 48000 Hz, 5.1, s16
Pour jouer cette vidéo sur votre machine, il faut saisir la pipeline suivante:
gst-launch filesrc location=~/Vidéos/shutterisland-tlr1r2r_h720p.mov ! decodebin name=decoder \ decoder. ! queue ! audioconvert ! audioresample ! autoaudiosink \ decoder. ! queue ! ffmpegcolorspace ! autovideosink
Voici le résultat:
Le fichier source a une talle de 11 Mo
Fichier source
Comment encoder ?
En basse qualité
Nous obtiendrons ici des fichiers dont la taille sera réduite mais avec une qualité plus basse, notamment lors des phases ou la caméra bouge beaucoup (par exemple sur les travelings).
Encodage OGG (Theora/Vorbis)
La pipeline:
gst-launch filesrc location=~/Vidéos/shutterisland-tlr1r2r_h720p.mov ! decodebin name=decoder \ decoder. ! queue ! audioconvert ! vorbisenc ! queue ! \ oggmux name=muxer \ decoder. ! queue ! ffmpegcolorspace ! theoraenc ! queue ! \ muxer. muxer. ! queue ! filesink location=~/Vidéos/shutterisland-tlr1r2r_h720p_lq.ogv
Le fichier a une taille 1.7 Mo de donne le résultat suivant:
Fichier basse qualité OGG
Encodage MP4 (H264/AAC)
La pipeline:
gst-launch filesrc location=~/Vidéos/shutterisland-tlr1r2r_h720p.mov ! decodebin name=decoder \ decoder. ! queue ! audioconvert ! faac profile=2 ! queue ! \ ffmux_mp4 name=muxer \ decoder. ! queue ! ffmpegcolorspace ! x264enc pass=4 quantizer=30 subme=4 threads=0 ! queue ! \ muxer. muxer. ! queue ! filesink location=~/Vidéos/shutterisland-tlr1r2r_h720p_lq.mp4
Le fichier a une taille 2 Mo de donne le résultat suivant:
Fichier basse qualité MP4
En moyenne qualité
Nous obtiendrons ici un bon compromis entre la taille des fichiers et la qualité de l'image.
Encodage OGG (Theora/Vorbis)
La pipeline:
gst-launch filesrc location=~/Vidéos/shutterisland-tlr1r2r_h720p.mov ! decodebin name=decoder \ decoder. ! queue ! audioconvert ! vorbisenc ! queue ! \ oggmux name=muxer \ decoder. ! queue ! ffmpegcolorspace ! theoraenc quality=32 ! queue ! \ muxer. muxer. ! queue ! filesink location=~/Vidéos/shutterisland-tlr1r2r_h720p_mq.ogv
Le fichier a une taille 2.8 Mo de donne le résultat suivant:
Fichier moyenne qualité OGG
Encodage MP4 (H264/AAC)
La pipeline:
gst-launch filesrc location=~/Vidéos/shutterisland-tlr1r2r_h720p.mov ! decodebin name=decoder \ decoder. ! queue ! audioconvert ! faac profile=2 ! queue ! \ ffmux_mp4 name=muxer \ decoder. ! queue ! ffmpegcolorspace ! x264enc pass=4 quantizer=25 subme=5 me=2 ref=3 threads=0 ! queue ! \ muxer. muxer. ! queue ! filesink location=~/Vidéos/shutterisland-tlr1r2r_h720p_mq.mp4
Le fichier a une taille 3.6 Mo de donne le résultat suivant:
Fichier moyenne qualité MP4
En haute qualité
Nous obtiendrons ici une très bonne qualité d'image mais une taille importante des fichiers.
Encodage OGG (Theora/Vorbis)
La pipeline:
gst-launch filesrc location=~/Vidéos/shutterisland-tlr1r2r_h720p.mov ! decodebin name=decoder \ decoder. ! queue ! audioconvert ! vorbisenc ! queue ! \ oggmux name=muxer \ decoder. ! queue ! ffmpegcolorspace ! theoraenc quality=48 ! queue ! \ muxer. muxer. ! queue ! filesink location=~/Vidéos/shutterisland-tlr1r2r_h720p_hq.ogv
Le fichier a une taille 5 Mo de donne le résultat suivant:
Fichier haute qualité OGG
Encodage MP4 (H264/AAC)
La pipeline:
gst-launch filesrc location=~/Vidéos/shutterisland-tlr1r2r_h720p.mov ! decodebin name=decoder \ decoder. ! queue ! audioconvert ! faac profile=2 ! queue ! \ ffmux_mp4 name=muxer \ decoder. ! queue ! ffmpegcolorspace ! x264enc pass=4 quantizer=20 subme=6 me=2 ref=3 threads=0 ! queue ! \ muxer. muxer. ! queue ! filesink location=~/Vidéos/shutterisland-tlr1r2r_h720p_hq.mp4
Le fichier a une taille 7.3 Mo de donne le résultat suivant:
Fichier haute qualité MP4
Pour conclure
Nous avons vu dans ce billet les bases de l'encodage de fichiers vidéos avec GStreamer. Il est imporant de signaler que par la magie des pipeline, on pourrait très bien appliquer ces méthodes avec une source live comme une Webcam ou un flux venant d'un serveur de streaming vidéo.
Si vous avez des pipelines d'encodages que vous voulez partager avec les lecteurs de ce blog, les commentaires sont là pour ça !







Open-source

Abonnez-vous
6 commentaires au billet “Encodage de vidéo avec GStreamer”
C'est moi où les vidéos au format MP4 sont bien plus proches de l'original que celles au format ogg ?
(image moins fade, plus de relief ...)
@mikedafunk: c'est vrai avec les profils utilisés. Par contre les fichiers sont plus petits... Je ne sais pas trop si l'on peut comparer "theoraenc quality=32" et "x264enc pass=4 quantizer=20 subme=6 me=2 ref=3 threads=0"... Si des spécialistes de l'encodage passent par là...
Sympa. Ca m'évitera de chercher les options la prochaine fois.
Par contre, ça aurait été bien d'avoir la taille du fichier d'origine pour pouvoir comparer avec celle dles résultats.
[...] Nicolargo : Encodage de vidéo avec GStreamer (tags: video ffmpeg protocol lang:fr howto) [...]
De bon matin, à tête reposée, la différence est flagrante. Les vidéos ogg sont carrément dégueulasses.
Mais tu as raison, je ne sais pas si on peut comparer ces paramètres.
C'est marrant, je n'avais pas eu ce sentiment en voyant les vidéos HD de bick bug bunny. Les couleurs paraissaient mieux rendues sur ma machine, le son y était nettement meilleur.
Et le fichier ogg pèze deux fois moins que le fichier avi. Mais bon il faut voir comment ils les ont encodés... http://www.bigbuckbunny.org/index.php/download/
@manu: je viens de la rajouter dans le billet: 11 Mo...
Publier un commentaire
Utiliser
pour lier des documents à vos commentaires.
Pour des discutions techniques, merci d'utiliser le forum.