Nous allons apprendre à encoder/réencoder et couper une vidéo en ligne de commande avec l’outil ffmpeg.
Je vous montrerai aussi comment faire un fondu audio sortant, que vous pourrez adapter pour un fondu audio entrant ou pour des fondus vidéo.


Installation de ffmpeg

La première étape est donc d’avoir une version de ffmpeg utilisable dans un terminal.

Pour les utilisateurs de GNU/Linux, vous trouverez sans aucun doute ffmpeg dans les dépôts officiels de votre distribution.

Pour les utilisateurs de Windows, vous pouvez télécharger un exécutable de ffmpeg à cette adresse. Vous devrez ensuite ajouter à vos variables d’environnement le dossier contenant l’exécutable ffmpeg.exe que vous aurez extrait en suivant par exemple ce tutoriel.

Vous pouvez tester que ffmpeg est bien disponible avec la commande ffmpeg -h (dans un terminal) qui affichera l’aide.


Encoder une vidéo

Pour apprendre à encoder une vidéo, la référence reste le wiki de ffmpeg : https://trac.ffmpeg.org/wiki/Encode/H.265 pour H.265/HEVC, et https://trac.ffmpeg.org/wiki/Encode/H.264 pour H.264.

Commande de base

Ma commande de base pour encoder en HEVC, notamment pour réencoder des vidéos que j’utilise pour faire des karaokés, est la suivante :
ffmpeg -i input.mkv -c:v libx265 -crf 24 -preset slower -c:a copy output.mkv

Pour comprendre ce que fait chaque paramètre, vous pouvez vous référez au wiki de ffmpeg mentionné plus haut, mais voici quand même une rapide explication avec mes mots :

  • -i input.mkv : votre vidéo en entrée, au format mkv, mp4, etc.
  • -c:v libx265 : le codec que vous voulez utiliser pour encoder la vidéo. Choisir libx265 pour du H.265/HEVC, et libx264 pour du H264 par exemple.
  • -crf 24 : permet une qualité constante sur toute la vidéo, avec une valeur entre 0 (lossless) et 51 (worst quality possible). Les valeurs par défaut sont de 28 pour x265 et de 23 pour x264. En me basant sur cet article et après quelques tests, je confirme qu’un crf de 24 pour x265 (ou 18 pour x264) donne une qualité en sortie globalement similaire à l’entrée, donc un bon ratio qualité de la vidéo/taille du fichier.
  • -preset slower : il s’agit en gros de la vitesse à laquelle ffmpeg va compresser, et “plus c’est lent mieux c’est”. Pour une vidéo qui sera conservée longtemps, slower semble donc un bon choix.
  • -c:a copy : permet de simplement copier le flux audio, sans le réencoder. Autant garder l’audio tel quel et ne pas perdre en qualité, puisque dans une vidéo ce n’est souvent pas l’audio le plus lourd ;)
  • output.mkv : le fichier de sortie.

Paramètre -tune

Ce paramètre permet d’optimiser encore davantage notre sortie selon notre fichier d’entrée. Tous les paramètres disponibles sont détaillés sur le wiki.

À noter que certains paramètres de tune, comme animation par exemple, n’existent qu’avec H.264 et pas avec H.265.


Couper la vidéo en choisissant le temps de début et le temps de fin

Pour avoir un découpage précis de notre vidéo, il faut absolument réencoder la vidéo. On ne peut donc pas utiliser l’option -c:v copy (mais on peut bien entendu utiliser l’option c:a copy pour l’audio !).

Plusieurs choix s’offrent à nous pour couper une vidéo : les options -ss, -t et -to, qui peuvent être utilisées soit en input (i.e. avant le paramètre -i) ou en output (i.e. après -i).
Les différences ne sont pas simples à expliquer, alors je vous renvoie vers la documentation ffmpeg qui explique chacune de ces options.

Cependant, je n’ai jamais réussi à utiliser correctement l’option -to (en input ou output) pour que le fichier de sortie s’arrête à la position HH:MM:SS.mmm de l’entrée, donc si vous vous sentez d’humeur, tentez ! (Et si vous y arrivez, pensez à me l’expliquer en me contactant)

Concrètement, pour que notre fichier de sortie écrive seulement à partir de la position 01:55:20.900 (au format HH:MM:SS.mmm) de la vidéo d’entrée, il faut utiliser l’option -ss avant -i :
ffmpeg -ss 01:55:20.900 -i input.mkv -c:v libx265 -crf 24 -preset slower -c:a copy output.mkv

Pour que notre fichier de sortie dure exactement 1 minute, on va utiliser l’option -t après -i.
Sans l’option -ss, cela correspondra à 1 minute depuis le début de la vidéo, mais cumulé avec l’option -ss, la durée est calculée à partir du nouveau temps de début précisé dans le -ss. Cela donne :
ffmpeg -ss 01:55:20.900 -i input.mkv -c:v libx265 -crf 24 -preset slower -c:a copy -t 00:01:00.000 output.mkv

Si on veut que notre fichier de sortie s’arrête à la position 01:59:01.500 de la vidéo d’entrée, vu que nous avons laissé tomber l’option -to, il suffit de calculer la durée entre la position de -ss (01:55:20.900) et 01:59:01.500 (donc une durée de 00:03:40.600) et de la passer dans le paramètre -t :
ffmpeg -ss 01:55:20.900 -i input.mkv -c:v libx265 -crf 24 -preset slower -c:a copy -t 00:03:40.600 output.mkv

Astuce
Si vous n’êtes pas sûr de votre découpage (début et/ou fin), pensez à faire des essais en baissant la qualité de la vidéo, avec par exemple crf de 45 et un preset ultrafast ;)
Quand vous aurez la bonne position de début (-ss) et la bonne durée (-t), vous pourrez remettre un crf plus faible (24) et un preset plus lent (slower).


Finir avec un fondu audio

Pour ajouter un fondu audio, il faut obligatoirement réencoder l’audio. Je ne m’y connais pas du tout, donc je vous laisse chercher ça sur internet :)
Dans mon exemple ci-dessous, j’encode l’audio avec -c:a aac -vbr 5 (voir ici).

La commande -af 'afade=out:st=216.5:d=3.5' permet d’ajouter un fondu audio en fin de vidéo (out) qui commence à 216.5 secondes depuis le nouveau début (si cumulé avec l’option -ss) et qui dure 3.5 secondes :
ffmpeg -ss 01:55:20.900 -i input.mkv -c:v libx265 -crf 24 -preset slower -c:a aac -vbr 5 -af 'afade=out:st=216.5:d=3.5' -t 00:03:40.600 output.mkv

Il est aussi possible de faire un fondu audio en début de vidéo, ainsi que des fondus vidéo. Les commandes sont similaires, vous pouvez chercher sur internet ;)