Ustensiles numériques

FFMPEG

FFMPEG est un outil en ligne de commande permettant de modifier, convertir et enregistrer des vidéos ou de l'audio. Il permet entre autres d'ajouter ds sous-titres à une vidéo, de modifier sa piste audio, de modifier son framerate ou encore d'appliquer des filtres à l'image.

Sous Linux, on peut l'installer en ligne de commande. Pour Ubuntu et Debian :

sudo apt-get install ffmpeg

Sous Manjaro/ArchLinux :

sudo pacman -S ffmpeg

Pour installer FFMPEG sous Mac ou Windows, il faut télécharger les fichiers d'installation correspondants sur : https://ffmpeg.org/download.html

Manipulation basique de vidéo

La syntaxe des commandes FFMPEG suivra le plus souvent cet ordre :

ffmpeg -i <fichier d'entrée> <paramètres> <fichier de sortie>

Le premier argument de la commande sera presque toujours -i <fichier d'entrée>, la vidéo de départ sur laquelle on veut appliquer une transformation. Puis on fera suivre les paramètres souhaités et enfin le nom de la nouvelle vidéo à enregistrer après que FFMPEG ait fini son travail.

Modifier le framerate

Avec FFMPEG, on peut en quelques secondes faire des modifications simples sur des vidéos. Par exemple, pour changer le framerate d'une vidéo (son nombre d'images par seconde), on peut utiliser la commande suivante :

ffmpeg -i video_de_base.mp4 -filter:v fps=10 video_avec_nouveau_framerate.mp4

L'argument fps=10 est ce qui détermine le framerate de la vidéo de sortie. Il faut modifier ce chiffre pour obtenir un autre framerate.

Couper une vidéo

On peut aussi facilement couper une vidéo avec FFMPEG. Par exemple, si on veut couper les 10 dernières secondes d'une vidéo, on peut utiliser la commande :

ffmpeg -sseof -10 -i video_de_base.mp4 -c copy video_coupee.mp4

L'argument -sseof signifie qu'on va compter les secondes à couper à partir de la fin de la vidéo, et l'argument qui suit (-10) correspond au nombre de secondes à retirer de la vidéo. On pourrait aussi vouloir couper une partie spécifique de la vidéo. Dans ce cas on va utiliser cette commande :

$ ffmpeg -i video_de_base.mp4 -ss 00:05:10 -to 00:15:30 -c:v copy -c:a copy video_coupee.mp4

L'argument -ss 00:05:10 correspond au moment où l'on va commencer à couper la vidéo, et -to 00:15:30 à celui où on arrête. La partie de la vidéo se trouvant entre ces deux durées sera retirée et le reste de la vidéo sera monté ensemble.

Ajouter du son à une vidéo

Si on a une vidéo sans son et qu'on veut lui ajouter une piste sonore, il suffit d'utiliser la commande :

ffmpeg -i son_video.wav -i "video.mp4" -shortest "film_son.mp4"  

Monter une vidéo à partir d'images fixes

