FFMPEG est un logiciel libre, multi-plateforme, en ligne de commande, de traitement audio et vidéo.
FFMPEG permet de convertir/réencoder des fichiers entre différents formats, d'extraire l'audio d'une vidéo, ainsi que d'appliquer des filtres audios (compression acoustique, égalisation, …) et vidéos (conversion du taux de rafraîchissement, de la résolution, de la colorimétrie, désentrelacement, …). C'est un logiciel aux vastes possibilités, dont je ne connais qu'1%. Je vais simplement sur cette page détailler les quelques commandes auxquelles il m'arrive d'avoir recours.
Conversion d'un 4K/50 en FHD/25 :
ffmpeg -i fichier-original.mp4 -r 25 -vf scale=1920:1080 -c:v libx265 -crf 20 -preset slow -c:a copy fichier-1080.mp4
Bien sûr, les différentes options sont facultatives. Par exemple, on peut omettre -r 25 si on souhaite conserver le taux de rafraîchissement original.
-crf
. Par contre si on souhaite faire du lossless, réduire la latence pour du streaming, ou autre cas particulier, les autres options peuvent être utiles. Voir le wiki.-crf
(réglant la qualité) est élevé, plus l'image est compressée et donc moins la qualité est bonneDe nos jours la plupart des gens utilisent leur téléphone ou leur appareil photo pour filmer. Ça convient à la plupart des situations, mais ces appareils présentent une limitation très contraignante : la durée des vidéos est limitée à 29m59s (pour des raisons juridiques sur lesquelles je ne m'étendrai pas). Si on veut filmer en continu pour une durée plus longue (conférence, pièce de théâtre, entrevue, …), on est obligé de passer par un caméscope, une caméra pro, bref tout appareil destiné en premier lieu à filmer… qui eux ne présentent pas cette limitation.
Il existe cependant une manière de contourner la limitation sur smartphone Android 1), en installant une application de caméra en remplacement de celle fournie avec le smartphone, comme par exemple, l'excellent Open Camera (gratuit)2). Open Camera vous permet en effet de poursuivre automatiquement l'enregistrement vidéo sur un nouveau fichier chaque fois que la limite est atteinte, sans aucune coupure. Il est ainsi possible de filmer en continu pendant des heures si on le souhaite. Il ne restera alors plus qu'à joindre toutes les vidéos ainsi créées en un seul fichier pour une lecture en continu, sans transition. Cette technique permet aussi de s'affranchir de la limitation à 4 Go par fichier présente sur certain téléphones Android et qui peut aussi dépendre du type de système de fichier dans lequel la carte SD a été formatée.
Remarque : tout ce qui suit provient tout simplement du wiki, déjà mentionné plus haut.
On va utiliser le filtre concat demuxer. Celui-ci aura besoin d'un fichier texte contenant les noms de fichiers à assembler. On va générer ce fichier automatiquement en ligne de commande. Il suffit de se rendre dans le dossier contenant les vidéos et d'entrer les commandes suivantes :
Linux :
printf "file '%s'\n" ./*.mp4 > liste.txt
Windows :
(for %i in (*.mp4) do @echo file '%i') > liste.txt
Une fois le fichier texte créé, on peut lancer la concaténation avec la commande :
ffmpeg -f concat -safe 0 -i liste.txt -c copy fichier.mp4
C'est tout ! Quelques secondes plus tard, un nouveau fichier vidéo nommé fichier.mp4 aura été créé. Il contiendra toutes les vidéos à la suite sans coupure.
FFMPEG a un filtre appelé loudnorm
qui permet de niveler le son selon la norme EBU R128. Si je comprends bien, c'est l'addition d'un normaliseur, un AGC lent et un Peak Limiter. Ça n'agit donc pas comme ReplayGain ou une normalisation classique, qui se contentent d'ajuster le niveau global de manière linéaire en fonction du passage où le volume de la piste est le plus fort. Au contraire loudnorm
va quand à lui dénaturer de manière irréversible la piste sonore par écrasement de la dynamique en rendant plus fort certains passages faibles et vice-versa. Ça ne me pose pas de problème mais il faut le signaler. Par défaut, loudnorm
copie le résultat de son travail dans un sous-dossier.
On peut bien entendu l'utiliser sur des vidéos mais également sur des signaux audio seuls. Ça pourrait être une solution facile pour les petits podcasteurs qui n'ont pas forcément les compétences techniques pour régler des chaînes de compression, etc. dans leur éditeur audio.
J'ai trouvé lournorm
très efficace pour du contenu de type documentaire, voix, musique de fond ou classique. Pour de la musique moderne, du rock ou quoi que ce soit ayant une dynamique variant de manière rapide, je ne l'ai pas trouvé adapté : c'est un AGC lent, on a donc une variation de volume sur plusieurs secondes comme si quelqu'un tournait progressivement le bouton de volume, ce qui est très audible par exemple au passage entre un couplet calme et un refrain pêchu. Je précise que je ne l'ai testé qu'avec ses réglages par défaut, mais il est possible d'utiliser ses propres paramètres.
Voici ce qu'en dit le créateur du filtre : http://k.ylo.ph/2016/04/04/loudnorm.html
Le wiki FFMPEG en parle en bas de cette page : https://trac.ffmpeg.org/wiki/AudioVolume
Pour plus de facilité, j'utilise ce script Python : https://github.com/slhck/ffmpeg-normalize avec la syntaxe suivante :
ffmpeg-normalize fichier.mp4 -c:a libopus -b:a 192k -ar 48000 -ext opus
loudnorm
ré-échantillonne à 192 kHz pour effectuer son travail, il est nécessaire de préciser qu'il faut redescendre à 48 kHz au moment de l'encodage final. En l'occurence, ça ne semble pas obligatoire pour Opus qui ne connait que cette fréquence d’échantillonnage, mais c'est une bonne habitude à prendre en cas d'utilisation d'autres formats, qui eux permettent un encodage à 192 kHz.Il est aussi possible d'utiliser la syntaxe suivante pour effectuer une simple normalisation sur les crêtes à 0 dB, sans modification de la dynamique :
ffmpeg-normalize fichier.mp4 -nt peak -t 0 -c:a libopus -b:a 192k -ar 48000 -ext opus
ffmpeg -i video.mp4 -af “aresample=async=1” audio.wav
Ceci a pour effet d'allonger ou rétrécir certains échantillons (de manière imperceptible) afin que son et image restent synchronisés. Pour information, ça a réduit sur une vidéo de 4 heures le décalage à seulement une dizaine de millisecondes. Ce qui n'était plus problématique, mais n'était toujours pas la durée exacte de la vidéo.
ffmpeg -i video.mp4 [-compression_level 12] [-sample_fmt s16] audio.flac
La détection du format est automatique avec l'extension du nom de fichier.
Pour simplement extraire une piste audio qu'on ne souhaite pas retravailler, il suffit d'extraire les données telles quelles sans conversion.
Pour ce faire, il faut d'abord connaître quel codec sonore est utilisé dans la vidéo :
ffprobe video.mp4
Muni de cette information, on peut lancer la commande d'extraction. Prenons l'exemple où le codec audio utilisé est le AAC d'Apple, on utilisera :
ffmpeg video.mp4 -vn -acodec copy audio.aac
-vn
précise qu'on ne veut pas la vidéo-acodec copy
précise d'utiliser le flux audio déjà présent