👈 Retour sur le blog

FFmpeg transcoder en 2 temps 3 mouvements !

Tout d'abord, il fallait que je présente le commodore FFMPEG. C'est un p'tit gars que l'on retrouve sur toutes les mers : Linux, Windows, Mac... On peut même l'installer sur une raspberry ou autre micro-ordi... Dieu sait que les vidéastes indépendant, cinéastes, filmmakers, réalisateurs et autre bleusaille de l'audiovisuel sont tous victime de bug d'encodage !

Pour l'installer, c'est par ici : https://ffmpeg.org/download.html
Vous ne trouverez pas de logiciel par icone, car il fonctionne en ligne de commande. Quésaquo ? Regarde l'intro !

INTRO !

Sous windows :

Sous Linux & Maccintosh :

J'espère que vous me suivez bien ! Parce ça n'fait que commencer !!! Mouhahahahaha

Commençons directement dans le dur. On va convertir une vidéo pour vous prouver que mon titre n'est pas menteur :

ffmpeg -i MA_VIDEO.mkv -vcodec libx264 -acodec aac MA_VIDEO_X264.mp4

J'avoue.. Je vous ai menti... ça fait 4 mouvement. Mais maintenant vous avez la satisfaction d'avoir une superbe vidéo réencodé prête pour affronter le monde d'internet, avec le codec h264, x264 ou encore autrement appelé MPEG-4 !

Si ça vous botte et que vous avez tout compris, voilà la doc du FFMPEG pour aller plus loin par vous même !

Et si vous trouvez que j'explique super trop bien... Bah merci d'abord ! et je continue :D
enfin je commence à expliquer ce qu'on fait plutôt.

Les Codecs et Conteneurs

Je vais résumer cet article sur ce qu'est encoder ou transcoder une vidéo.

Encoder une vidéo, c'est transformer pour l'alléger, réduire sa qualité, avoir une compatibilité pour un support de diffusion... d'après Philippe Bellaïche c'est :

chercher à exploiter les caractéristiques psychovisuelles de l'oeil humain pour restreindre l'encombrement du signal vidéo.

Codec est d'ailleurs un assemblage de codeur / décodeur.

Il y aura alors deux éléments à prendre en compte pour la partie codage,

le conteneur (ou capsule)

le codec

Éclatez vous et tappez les lignes de code : "ffmpeg -codecs" et "ffmped -formats" pour voir ce que le petit logiciel FFMPEG a dans le ventre !

! à éviter si gueule de bois !

Ceux présenté sont juste pour la vidéo. Il y en aura d'autres spécifiques à l'audio comme le AAC, FLAC, WAV... et au monde de la photo comme JPEG, TIFF, PNG... Bref, j'en passe. En plus l'article n'est pas là dessus !

les principaux outils

Il y a beaucoup d'outils différents. Ici nous allons utiliser le logiciel FFMPEG. Vous en avez d'autres plus ou moins puissant, payants et gratuits : Handbrake qui utilise les librairies de FFMPEG aussi, adobe media encodeur, Avidemux... Et encore plus qu'on peut trouver sur notre ami Goo... Qwant pardon !

Il y a quelques bases à avoir et à savoir pour bien utiliser ffmpeg. Voici une bonne dose :

la notice du x264, tapez : "x264 --fullhelpx

  1. -i : pour préciser son "input" ou quel fichier sans oublier de noter l'extension.
  2. -vcodec , -acodec ou -c:v , -c:a : c'est pour préciser le codec que l'on veut.
  3. -vb : pour préciser le débit cible voulu en vidéo.
  4. -crf : débit variable. Pour x264 il est par défaut à 23 et pour x265 par défaut à 28. à 0, c'est sans perte. à 51 pour le x264 et 63 pour le x265, c'est compression maximal.
  5. -r : changer la fréquence d'image (pour framerate)
  6. -s : pour scale, soit changer la résolution
  7. -ar : changer la fréquence audio
  8. -ac : changer le nombre de canaux audio
  9. -ab : changer le débit audio
  10. -an : supprimer tout les audios
-pix_fmt-preset-tune-profile
yuv420pultrafastfilmbaseline
yuvj420psuperfastanimationmain
yuv422pveryfastgrainhigh
yuvj422pfasterstillimagehigh10
yuv444pfastfastdecodehigh422
yuvj444pmediumzerolatencyhigh444
gbrpslow
yuv420p10leslower
yuv422p10leveryslow
yuv444p10le
gbrp10le
yuv420p12le
yuv422p12le
yuv444p12le
gbrp12le
gray
gray10le
gray12le

Application concrète

On va voir ici simplement un codec. Se sera le même schéma à chaque fois, pour n'importe quel codec. C'est juste que vous allez surement devoir chercher dans la notice ! ou avec la ligne de code "ffmpeg -h encorder=libx265" !Donc c'est cool de savoir quand même quel codec utiliser. Je vous renvoie donc sur cet article spécialement dédié à quel codec pour quel utilité.

Maintenant que vous avez vu qu'il faut quand même faire un peu de recherche, on enregistre tout ça dans des bloc-notes ou bien enfoui dans le cerveau.

J'utilise le transcode de ffmpeg actuellement dans le but simple d'avoir des fichiers léger et de bonne qualité pour mes clients. J'export de Davinci Resolve (mon logiciel de montage) un DNxHR HQX 422 10bit à 185Mb/s généralement comme Master. Beaucoup trop lourd et ilisible sans decodeurs adéquates !

Voici une ligne de commande simple qui permet d'encoder en HEVC (autrement appelé h265 ou x265 ici) :

ffmpeg -i input.mxf -c:v libx265 -pix_fmt yuv420p10le -preset superfast -crf 18 -c:a aac -b:a 128k output.mp4

