Table des matières
Mémo ffmpeg
Cette page sert juste de mémo pour moi pour quelques opérations de base pour ffmpeg (je n'arrête pas d'oublier les options). Notez que je ne suis pas un spécialiste de ffmpeg et qu'il y a probablement moyen de faire plus optimisé.
ffmpeg est parfois disponible sous le nom d'avconv, disponible dans le paquet libav-tools.
- Build le plus récent pour Windows (statique): http://ffmpeg.zeranoe.com/builds/win32/static/ffmpeg-latest-win32-static.7z
- Conversion de base:
ffmpeg -i entree.avi sortie.mkv
Je vous recommande d'ajouter l'option
-g 120. Cela permet d'insérer des images de références toutes les 120 images, ce qui permet aux lecteurs vidéo de faire un "seek" (déplacement rapide dans le flux vidéo) plus facilement.- Je conseille le conteneur
mkven sortie. Ce conteneur supporte la vidéo, d'eventuelles multiples pistes audio et les sous-titres.
- Spécifier bitrate vidéo (-b:v) et audio (-b:a):
ffmpeg -i input -b:v 1700k -b:a 192k output
- Spécifier un codec vidéo (-vcodec), audio (-acodec) et conteneur (-f): Exemple:
- Conversion en xvid+mp3 en avi:
ffmpeg -i entree.mp4 -f avi -vcodec libxvid -acodec mp3 -b:v 1700k -b:a 192k sortie.avi
- Conversion en theora+ogg en ovg:
ffmpeg -i entree.mp4 -f ogg -vcodec libtheora -acodec libvorbis -b:v 900k -b:a 128k sortie.ogv
- Prendre un stream audio sans ré-encoder:
-acodec copy
- Prendre un stream vidéo sans ré-encoder:
-vcodec copy
- Convertir un mkv en avi sans ré-encoder:
ffmpeg -i %1 -acodec copy -vcodec copy output.avi
- Changer le ratio hauteur/largeur d'une vidéo sans ré-encoder:
ffmpeg -i entree.avi -aspect 704:300 -c copy sortie.mp4
- Extraire la bande son d'une vidéo:
ffmpeg -i %1 -f mp3 -acodec mp3 -b:a 196k %1.mp3
- Convertir un MP3 en WAV:
ffmpeg -i musique.mp3 musique.wav
- Extraire une partie d'une vidéo (sans ré-encoder) (début avec -ss, durée avec -t):
ffmpeg -ss 00:02:58 -t 00:09:34 -i entree.webm -vcodec copy -acodec copy sortie.webm
- Redimensionner une vidéo:
- Hauteur+largeur:
-vf scale=640:480
- Hauteur:
-vf scale=-1:480
- Convertir des fichiers .flac en .mp3 (en incluant les sous-répertoires):
find -name "*.flac" -exec ffmpeg -i {} -acodec libmp3lame -ab 192k {}.mp3 \; - Convertir une vidéo en GIF animé (inspiré de cette page)
- Créer le fichier
gifenc.sh:- gifenc.sh
#!/bin/sh # Convert any video file to animated GIF palette=`mktemp --suffix=.png` filters="fps=15,scale=-1:-1" # No scaling. #filters="fps=15,scale=320:-1:flags=lanczos" # If you want to rescale video. ffmpeg -v warning -i "$1" -vf "$filters,palettegen" -y "$palette" ffmpeg -v warning -i "$1" -i $palette -lavfi "$filters [x]; [x][1:v] paletteuse" -y "$1-converted.gif" rm "$palette"
- Convertir votre vidéo:
./gifenc.sh mavideo.mp4sortira un fichiermavideo.mp4-converted.gif.
Ré-encodage en AV1
AV1 est un codec vidéo moderne, libre et incroyablement performant. Il est plus efficace que H264 (le plus répandu) et même que H265:
- À débit égale, la qualité d'image est bien meilleure que ces deux autres codecs.
- Ou - de la même manière - à qualité d'image égale le fichier est bien plus petit.
J'ai commencé à ré-encoder une partie de ma bibliothèque de films Jellyfin afin de gagner de la place.
AV1 est lu nativement par les navigateurs, et de plus en plus de matériels savent décoder nativement l'AV1 (CPUs, smartphones, boitier GoogleTV, etc.). Pour le reste, Jellyfin me fait de toute manière du transcodage automatique pour les périphériques ne supportant pas AV1 (et le CPU de mon petit NAS sait décoder nativement l'AV1).
ffmpeg du le répertoire bin.
Voici comment je convertis mes vidéos en AV1 et l'explication des options utilisées.
ffmpeg -i entree.mkv -map 0:v -c:v libsvtav1 -preset 4 -crf 30 -tune 0 -pix_fmt yuv420p10le -g 120 -map 0:a? -c:a copy -map 0:s? -c:s copy sortie.mkv
-i entree.mkv: Nom du fichier en entrée. Vous pouvez lui donner à manger n'importe quel format vidéo (mp4, avi…)-map 0:v -c:v libsvtav1: Pour la vidéo, utiliser l'encodeur svt-av1. Il existe plusieurs encodeurs av1 (aom-av1, rav1e…). svt-av1 est rapide (ou plus précisément: on peut ajuster sa vitesse.)-crf 30: Taux de compression. Le CRF est la qualité visuelle souhaitée (le débit de la vidéo sera donc variable de manière à conserver une qualité visuelle constante). Une valeur plus faible veut dire meilleure qualité, mais fichier résultant plus gros. 30 me convient. Au delà de 36 la qualité commence à chuter assez rapidement.-tune 0: Pour avoir une qualité constante, il faut un algorithme qui va mesurer cette qualité. En ajoutant cette option, cela sélectionne un algorithme qui est plus proche de la manière dont se comporte la vision humaine.-preset 4: Le codec svt-av1 possède des tonnes de paramètres, et ce réglage "preset" permet de prendre des "raccourcis de calcul" afin de compresser plus vite (au détriment de la taille du fichier final). Ce réglage n'influe pas beaucoup sur la qualité de l'image, mais surtout sur la taille finale du fichier et le temps d'encodage. Plus la valeur est basse, plus le fichier obtenu est petit mais plus le temps de compression est important. Prenez la valeur la plus basse tolérable pour vous (en fonction de la puissance de votre CPU et du temps que vous êtes prêt⋅e à accorder à l'encodage). Notez que:- Les valeurs 4 à 6 donnent de bons résultats avec des temps d'encodage décents.
- Prendre des valeurs inférieures à 4 allonge énormément le temps de compression pour un gain négligeable. Déjà entre 4 et 6 la différence est faible. Pour plus d'informations, voir cette page.
- La chose qui peut être intéressante dans le preset 4 (si vous êtes prêt⋅e à le supporter) est qu'à partir de ce seuil, le Global motion compensation est activé, ce qui peut être un avantage dans les films où il y a beaucoup de mouvement.
- Au delà de 7, la qualité va tout de même commencer à souffrir. Les presets élevés sont plutôt conçus pour l'encodage en temps réel.
-pix_fmt yuv420p10le: Par défaut les couleurs/luminosités sont encodées sur 8 bits. Cette option force l'encodage en 10 bits, ce qui aide à éliminer substantiellement les effets de "banding" dans les scènes sombres sans impacter notablement la taille du fichier.-g 120: Ajoute une image de référence (I-Frame) toutes les 120 images. À 24 images par seconde, c'est toutes les 5 secondes. Les images de référence permettent aux lecteurs de faire plus facilement un "seek", c'est à dire de raccrocher immédiatement au flux vidéo quand vous déplacez le curseur de lecture. (Par défaut, ffmpeg met 9999, ce qui rend les vidéos très difficiles à naviguer.)-map 0:a? -c:a copy: Pour l'audio, copier toutes les pistes audio tel quel (sans ré-encoder). Vous pouvez bien entendu changer cela par exemple en utilisant l'excellent codec Opus (qui est à l'audio ce que AV1 est la vidéo).-map 0:s? -c:s copy: Copie également toutes les pistes de sous-titres. Le '?' sert à ne pas faire d'erreur s'il n'y aucune piste de sous-titres (idem pour l'audio).sortie.mkv: Je vous conseille les conteneurs mkv car ils sont capables de stocker le flux vidéo, mais aussi plusieurs flux audio et les sous-titres.
Exemples
Voici quelques exemples concrets de recompression (temps d'encodage sur un AMD Ryzen 7 5800H, crf 30, preset 6):
| Vidéo | Format | Vidéo d'origine | Encodé en AV1 | Gain (valeur faible=mieux) | Durée d'encodage |
|---|---|---|---|---|---|
| Dune (partie 1) (2021).mkv | 1280x536, 24fps, 2h35 | H264: 9,7 Go (9 666 174 331) | 2,6 Go (2 630 743 289) | 27,2% de l'original | 1h27 |
| Les Choristes (2004).mkv | 1920x1080, 24fps, 1h36 | H264 : 2,5 Go (2 501 588 213) | 1,2 Go (1 251 492 239) | 50% de l'original | 2h2 |
| Game of Thrones S02E01.mkv | 1920x1080, 24fps, 52 min. | H264 : 1,7 Go (1 739 024 679) | 762 Mo (761 769 394) | 43,8% de l'original | 1h8 |
| Dexter S03E01.avi | 624x352, 25fps, 54 min. | MPEG-4 : 586 Mo (586 187 670) | 215 Mo (215 725 098) | 36,8% de l'original | 25 min. |
| Le Voyage de Chihiro (2001).mkv | 1920x1036, 24fps, 2h04 | H264 : 3,6 Go (3 641 306 101) | 2,9 Go (2 903 465 871) | 79,7% de l'original | 3h11 |
| Destination finale: Bloodlines (2025).mkv | 1920x800, 24fps, 1h49 | H264 : 6,5 Go (6 505 703 740) | 1,9 Go (1 930 034 167) | 29,6% de l'original | (non noté) |
Si je me base sur ces quelques exemples, grâce à AV1 je peux virtuellement multiplier par deux le nombre de films que je peux stocker sur mon NAS. Au bas mot.
Notes
- Pour les dessins animés et les animes, même si les réglages ci-dessus fonctionnent très bien il y a sans doute des réglages détaillés plus optimaux possibles (et même des encodeurs AV1 spécialisés).
- AV1, pour arriver à une meilleure compression, a tendance à filtrer le bruit d'image. Cela a tendance supprimer le "grain" des films. Or le grain d'un film peut être un choix artistique. Si vous voulez le conserver, il est possible d'utiliser un des paramètres spécifiques d'AV1 qui lui permettent de re-générer ce bruit au décodage pour ne pas perdre l'aspect artistique du film d'origine. Voir cette page.
- L'AV2 est en cours de conception et promet de meilleures performances.
- Même si les navigateurs supportent AV1 lui-même (le codec vidéo), ils ne supporent pas tous le conteneur mkv. Firefox, lui, supporte nativement mkv. Si votre vidéo est principalement destinée aux navigateurs, vous pouvez aussi utiliser webm.
- Si vous faites des scripts shell pour traiter des fichiers avec ffmpeg, pensez bien à spécifier les fichiers avec
file:- Par exemple, ne faites pas
ffmpeg -i "$1" ...
mais
ffmpeg -i "file:$1" ...
(et même chose pour le fichier en sortie.)
- Raison : Si le nom du fichier comporte
:, ffmpeg essaiera d'interpréter ce qu'il y a avant les:comme un protocole, et ça tombera en erreur.
Liens concernant l'AV1
Plus d'informations :