Stabiliser une vidéo avec FFmpeg

Si vous avez une action cam, ou caméra d’action dans la langue de Molière (ou encore kaméra daxion dans celle de Jul), il est préférable de stabiliser vos vidéos avant de les diffuser, et ce pour le plus grand bien visuel de vos admirateurs et autres followers. Je vous propose ici une méthode simple pour faire ça sous Linux grâce à FFMpeg.

Exemple

Comme un exemple vaut mieux qu’un long discours, voici une vidéo de démonstration faite par Georg Martius, l’auteur de la librairie vid.stab, que nous allons utiliser ici :

Installation

Pour ce faire, il nous sera nécessaire d’utiliser FFmpeg avec la librairie libvidstab. Par défaut, celle-ci n’est pas fournie avec le fichier binaire de FFmpeg (version compilée). Deux options s’offrent donc à nous : compiler sois-même FFmpeg ou télécharger une version “alternative” du binaire incluant ladite librairie.

Par simplicité, c’est la seconde que je vais détailler ici. Nous allons donc utiliser une version dite Static Build de FFmpeg.

Téléchargez la Static Build

Rendez-vous à l’adresse suivante pour télécharger la dernière version de FFmpeg en Static Build, suivant votre configuration : https ://www.johnvansickle.com/ffmpeg/

Dans mon cas (architecture 64 bit et à la date où j’écris ces lignes), mon choix se porte donc vers le fichier “ffmpeg-git-amd64-static.tar.xz”

Installez la Static Build

Pour éviter tout conflit entre la Static Build et une potentielle version actuelle de FFmpeg, on va installer la Static Build dans un répertoire spécifique. Si vraiment vous êtes à 150 Mo près sur votre disque, vous pouvez toujours désinstaller FFmpeg avant de continuer.

Une fois l’archive téléchargée, ouvrez une terminal dans le dossier où elle est enregistrée et exécutez les commandes suivantes (adaptez les chemins en fonction du fichier que vous avez téléchargé) :

tar xf ffmpeg-git-amd64-static.tar.xz
cd ffmpeg-git-20190223-amd64-static

Créez un dossier de destination à la racine et copiez-y la version de FFfmpeg incluant la libvidstab :

sudo mkdir /usr/local/bin/ffmpeg-stab
sudo mv * /usr/local/bin/ffmpeg-stab/

Créez un alias

Histoire de pouvoir exécuter exécuter la Static Build de FFmpeg depuis n’importe où, on va créer un alias vers le binaire correspondant :

alias ffmpegstab="/usr/local/bin/ffmpeg-stab/ffmpeg"

Utilisation

Enfin on peut bosser !

La stabilisation se fait en deux passes :

  • la première sert à corréler les différentes images de la vidéo (i.e. reconnaître des points particuliers dans les images et déterminer leurs trajectoires), et ce pour générer un fichier texte qui décrit ces trajectoires,
  • la seconde va utiliser ce fichier texte pour appliquer les corrections au fichier vidéo et ainsi générer un nouveau fichier stabilisé.

Première passe

On utilise ici le filtre vidstabdetect

ffmpegstab -i VideoSecouée.mp4 -vf vidstabdetect -f null -

Lors de cette première passe, les résultats de corrélations seront enregistrés dans le fichier transforms.trf

Seconde passe

Maintenant, il ne reste plus qu’à faire la deuxième passe avec le filtre vidstabtransform :

ffmpegstab -i VideoSecouée.mp4 -vf vidstabtransform=input="transforms.trf" VideoStabilisée.mp4

Et voilà !

Pour aller plus loin

On a utilisé ici les options par défaut des filtres vidstabdetect et vidstabtransform. Pour tweaker un peu tout ça, il est notamment possible de jouer sur le degré de tremblement (shakiness), entre 1 et 10 (5 par défaut) et sur le nombre d’images à utiliser pour “lisser” les trajectoires (smoothing), à 10 par défaut.

Exemple pour un shakiness à 7 (lors de la première passe) :

ffmpegstab -i VideoSecouée.mp4 -vf vidstabdetect=shakiness=7 -f null -

et pour un smoothing à 15 (lors de la deuxième passe) :

ffmpegstab -i VideoSecouée.mp4 -vf vidstabtransform=input="transforms.trf":smoothing=15 VideoStabilisée.mp4

Il existe tout un tas d’autres options (par exemple pour rezoomer la vidéo, définir comment gérer les éventuels bords noirs etc.). Pour cela, je vous invite à consulter la doc de ces filtres.