l’encodage H264 sur ffmpeg

Il est important de comprendre comment les bons paramètres ffmpeg influencent sur la qualité de la vidéo. En général, plus le bitrate est haut, plus la qualité sera au rendez-vous. Avec un même bitrate aussi, la vidéo en H265 sera de bien meilleur qualité qu’une vidéo avec son prédécesseur H264. Dans cet article, on va s’intéresser à ce paramètre avec l’encodeur x264, le plus répandu, ainsi que les différentes options qui s’offrent à nous pour pouvoir manipuler correctement la compression vidéo avec ce codec. Notez qu’à travers les exemples, on va se servir principalement de ffmpeg.  

Note : cet article sera bientôt mis à jour avec des sections pour parler des B-frames, des GOP (Group of Pictures), des espaces couleurs (pix_fmt) et d’autres petits détails pour peaufiner les réglages.

C’est quoi le bitrate ?

  Pour faire simple, le bitrate, c’est la quantité de donnée sur une seconde. Plus le bitrate est haut, meilleur est la qualité de la vidéo et plus importante sera la bande passante pour lire la vidéo et par conséquent la taille du fichier. Donc un contenu vidéo qui tourne à 1 megabyte par seconde donnerait en bitrate 8 megabits par seconde (8mpbs). Une vidéo sur YouTube en 1080p est habituellement à 8mbps, un DVD à 6mbps… etc.   Vous l’auriez compris : choisir le bon bitrate, c’est choisir la bonne compression de la vidéo, en minimisant la perte.  

Choisir le bon bitrate

  Il est important de prendre en considération l’appareil où on va visionner la vidéo. Cela diffère d’un appareil à un autre, donc choisir en priorité sur quel appareil la vidéo va être le plus diffusé. Voici une liste liste non exhaustive des différentes possibilités par rapport à la taille et/ou plateforme :   Il existe ce qu’on appel le CBR (Constant Bit Rate) où l’on fixe un seuil à ne pas dépasser et le VBR (Variable Bit Rate) où le bitrate peut varier sur le temps, tout en respectant une certaine marge. Un point important à considérer : l’encodage en VBR produit une vidéo de bien meilleur qualité qu’avec l’encodage en CBR, tout simplement parce que dans les segments les plus complexes de la vidéo (trop de détail, mouvement rapide, nuage de point comme l’introduction de HBO…etc.) : il peut ne pas y avoir assez de marge pour encoder proprement la vidéo, cela risque d’être restrictive. Le VBR s’adapte très rapidement à ce genre de situation et donne plus de bitrate dans ces parties, moins ailleurs (image fixe, pas trop d’interpolation de mouvement, peu de détail comme le ciel… etc).   Le CBR est par contre très utile lors d’événement diffusé en live ou dans les diffusions par satellites, où les chaînes ont généralement une limite de bande passante à ne pas franchir.     En règle générale, vaut mieux toujours choisir son bitrate et le type d’encodage à chaque fois qu’on exécute une commande sur ffmpeg et ne pas laisser ce dernier choisir pour nous, sauf si on fait un -c:v copy, c’est à dire qu’on copie tout simplement le stream vidéo, utiliser généralement quand ont mets aucun -vf, par exemple lors d’un simple cut (-ss, -t etc).   Remarque concernant les valeurs par défaut de ffmpeg : si vous ne spécifiez pas les réglages pour le x264, la valeur par défaut sera un crf 23, le preset medium et le profile High.   Quoiqu’il en soit, choisir un bon bitrate dépend vraiment de l’utilisation finale de la vidéo : archivage ? diffusion ? quel support ? montage ?  

Encoder en CBR

Malheureusement, dans le codec H264, le CBR n’est pas aussi constant qu’on le pense, mais on essayes de s’approcher le plus possible du résultat grâce à cette commande :   ffmpeg -i video.mp4 -c:v libx264 -b:v 1500k -minrate 1000k -maxrate 2000k -bufsize 60k output.mp4   Sachant que la valeur du bufsize c’est bitrate voulu / nombre d’image par seconde (1500k / 25fps par exemple). Dans cet exemple, j’ai fixé 1500k comme bitrate avec un minimum de 1000k et un maximum de 2000k (une moyenne approximative !). avec ça, on peut se “rapprocher” du résultat. Basé sur la valeur du -bufsize, ffmpeg va calculer et corriger la moyenne du bitrate produit. Pour en savoir plus. Au final, avoir un bitrate final de 1088k en H264 alors qu’on a choisit 1500k est tout à fait normal !