Si on veut faire du stop motion ou simplement monter une vidéo à partir d'images fixes, on peut le faire avec FFMPEG. Il faut que toutes les images se trouvent dans le même dossier et soient nommées avec un numéro croissant en fonction de leur ordre d'apparition (par exemple nommer les images img01.jpg, img02.jpg, etc. jusqu'à la fin de la série). Quand le dossier d'images est prêt, on peut générer la vidéo avec cette commande :

ffmpeg -i mon_dossier_images/img%02d.jpg -framerate 1 film.mov

La notation %02d est une syntaxe spéciale signifiant qu'on recherche des numéros croissants dans la série d'images. Voilà le résultat :

Superposer deux vidéos

Voici nos deux vidéos de départ :

Si on veut les superposer en transparence, on peut utiliser le script FFMPEG suivant :

ffmpeg \
-i video1.mp4 -i video2.mp4 \
-filter_complex " \
[0:v]setpts=PTS-STARTPTS, scale=480x360[top]; \
[1:v]setpts=PTS-STARTPTS, scale=480x360, \
format=yuva420p,colorchannelmixer=aa=0.5[bottom]; \
[top][bottom]overlay=shortest=1" \
-acodec aac -vcodec libx264 out.mp4

Voilà le résultat du script :

Appliquer des filtres

Filtres vidéo

FFMPEG possède de très nombreux filtres vidéo et audio pour modifier ses fichiers. Les commandes de filtres ressemblent à ceci :

ffmpeg -i <input> -filter_complex "ici les filtres utilisés" <output> 

On a comme toujours un fichier d'entrée (-i <input>), puis les filtres (-filter_complex suivi des réglages souhaités) et enfin un fichier de sortie (<output>). Voici un exemple simple de filtre pour retourner horizontalement l'image d'une vidéo :

ffmpeg -i video_de_base.mp4 -filter_complex "[0:v]hflip[out0]" -map "[out0]" video_retournee.mp4

Autre exemple ci-dessous : un filtre pour appliquer un flou gaussien à l'image d'une vidéo.

ffmpeg -i video_de_base.mp4 -filter_complex "[0:v]gblur=sigma=5:steps=5:planes=15:sigmaV=-1[out0]" -map "[out0]" video_floue.mp4

Ou encore cette commande qui permet de modifier la teinte et la saturation des couleurs d'une vidéo :

ffmpeg -i video_de_base.mp4 -filter_complex "[0:v]hue=h=2:s=1:H=2:b=0[out0]" -map "[out0]" video_modifiee.mp4

Filtres audio

On peut aussi n'appliquer des filtres qu'à l'audio d'une vidéo. FFMPEG possède en effet des dizaines de filtres dédiés au son. Attention, si on n'applique qu'un filtre audio sur une vidéo, le fichier généré sera seulement un son (l'image disparaîtra). Par exemple pour appliquer un effet de compresseur à une piste sonore :

ffmpeg -i film_avec_son.mp4 -filter_complex \
"[0:a]acompressor=level_in=10:mode=downward:ratio=5:attack=50:release=250:makeup=1:knee=2.82843:link=average:mix=1[out0]" \
-map "[out0]" son_modifie.mp4

Mélanger filtres audio et vidéo

On peut appliquer en même temps un filtre à l'image d'une vidéo et à sa piste sonore. Voici par exemple un filtre vidéo de détection de contour additionné à un filtre sonore d'écho :

ffmpeg -i film_son.mp4 -filter_complex \ 
"[0:a]aecho=in_gain=1:out_gain=1:delays=1000:decays=0.5[out0]; \
[0:v]edgedetect=high=0.19607843137254902:low=0.0784313725490196:mode=wires[out1]" \
-map "[out0]" -map "[out1]" output_son.mp4

FFPLAY

FFMPEG possède un lecteur vidéo intégré dans lequel on peut faire sortir le résultat de nos commandes. Dans ce cas, le résultat produit par FFMPEG ne sera pas un nouveau fichier vidéo mais un rendu en direct dans le lecteur FFPLAY.

Ci-dessous un script qui isole les vecteurs de mouvement d'une vidéo ainsi que des captures d'écran du résultat :

ffplay \
   -flags2 +export_mvs \
   -i "video1.mp4" \
   -vf \
   "
      split[original],
      codecview=mv=pf+bf+bb[vectors],
      [vectors][original]blend=all_mode=difference128,
      eq=contrast=7:brightness=-0.3,
      scale=720:-2
   "

On peut aussi utiliser FFPLAY pour générer des glitchs, sans vidéo de base. Voici un script qui génère un aléatoirement des rectangles en niveau de gris, et des captures d'écran du rendu :

ffmpeg -f lavfi -i cellauto=s=640x360:rule=15:r=50 \
-vf scale=1280x720 -bsf noise=1000 -r 30 -f mpegts \
-c:v h264 -crf 31 -preset ultrafast -tune zerolatency - | \
ffplay -i - -loglevel quiet -fs -vf tblend=all_mode=darken

Ressources pour apprendre

Documentation officielle de FFMPEG :

Interfaces graphique en ligne pour créer des filtres plus facilement :

Documentation de FFPLAY :