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 :
- ouvrir le dossier contenant le fichier à convertir
- cliquer sur la touche windows, puis écrire "cmd"
- presser entré, cela ouvre l'invite de commande, autrement appelé terminal
- on glisse le dossier qui contient le fichier à transcoder, l'adresse du dossier s'affiche alors !
Sous Linux & Maccintosh :
- ouvrir le dossier contenant le fichier à convertir
- clic droit, ouvrir le terminal ici (ou truc du genre en fonction des distros !)
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 :
- ouvrir l'invite de commande (déjà fait si vous suivez bien !)
- aller dans le dossier de travail (ou se trouve votre fichier... Déjà fait aussi !)
- Coller la ligne de commande ci-dessous en remplaçant juste le nom du fichier avec extension (attention aux majuscules et chaques point et virgules !)
ffmpeg -i MA_VIDEO.mkv -vcodec libx264 -acodec aac MA_VIDEO_X264.mp4
- pressez entré !
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)
- AVI
- MOV
- M4V
- MP4
- FLV
- MXF
- MKV
- WebM
- ...
le codec
- h264
- MPEG-2
- MPEG-4
- HEVC (ou h265)
- VP9
- Prores
- DnxHR
- ...
É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
- -i : pour préciser son "input" ou quel fichier sans oublier de noter l'extension.
- -vcodec , -acodec ou -c:v , -c:a : c'est pour préciser le codec que l'on veut.
- -vb : pour préciser le débit cible voulu en vidéo.
- -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.
- -r : changer la fréquence d'image (pour framerate)
- -s : pour scale, soit changer la résolution
- -ar : changer la fréquence audio
- -ac : changer le nombre de canaux audio
- -ab : changer le débit audio
- -an : supprimer tout les audios
| -pix_fmt | -preset | -tune | -profile |
| yuv420p | ultrafast | film | baseline |
| yuvj420p | superfast | animation | main |
| yuv422p | veryfast | grain | high |
| yuvj422p | faster | stillimage | high10 |
| yuv444p | fast | fastdecode | high422 |
| yuvj444p | medium | zerolatency | high444 |
| gbrp | slow | ||
| yuv420p10le | slower | ||
| yuv422p10le | veryslow | ||
| 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 là ! 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 :
- -i input.mxf : c'est le nom du fichier qui se trouve dans le dossier que vous voulez transcoder. Il faut donc préciser le nom de ce dernier derrière la clef "--input" abrégé en "-i"
- -c:v libx265 : libx265 est la librérie préinstallé dans les derniers FFMPEG pour transcoder en HEVC. "-c" est la clef pour "--codec" et ":v" précise que l'on travail sur le flux vidéo.
- -pix_fmt yuv420p10le : c'est l'échantillonage et la profondeur l'encodage respectivement 420 et 10bit.
- -preset superfast : c'est le preset d'encodage qui accélère la vitesse d'encodage, mais également la taille du fichier.
- -crf 18 : encodage en débit variable la qualité dépend de ce nombre. à 0 on ne perd pas de qualité, à 63 on a un fichier trèèès léger mais irregardable !
- -c:a aac : le codec audio comme pour la vidéo. "-c" est "--codec", ":a" précise que l'on travail sur le flux audio et "aac" est un codec audio, largement utilisé pour la diffusion peertube, facebook, youtube, vimeo et autre plateforme en ligne.
- -b:a 128k : débit audio réglé à 128Kb/s. "-b" est l'abbréviation de "--bitrate" et ":a" précise que l'on travail sur le flux audio.
- output.mp4 : c'est le nom du fichier qui va être créé !
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 :
- -r : pour changer le résolution d'une vidéo
- -b 1M : pour être en débit cible à 1Mb/s
- -g 12 : pour mettre le GOP (group of picture) à 12.
- -refs 16 : pour mettre jusqu'à 16 P-frame (image prédites)
- vf scale=-1:720 : pour scale en 720p et proportionnellement la largeur. on pourrait mettre 1280:-1 pour scale la hauteur proportionnellement (ou mettre des chiffres de pirates et casser les codes !)
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 -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 ! :)