Compression de vidéos via ffmpeg
Tout d’abord, les vidéos dans le cadre d’archive familliale, je n’y crois pas. Nous sommes bombardés d’activités en tous genres que nous n’avons pas le temps de regarder des photos (déjà les sauvegarder et les trier sont parfois des missions impossibles).
Dans un soucis de garder quand même quelques archives familliales, je regarde pour faire un backup selon la règle 3-2-1. Cela risque de tourner à 3-3-1 mais c’est une autre discussion.
Pour minimiser l’espace de disque dur et suite à un shaarli, j’ai passé la collection de vidéos à la moulinette ffmpeg pour réduire les vidéos et avoir un seul codec (c’est un effet collatéral).
sebsauvage a proposé le code suivant :
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.
A l’arrivé, les fichiers varient entre 27 et 80% de la taille d’origine.
Chez moi, c’est assez variable car les vidéos familliales sont parfois petites (quelques secondes). Ils arrivent donc qu’à l’arrivée, le mkv soit plus lourd que l’original. Je fais le choix de quand même garder car cela uniformise l’ensemble.
Même s’il y a donc des ratés, dans l’ensemble, les mkv font entre 25 et 50% de la taille d’origine.
via sebsauvage
Pour aller plus loin C’est bien d’avoir une ligne de commande qui permette de réduire la taille des vidéos. Toutefois, comme je suis sur une bibliothèque de plusieurs années, il est important de faire cela sur l’ensemble.
Combien de vidéos ai-je chez moi ?
Bonne question ! Je ne sais pas.
J’en ai profité pour savoir ce que j’avais comme type de fichier. Après quelques prompts avec l’IA, j’ai une liste des extensions existants dans mon dossier de photos/vidéos familliales. J’ai quelques trucs exotiques. L’IA me confirme, a priori, l’utilisation de certaines extensions.
Je conçois un programme bash pour convertir tous les fichiers dont l’extension s’apparente à une vidéo vers un conteneur mkv. Il m’a fallu plusieurs itérations pour trouver la bonne méthodologie (sur un dossier, sur une extension, vérifier les tailles). J’y suis arrivé. petit script
J’ai essayé avec le Raspberry Pi. En un mot : OUBLIEZ !
Puis avec le famille, en sachant que ce dernier est une récupération de PC de bureau (donc pas de carte graphique digne de ce nom et RAM limité), cela avance. C’est consommateur de puissance. Donc le PC a parfois du mal à tout gérer. Madame s’est plainte (en même temps, c’est le pc qu’elle utilise hors boulot).
Finalement, je me suis résolu à lancer cela sur ma machine du boulot, qui, sans être une bête de course, est plus rapide et me permet de gérer l’activité du processus (je dors, tu peux y aller; je travaille, tu t’arrêtes). ffmpeg est installable en version portable. La version full possède le codec en question.
J’ai du réconcevoir mon programme bash pour qu’il fonctionne sous/avec PowerShell.
J’ai également fait le choix de transférer toutes les vidéos sur un disque dur qui n’est pas celui du serveur de backup avant de compresser les vidéos. Quand le processus est fait, je transfère les nouveaux fichiers et je vérifie qu’il y ait bien des doublons (en ne regardant pas les extensions) puis je supprime le fichier original. petit script
Quand le démarrage sera fini, l’idée est de mettre cela au propre et automatiser la compression/sauvegarde/…