Encodage H.264 avec GStreamer
GStreamer est un programme de manipulation audio-vidéo. Il est notamment utilisé par le logiciel de montage Pitivi pour l’encodage. Je vais donc tester les paramètres d’encodage pour trouver ceux qui me conviennent le mieux.
Pour le montage des films du petit dernier, je cherche surtout des paramètres qui préservent la qualité de la prise de vue. La taille du fichier passe ensuite.
Protocole de test
J’ai pris une séquence avec les paramètres du caméscope (Sony HDR-CX220) offrant la meilleure qualité. Cela me donne un fichier 00001.MTS
dont j’ai changé le conteneur en MP4 sans réencoder (le MTS posait problème à GStreamer) :
avconv -i 00001.MTS -codec copy in.mp4
Ensuite j’utilise GStreamer pour extraire une courte séquence (je saute 20s et j’extrais 2s), et l’encoder en H.264 en faisant varier les paramètres de la commande x264enc
(NB : l’utilisation de gnlfilesource
nécessite l’installation du package gstreamer0.10-gnonlin
). Puis j’extrais une image (1s après le début, et en PNG pour ne pas perdre en qualité), et je n’en garde qu’une partie pour observer les détails :
gst-launch-0.10 gnlfilesource location="$PWD/in.mp4" media-start=20000000000 media-duration=2000000000 ! x264enc pass=5 quantizer=21 ! mp4mux ! filesink location=out.mp4
avconv -ss 00:01:00 -i out.mp4 -vframes 1 out.png
mogrify -crop 640x200+1000+0 out.png
pass
peut prendre les valeurs suivantes :
- 0 : cbr - Constant Bitrate Encoding (default)
- 4 : quant - Constant Quantizer (debugging only)
- 5 : qual - Constant Quality
- 17 : pass1 - VBR Encoding - Pass 1
- 18 : pass2 - VBR Encoding - Pass 2
- 19 : pass3 - VBR Encoding - Pass 3
Résultats (taille du fichier)
x264enc (404 Ko)
x264enc pass=4 quantizer=21 (4,8 Mo !)
x264enc pass=5 quantizer=10 (452 Ko)
x264enc pass=5 quantizer=21 (452 Ko)
x264enc pass=5 quantizer=30 (400 Ko)
x264enc pass=17 (308 Ko)
x264enc pass=18 (552 Ko)
x264enc pass=19 (544 Ko)
Conclusion
La qualité obtenue avec le VBR en 2 passes est sensiblement meilleure qu’avec les méthodes en 1 passe. La durée d’une 3e passe n’est pas justifiée. Je retiens donc le VBR en 2 passes.
Attention pour encoder un fichier en VBR 2 passes il faudra effectivement lancer les 2 passes, et penser à nettoyer le fichier généré par la 1ère :
gst-launch-0.10 filesrc location="$PWD/in.mp4" ! decodebin2 ! progressreport ! x264enc pass=17 ! fakesink
gst-launch-0.10 filesrc location="$PWD/in.mp4" ! decodebin2 name=demux ! queue ! audioconvert ! audioresample ! 'audio/x-raw-int, rate=44100' ! faac bitrate=128000 ! mp4mux name=mux ! filesink location=out.mp4 demux. ! queue ! progressreport ! x264enc pass=18 ! mux.
rm -f x264_2pass.log*
Cet article publié en décembre 2015 a été mis à jour.