cette ligne expliquée points par point :

donc vous retrouverez les infos des vidéos créés en téléchargeant un petit outil magic qui s'appel média info. Autre solution, dans le terminal taper "ffmpeg -i monfichier.mp4"

besoins supplémentaires :

normaliser l'audio :

Dans la vie, il y a des norme, et une en particulier la norme Loudness que je vous explique dans cet article.

Ici, grâce à cette outil magique, vous n'avez même plus besoin de vous casser la tête à être très précis d'une vidéo à l'autre. FFmpeg va tout normaliser pour vous. Cette exemple prend les valeurs pour un export Youtube :

ffmpeg -i input.mxf -c:v libx265 -pix_fmt yuv420p10le -preset superfast -crf 18 -c:a aac -b:a 128k -af loudnorm=i=14:lra=9:tp=9 output.mp4

On a ajouter un "filtre audio" (af ou audio filter) il s'appel loudnorm. Si vous voulez plus d'info dessus, tapez juste dans votre invite de commande :

ffmpeg -h filter=loudnorm

Vous avez plus qu'à rechercher les valeurs qu'ils vous faut.

Faire des batch

Pour transcoder tout un dossier ou tout un type de fichier en même temps, il faut d'abord créer un dossier avec cette ligne de commande :

mkdir proxy

Ensuite on va simplement entrer cette ligne de commande :

for f in *.MOV; do ffmpeg -i "$f" -c:v prores -profile:v 0 -c:a copy proxy/"${f%.*}.MOV"; done

Bouhm ! Coup de canon, on attend, tout flotte comme sur de l'eau douce !

Et on sait maintenant comment assigner un type de fichier. On sait également comment créer un dossier et transcode dans ce dossier ! Petite astuce de dernière minute, si vous remplacez "*.MOV" par "*.*" ça va prendre en compte TOUT les fichier du dossier. Peu importe l'extension !

Vous l'aurez compris... On fait un batch pour créer nos proxy maintenant !

J'en pleure tellement que c'est beau !

EXTRA

À la date d'écriture de cette article sur les codec, conteneur et tout ce charbiat (20 septembre 2020). Youtube, Facebook, Netflix, Vimeo et tant d'autre commencent à utiliser un codec qui est encore en mode expérimentale dans FFmpeg : le AV1 (dérivé du VP9) mais cette fois il est développé plus au moins par tout le monde, donc il va être supporté en hardware par : Google, Mozilla, Intel, AMD, ARM, Netflix, Nvidia, VLC... Et tant d'autres.

ffmpeg -i input.mp4 -c:v libaom-av1 -strict experimental -b:v 2M -pass 1 -an -f null /dev/null && \

ffmpeg -i input.mp4 -c:v libaom-av1 -strict experimental -b:v 2M -pass 2 -c:a libopus output.mkv

CONCLU

quelques petites lignes de codes gratuites, j'suis comme ça... J'ne garde pas mon butin que pour moi !

Pour une vidéo client :

ffmpeg -i input.mxf -c:v libx264 -pix_fmt yuv420p -b:v 3M -preset ultrafast -vf scale=-1:720 -c:a aac -b:a 128K output.mp4

Pour une vidéo sur votre site web en lancement automatique :

ffmpeg -i input.mxf -c:v libvpx-vp9 -pix_fmt yuv420p -b:v 2M -vf scale=-1:720 -c:a libvorbis -b:a 128K output.WebM 

ou en 2 pass :

ffmpeg -i input.mxf -c:v libvpx-vp9 -b:v 2M -pass 1 -an -f null /dev/null && \

ffmpeg -i input.mxf -c:v libvpx-vp9 -b:v 2M -pass 2 -c:a libvorbis -ar output.webm

Pour une vidéo youtube (recommandation youtube 1080 & 2160 en 24, 25 ou 30p avec son en stéréo) :

ffmpeg -i input.mxf -c:v libx264 -pix_fmt yuv420p -b:v 8M -bt:v 2M -pass 2 -c:a aac -b:a 384K output.mp4

ffmpeg -i input.mxf -c:v libx264 -pix_fmt yuv420p -b:v 40M -bt:v 5M -c:a aac -b:a 384K output.mp4

Youtube max qualité en HDR :
Alors cette ligne de commande, je l'ai trouvé sur un article de Chris Griffith de codecalamity.com

ffmpeg -i input.mxf -map 0 -c:v libx265 -x265-params hdr-opt=1:repeat-headers=1:colorprim=bt2020:transfer=smpte2084:colormatrix=bt2020nc:master-display=G(8500,39850)B(6550,2300)R(35400,14600)WP(15635,16450)L(40000000,50):max-cll=0,0 -crf 20 -preset slower output.mkv

Ce truc que j'ai trouvé sur le site de google pour du HDR à faible débit :

ffmpeg -y -report -i input.mxf -b:v 6000000 -pass 2 \
-pix_fmt yuv420p10le \
-color_primaries 9 -color_trc 16 -colorspace 9 -color_range 1 \
-maxrate 8000000 -minrate 4000000 \
-profile:v 2 -vcodec libvpx-vp9 \
output.webm

Pour une vidéo bonne qualité diffusion sur une télé ou enregistrer un espèce "master compressé" :

ffmpeg -i input.mxf -c:v libx265 output.mp4

Ce qu'on vient d'apprendre

Bref... C'est cool tout ça ! Et maintenant en écrivant 1 ligne (ou en copiant le captain ou les trucs que lui a copié), et même pas trop compliqué, on peut transcoder une vidéo. 
J'apprend encore, et il se peut qu'il y ai quelques petites erreurs. Si c'est le cas, n'hésitez pas à me le dire là dessous ! :)

Bonne journée les moussaillons ! :D