Blog - Sébastien Mouchet

Encodage audio/video avec FFmpeg

Publié le 20 janvier 2024, par Sébastien

———

TLDR ?

Si vous n’avez pas 15 minutes à accorder à la lecture de cet article, voici une version raccourcie à 3 minutes :

———

FFmpeg est un outil puissant, capable de décoder et encoder des centaines de formats audio et vidéo différents.

Et il ne se limite pas à l’encodage et au décodage, il est aussi capable de :

Cet article concerne uniquement le transcodage, cela dit.

Si vous n’avez jamais entendu parler d’FFmpeg, sachez que c’est un programme en ligne de commande.
Attendez… ne partez pas en courant, il est assez facile à utiliser, en réalité. 😉

Il fournit des bibliothèques logicielles utilisées par de très nombreux programmes, notamment des lecteurs multimédia, comme VLC, et beaucoup de logiciels de transcodage audio/vidéo (par exemple Handbrake).

Par le passé, j’ai utilisé des applications avec une interface graphique pour faire du transcodage, mais depuis, j’ai supprimé les intermédiaires, et j’utilise désormais FFmpeg directement.

Installation

Si vous êtes sous Windows, vous pouvez télécharger des binaires pré-compilés :

En pratique, la dernière fois que j’ai eu besoin de télécharger FFmpeg, j’ai utilisé la dernière version à l’adresse suivante :

Plus précisément :

ffmpeg-master-latest-win64-gpl.zip 

Décompressez le ZIP quelque part.

Pour plus de commodité, vous pouvez ajouter le dossier contenant « ffmpeg.exe » à votre « Path » (variable d’environnement), ce qui vous permettra d’appeler « ffmpeg.exe » depuis n’importe quel dossier.
Une recherche de « variables d’environnement » dans le menu démarrer devrait faire apparaître la boîte de dialogue correspondante, où vous pouvez modifier la variable utilisateur « Path ».
Pour éviter de casser quoi que ce soit, assurez-vous de ne rien supprimer dans cette variable (ajoutez simplement le chemin souhaité à la fin).

Ensuite, ouvrez un terminal en utilisant Maj + clic-droit sur le dossier souhaité, puis « Ouvrir dans le Terminal ».
Si besoin, vous pouvez changer de dossier grâce à la commande « cd » (qui signifie « change directory ») :

cd C:\Users\Sebastien\Videos\

Si vous êtes sous Linux, l’installation est généralement très simple, vu qu’FFmpeg est inclus dans la plupart des distributions majeures.
Par exemple, sous Ubuntu ou Debian, il suffit de taper :

sudo apt install ffmpeg

Audio, sans perte → FLAC

Supposons que vous ayez un fichier WAV, non compressé, copié à partir d’un CD.

Vous pouvez le convertir en FLAC, qui sera environ 30 % plus petit (parfois jusqu’à 50 %) sans perdre en qualité, grâce à la compression sans perte.

ffmpeg -i input.wav output.flac

C’est aussi simple que ça. La syntaxe de base nécessite seulement de spécifier le fichier d’entrée avec l’option « -i » (« input ») et de terminer la commande par le nom du fichier de sortie.
FFmpeg comprendra automatiquement qu’il doit utiliser l’encodeur FLAC, en se basant sur l’extension du fichier.

Bien sûr, convertir de l’audio avec perte (comme le MP3) en FLAC n’a pas d’intérêt : vous ne récupérerez pas la qualité perdue en faisant ça.

Audio, avec pertes, compatibilité maximum → MP3

L’encodage avec pertes permet des gains significatifs sur la taille du fichier, au prix d’une perte de qualité (irréversible).

Le MP3 est un codec avec pertes très célèbre, avec une très large compatibilité. Pratiquement tous les appareils/logiciels qui prennent en charge des codecs « avec pertes » supportent le MP3.

ffmpeg -i input.wav -c:a libmp3lame -q:a 0 output.mp3

Par rapport à l’exemple du FLAC, il y a 2 options supplémentaires :

Ici, j’ai explicitement sélectionné l’encodeur MP3 LAME (libmp3lame). Je suis à peu près sûr que c’est l’encodeur MP3 par défaut, donc vous pouvez probablement vous passer de cette option dans le cas présent.

Le MP3 peut être encodé soit avec un débit constant (jusqu’à 320 kbit/s), soit avec un débit variable (VBR). Le débit constant est considéré comme du gaspillage, du fait que la complexité du signal varie au cours du temps. Il est donc logique d’allouer moins de débit au parties du morceaux qui sont plus faciles à encoder.

Le fait de spécifier le paramètre de qualité demande à LAME d’utiliser le mode débit variable. 0 est la qualité la plus élevée, et 9, la plus faible.

Voici les débits très approximatifs que vous pouvez obtenir – pour du stéréo – en jouant sur le paramètre de qualité :