Le CRF

Si on ne veut aucune perte de qualité, on fait généralement -c:v libx264 -crf 23, CRF c’est le Constant Rate Factor, sachant que le -crf 0 c’est aucune perte, entre 18 et 23 c’est l’idéal et enfin au dessus de 23 jusqu’à 51 c’est un export avec perte. Mais attention, le résultat du -crf 0, c’est une taille de fichier énorme, à éviter donc.  

c’est un peu comme dire je veux garder une bonne qualité : à toi, codec, de choisir le bitrate qui va avec ! Si on a deux vidéos différentes, qu’on choisit le même CRF, on aura comme résultat pas forcement le même bitrate. Choisir aussi le CRF qui s’adapte le mieux à votre utilisation : si c’est pour créer des fichiers proxys pour le montage, un CRF de 30 serait judicieux. Si c’est pour l’archivage sans perte, un CRF de 18 serait parfait. À vous de faire les essais nécessaires.   NOTE : un changement de valeur du CRF de ± 6 équivaut à la moitié/double de la taille. Exemple d’utilisation avec ffmpeg : 

ffmpeg -i video.mp4 -c:v libx264 -crf 23 output.mp4

Les presets

  Un preset, c’est une option qu’on fournit à ffmpeg pour achever une certaine qualité à une certaine vitesse de compression. Le preset veryslow va donner comme résultat une meilleure compression. Donc si vous visez une certaine taille de fichier, vous êtes plus susceptible d’y arriver avec un preset slow. Pour en savoir plus.  

Les profiles

  Les profiles assurent la compatibilité entre les différents appareils. Généralement, un profile Baseline restreint la lecture à des fonctionnalités basiques. Encoder avec ce profil permet facilement de faire des sautes dans le temps même quand l’appareil est faible, comme les vieux téléphones intelligents…etc.   Il faut savoir que les profiles influencent indirectement la qualité de la vidéo finale. Certaines fonctionnalités du profile High peuvent te permettre d’atteindre une qualité supérieure avec une taille de fichier moindre comparé à un profile Baseline.   Pour résumé : Baseline pour les appareils faibles, Main et High pour le streaming, les films, pour la télévision…etc.  

Le Tune

Vous pouvez spécifier un Tune qui correspond au mieux à la sortie. Ceci va activer un deblocking filter, un filtre anti-blocs qui va améliorer la qualité visuelle en atténuant les effets de blocs et lissé l’image. Vous voyez les blocs de pixels 4×4 qui détériorent l’image ? ce filtre va tout simplement venir adoucir ces blocs. Il en existe une dizaine, allant de film pour un lissage bas, animation pour un lissage fort, stillimage est idéal pour les contenus avec des slideshows, zerolatency pour le contenu streaming…etc. Ce paramètre est totalement optionnel, mais recommandé.

La commande à retenir : encodage Two-Pass

Pour atteindre un bitrate spécifique, c’est la méthode à retenir. Si vous connaissez d’avance le bitrate voulu, vous pouvez sauter à la prochaine étape.   le calcul est simple : bitrate = taille du fichier / durée de la vidéo.   Par exemple, on a une vidéo de 5 minutes (300 secondes) et la taille désiré sera de 200mo : 200 * 8192 (convertir le mb en kilobits) / 300 = environs 5,461 kilobits/secondes   Pour ce type d’encodage, il faut rouler ffmpeg à deux reprises avec pratiquement les mêmes réglages.

Voici un exemple de commande :

1 PASS :

ffmpeg -i video.mp4 -pix_fmt espacecouleur -vsync 1 -sn -r fps -threads 0 -c:v libx264 -b:v bitrate -bufsize xxxx -maxrate xxxx -minrate xxxx -an -pass 1 -preset preset -profile:v profile -g x -tune tune -x264opts no-scenecut -f mp4 -y /dev/null

2 PASS : 

ffmpeg -i video.mp4 -pix_fmt espacecouleur -vsync 1 -sn -r fps -threads 0 -c:v libx264 -b:v bitrate -bufsize xxxx -maxrate xxxx -minrate xxxx -an -pass 2 -preset preset -profile:v profile -g x -tune tune -x264opts no-scenecut -f mp4 -y output.mp4

Les mêmes valeurs on été utilisé dans les deux pass.la première commande a pour sortie null, ffmpeg va créer un log qu’il va réutiliser lors de la seconde commande. Ne jamais changer les valeurs entre les deux commandes.

Emir C. Écrit par :

Soyez le premier à commenter

Laisser un commentaire

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