Traiter des vidéos avec FFmpeg

Il y énormément à dire sur cet outil extrêmement versatile, mais j’aimerai ici juste montrer quelques basiques en guise d’introduction, comme réencoder et redimensionner des vidéos.

FFmpeg gratuit, open-source, cross-platform et surpuissant

Installation

Si vous êtes sur linux, un petit sudo apt install ffmpeg dans le terminal suffira.

Sur ce lien vous pourrez télécharger les versions compilée de ffmpeg : https://www.ffmpeg.org/download.html

Pour windows rendez-vous directement sur cette page de build sur github
Plusieurs versions s’offre à vous. Prenez la version qui commence par ffmpeg-nx.x (les ffmpeg-N-xxxx sont les builds journalière), prenez la gpl qui contient toutes les librairies, en format .zip

Cette vidéo youtube couvre bien les étapes d’installation

Cela contient en réalité pas un mais trois utilitaires, tous dans le dossier ffmpeg/bin :

  • ffmpeg : outil de traitement
  • ffprobe : outils d’analyse
  • ffplay : lecteur vidéo

Je me sers très rarement de probe et encore moins de play mais il peuvent s’avérer utile pour tester des fichiers.

Une fois téléchargé placer ces trois fichiers dans un endroit de votre disque qui ne sera pas amené à bouger. Pour ma part, je crée un dossier utils à la racine de mon lecteur C: qui contient tout mes executable en ligne de commande)

Le plus pratique pour l’usage reste d’ajouter le chemin du dossier des binaires au PATH windows (dans mon cas C:\utils). De cette manière, il suffira ensuite de taper ffmpeg dans le terminal pour y accéder directement.

Usage

Voici l’usage le plus basique qui montre en exemple comment s’organise la commande

pour l’exemple on considère que le terminal est ouvert dans le dossier de la vidéo et que l’export se fait aussi dans le même dossier

ffmpeg -i mavideo.mkv nouvellevideo.mp4

Cette commande créera déjà un fichier mp4 relativement optimisé tel-quel.

le marqueur -i (input) suivi d’un espace puis mavideo.mkv spécifie la source.
La vidéo de sortie nouvelle_video.mp4 n’a pas besoin de marqueur pour être spécifié, comme elle est à la fin on sait que c’est l’output.
Tout les arguments supplémentaire viendront s’ajouter entre la vidéo d’entrée et la vidéo de sortie

Réencoder

Ré-encoder sa vidéo permet de gagner pas mal de poids, si par exemple vous voulez alléger votre vidéo pour l’envoyer ou l’archiver.

La doc propose un très bon guide de démarrage qui reprend tout ça, en plus complet.

Pour cela nous allons nous intéresser a 3 arguments en particulier :

-pix_fmt (pixel format) - Défini comment sont encodé les pixels, c’est ce qui va permettre de rendre notre vidéo plus légère et davantage compatible avec les lecteurs vidéos existants. Pour ce faire le format “grand public” recommandé est yuv420p qui permet le sous-échantillonnage de la chrominance (plus d’infos sur la page wikipédia yuv)

-crf (constant rate factor) - Cet argument va nous permettre de moduler facilement le ratio poid/qualité. Plus on donne un nombre proche de zéro plus le fichier et proche de sa source et donc lourd. En général en fonction du besoin on attribue des valeurs entre 15 et 25:

  • 0 = (Lossless) super lourd, identique à la source.
  • 10 = lourd, grande qualité
  • 30 = lèger, mauvaise qualité

-preset - Détermine la vitesse d’encodage, une vitesse plus lente permet au logiciel d’optimiser le fichier pour gagner encore de la place, les valeurs disponibles sont :

  • ultrafast
  • superfast
  • veryfast
  • faster
  • fast
  • medium (default)
  • slow
  • slower
  • veryslow

La commande que j’utilise régulièrement pour faire perdre du poids à mes vidéos tout en conservant une qualité décente utilise ces 3 paramètres:

Commande de ré-encodage

ffmpeg -i mavideo.mov -crf 20 -preset slower -pix_fmt yuv420p nomdesortie.mp4

Redimensionner

Autre point dont nous avons souvent besoin, le redimensionnement (qui affecte encore plus fortement le poid du fichier)

Considérons qu’on ai une source fullHD 1080p (1920x1080) que nous voulons convertir en HD 720p (1280x720).
le plus pratique est d’utiliser le filtre vidéo de scale : -vf scale=[largeur voulue]:-2

Commande de redimensionnement

ffmpeg -i mavideo.mov -vf scale=1280:-2 -pix_fmt yuv420p nomdesortie.mp4

Ici on redimensionne en spécifie seulement la largeur en pixel. le -2 permet de dire a ffmpeg de determiner automatiquement la hauteur en conservant le ratio.

Tout comme -1, -2 spécifie de concerver le ratio, mais cette fois en forcant une valeur divisible par 2, ce qui évite de potentielles erreurs.

Si on connait déjà la largeurxhauteur voulue, il est plus rapide de taper -s 1280x720 qui fonctionne aussi.

Suprimmer l’audio

Cet exemple permet d’aborder la copie de stream.
En effet votre fichier contient en général un stream vidéo et un stream audio (il peut y en avoir davantage).
Si vous voulez seulement supprimer le son vous n’avez pas à ré-encoder puisque qu’il vous suffit de copier uniquement le stream choisi avec la commande -c.

-c copy : copie directement à la fois le stream video et audio

-c:v copy : copie directement le stream Vidéo

-c:a copy : copie directement le stream Audio

-an : Désactive l’audio

Commande de suppression audio

ffmpeg -i mavideo.mp4 -c:v copy -an mavideo_sansson.mp4

ici on aurait pu directement faire -c copy -an car -an désactive l’audio de toute façon.

Plus de commandes

On peut également couper simplement des vidéos :

ffmpeg -i mavideo.mp4 -ss [start] -to [end] mavideodecoupe.mp4

Exemple pour commencer a 1min 10s de la vidéo, on peut soit spécifier le temps en seconde : -ss 70 ou plus pratique, en timecode -ss 00:01:10

Une solution pour couper une vidéo rapidement fera probablement l’objet d’un prochain article.

Il existe énormément d’autre commande que vous pourrez explorer dans la documentation officielle

Vous trouverez plein des listes de commandes utiles partagées par la communauté d’utilisateurs.
Quelques liens qui regorge de notes utiles :