La grande majorité des gens ne sont pas capables d’entendre la différence entre une source sans perte (lossless) et un MP3 encodé correctement avec un débit de 245 kbit/s. Même si le MP3 n’est pas sans perte, les débits élevés sont dits « transparents ».

Il y a de nombreuses années, j’avais déterminé lors d’un « blind test » que je n’étais personnellement pas capable de distinguer une version lossless d’une version encodée avec LAME avec un débit variable de 190 kbit/s de moyenne.

Si vous ne recherchez pas la transparence, vous pouvez descendre jusqu’à 130 kbit/s (« -q:a 5 ») avec une qualité correcte – du moment que votre fichier source à une bonne qualité.

Et l’AAC ?

L’AAC (Advanced Audio Coding) est un autre codec « avec pertes » connu, popularisé par Apple avec ses iPods et avec iTunes. L’AAC n’est pas aussi répandu que le MP3, cela dit.

Bien que l’AAC soit techniquement supérieur au MP3, l’encodeur AAC natif d’FFmpeg n’est malheureusement pas bon – il est en fait pire que l’encodeur MP3 LAME.
FFmpeg supporte un autre encodeur de meilleure qualité, « libfdk_aac », mais, en raison de problèmes liés à sa licence, vous ne pouvez pas télécharger de binaires pré-compilés qui l’incluent. Il vous faudrait compiler FFmpeg vous-même (bonne chance…).

Si vous voulez vraiment encoder de l’AAC avec une qualité correcte, votre meilleure option est iTunes, pas FFmpeg.

Audio, avec pertes, dernier cri → Opus

L’Opus est un codec plus récent, et techniquement supérieur à à peu près n’importe quel autre codec audio avec pertes, à la fois pour de la musique, et pour de la voix à bas-débit.

Il est utilisé par des services de streaming comme SoundCloud, YouTube, ou Vimeo, et pour les communications vocales dans Skype, Discord, WhatsApp, Signal, et bien d’autres.

ffmpeg -i input.wav -c:a libopus -b:a 160k output.opus

La commande ci-dessus utilisera un débit variable, avec un débit moyen aux alentours de 160 kbit/s.
« -b:a » signifie « débit audio » (« audio bitrate ») et « -ab » est un alias de « -b:a ».

Vous pouvez aussi utiliser l’extension « .ogg » pour des fichiers Opus.

Opus se place systématiquement en tête des tests d’écoute (« blind tests ») qui le comparent à d’autres codecs.
Par exemple, jetez un œil aux résultats suivants (2014, en anglais) :

La perte de qualité d’Opus à 96 kbit/s a été considérée par beaucoup comme étant imperceptible, et comme « perceptible, mais pas pénible » par d’autres.

L’AAC (encodé par iTunes) n’était pas loin derrière, en termes de qualité, au même débit.

Le MP3 se plaçait un tout petit peu moins bien que l’AAC (plus proche de « perceptible, mais pas pénible »), mais avec un débit plus élevé, cela dit (de l’ordre de 130 kbit/s).

Du moment que l’appareil / le logiciel que vous souhaitez utiliser prend en charge le format Opus, vous devriez l’utiliser, si vous avez besoin d’un codec audio avec pertes.

Vidéo, large compatibilité → H.264 + MP3

H.264, aussi connu sous le nom d’AVC (Advanced Video Coding), est une norme de compression vidéo très populaire.

C’est le codec vidéo principal utilisé dans les Blu-rays classiques (les Blu-rays Ultra HD utilisent son successeur, le H.265).
Bien que des codecs plus récents existent, il est toujours très utilisé sur le Web.

En plus de la compatibilité, sa popularité lui confère un autre avantage : l’accélération matérielle.
La plupart des appareils construits dans les 10 à 15 dernières années peuvent décoder du H.264 au niveau matériel, ce qui permet de meilleures performances, et une utilisation d’énergie moindre, comparées à un décodage logiciel.

L’encodeur H.264 d’FFmpeg s’appelle x264 :

ffmpeg -i input.mp4 -c:v libx264 -crf 24 -c:a libmp3lame -q:a 2 output.mp4

Vous pouvez utiliser « -vcodec » à la place de « -c:v » si vous voulez (« codec vidéo »).

Ici, j’ai utilisé le conteneur MP4 (extension « .mp4 »), qui est très bien pris en charge, y compris par les navigateurs.

Le Matroska (MKV) est un autre conteneur intéressant. Il est très polyvalent : il peut stocker un nombre illimité de pistes vidéo, audio, et de sous-titres dans un seul fichier. Alors que le seul moyen d’inclure des sous-titres dans un fichier MP4 est de les « incruster » dans le flux vidéo. Le MKV n’est pas aussi largement supporté que le MP4, cependant.
Pour l’utiliser, remplacez simplement « .mp4 » par « .mkv » dans la commande.

