Encodage de vidéo avec GStreamer

Date: 17/11/2009 | Catégories: Gstreamer,Open-source,Video | Tags: ,,,,

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:

[shell]
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
[/shell]

Pour jouer cette vidéo sur votre machine, il faut saisir la pipeline suivante:

[shell]
gst-launch filesrc location=~/Vidéos/shutterisland-tlr1r2r_h720p.mov ! decodebin name=decoder \
decoder. ! queue ! audioconvert ! audioresample ! autoaudiosink \
decoder. ! queue ! ffmpegcolorspace ! autovideosink
[/shell]

Voici le résultat:

Le fichier source a une talle de 11 Mo

shutterisland-tlr1r2r_h720p.movFichier 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:

[shell]
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
[/shell]

Le fichier a une taille 1.7 Mo de donne le résultat suivant:
shutterisland-tlr1r2r_h720p_lq.ogvFichier basse qualité OGG

Encodage MP4 (H264/AAC)

La pipeline:

[shell]
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
[/shell]

Le fichier a une taille 2 Mo de donne le résultat suivant:
shutterisland-tlr1r2r_h720p_lq.mp4Fichier 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:

[shell]
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
[/shell]

Le fichier a une taille 2.8 Mo de donne le résultat suivant:
shutterisland-tlr1r2r_h720p_mq.ogvFichier moyenne qualité OGG

Encodage MP4 (H264/AAC)

La pipeline:

[shell]
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
[/shell]

Le fichier a une taille 3.6 Mo de donne le résultat suivant:
shutterisland-tlr1r2r_h720p_mq.mp4Fichier 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:

[shell]
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
[/shell]

Le fichier a une taille 5 Mo de donne le résultat suivant:
shutterisland-tlr1r2r_h720p_hq.ogvFichier haute qualité OGG

Encodage MP4 (H264/AAC)

La pipeline:

[shell]
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
[/shell]

Le fichier a une taille 7.3 Mo de donne le résultat suivant:
shutterisland-tlr1r2r_h720p_hq.mp4Fichier 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 !

  • mikedafunk

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

  • manu

    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.

  • Pingback: links for 2009-11-17 « WhilelM’s little Wor(l)d()

  • mikedafunk

    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…