Le paramètre « -crf » vous permet d’ajuster la qualité de sortie du flux vidéo. CRF est l’abréviation de « Constant Rate Factor » et signifie que l’encodeur va essayer de garder une qualité globalement constante tout au long de la vidéo, plutôt qu’un débit constant.

Voici l’explication de la documentation FFmpeg à propos des valeurs du CRF (traduite par mes soins) :

L’intervalle du CRF est 0–51, où 0 est sans perte (pour du 8 bit uniquement, pour du 10 bit, utilisez -qp 0), 23 est la valeur par défaut, et 51 est la moins bonne qualité possible. Une valeur plus basse donne généralement une meilleure qualité, et un intervalle raisonnable est 17–28. Considérez 17 ou 18 comme étant visuellement sans perte ou presque; Ça devrait être visuellement identique ou presque identique à la source, mais ce n’est pas techniquement sans perte.

L’intervalle est exponentiel, donc augmenter la valeur du CRF de +6 conduit à diviser par deux le débit / la taille de fichier, en gros, tandis que -6 double approximativement le débit.

Vidéo, dernier cri → AV1 + Opus

En 2024, le codec vidéo le plus avancé que vous pouvez utiliser est l’AV1. (À ne pas confondre avec le – très vieux – format de conteneur AVI !)

FFmpeg propose plusieurs encodeurs AV1 : « libaom », « SVT-AV1 » et « rav1e ».

Sur ma machine, j’ai obtenu de meilleurs résultats avec « SVT-AV1 », en termes de vitesse d’encodage, comparée à la qualité de sortie.

ffmpeg -i input.mp4 -c:v libsvtav1 -crf 38 -preset 4 -c:a libopus -b:a 128k output.webm

Cette fois-ci, j’ai utilisé le conteneur WebM. C’est un format ouvert, qui supporte les codecs suivants :

J’aurais aussi pu utiliser le MKV ou le MP4.

L’option « preset » de « libsvtav1 » sert à ajuster le compromis entre la vitesse d’encodage et la qualité. Elle va de 0 (meilleure qualité) à 13 (le plus rapide). Utilisez la valeur la plus faible possible. C’est à dire que la vitesse d’encodage devrait être aussi lente que vous pouvez vous le permettre. Sinon, vous pourriez obtenir une qualité décevante.

Les valeurs de CRF ne sont pas directement comparables à celles de x264 : j’ai fait un petit test, et j’ai obtenu une qualité un peu meilleure avec un CRF de 38 pour « SVT-AV1 » qu’avec un CRF de 24 pour x264.

L’AV1 peut atteindre une compression 30 % supérieure au VP9, et 50 % par rapport au H.264.

Le décodage matériel nécessite un appareil récent, cela dit.
Il a commencé à apparaître en 2020 (dans des produits Intel, NVIDIA, AMD), et est devenu plus courant dans des produits sortis en 2023 (chez Apple, Qualcomm, …).

Sans décodage matériel, la lecture de vidéos utilisera beaucoup de CPU, et videra la batterie rapidement.

Codecs vidéo intermédiaires : VP8, VP9, H.265

Le VP8 est un format ouvert, conçu comme une alternative à H.264. Il est un peu inférieur en termes de qualité, cependant.

Il a été remplacé par le VP9, avec une efficacité améliorée. Il devrait être capable de faire mieux que le H.264 de ce côté là.

ffmpeg -i input.mp4 -c:v libvpx-vp9 -crf 40 -b:v 0 -c:a libopus -b:a 128k output.webm

H.265 est le successeur de H.264, et est compétitif avec le VP9 d’un point de vue du ratio qualité / taille de fichier.

Le décodage matériel est plus courant pour le VP9 et le H.265 que pour l’AV1 (mais moins courant que pour le H.264).

Compatibilité avec les navigateurs

Si vous avez un jour besoin d’encoder une vidéo pour qu’elle soit lue directement dans un navigateur (sans ré-encodage par une plateforme telle que YouTube), allez faire un tour sur « Can I use » :

Remarque au sujet des brevets logiciels

Si vous êtes un particulier, et que vous encodez des fichiers audio/vidéo pour votre propre usage, vous n’avez probablement pas à vous soucier des brevets logiciels.

Par contre, si vous avez l’intention de diffuser du contenu audio/vidéo au public, ou de développer un logiciel ou du matériel en rapport avec des codecs, attention.
Faites les recherches nécessaires pour déterminer si vous avez besoin d’une licence d’utilisation portant sur des brevets.

Heureusement, certains codecs ne donnent pas lieu à des royalties, soit parce que les brevets en question ont expiré (ex : MP3), soit parce qu’ils ont été conçus dès le départ pour être exempts de redevances (ex : FLAC, VP8, VP9, AV1).

Opus a également été conçu pour utiliser uniquement des brevets qui ne donnent pas lieu à des redevances, mais un groupe d’entreprises ayant des pratiques discutables essaye désormais de se faire payer des royalties pour les appareils qui implémentent Opus au niveau matériel.