ChezManu.eu.org

Accueil // À propos




Liens :

media.fdn.fr

pixelvalley.com - Différence entre définition et résolution

ffmpeg.org

webmproject.org

vorbis.com
 

Yet Another FFmpeg Tutoriel

Logo de FFmpeg
Illustration par Jeamou

Introduction

Dans le cadre de media.fdn.fr j'ai été amené à convertir un grand nombre de vidéos (plus d'une centaine) de provenances diverses et aux formats variés vers du WebM. Ce format est certes promu par Google mais ce n'est qu'un point de détail puisqu'il ouvert ; ses spécifications sont publiées sous licence Creative Commons CC BY, son implémentation originelle sous licence BSD. Comme son nom l'indique il est spécifiquement prévu pour la diffusion de contenus vidéo via le Web.
Du coup j'ai fini, à force de tatonnements et de lecture du man, par obtenir une ligne de commande à peu près acceptable. Au départ je voulais la garder dans un coin bien planqué du site pour l'avoir toujours sous la main.

Finalement il me semble plus intéressant de la publier et de l'expliquer afin que quiconque ait un besoin similaire puisse en bénéficier. Paradoxalement je vais commencer par la fin, la ligne de commande obtenue, et je vais expliquer progressivement comment en arriver au résultat souhaité.

Prenons par exemple un fichier nommé « sony.mp4 » que je souhaite ré-encoder et nommer en sortie « sony.webm », je vais lancer la commande suivante :

ffmpeg -i sony.mp4 -threads 0 -s 1280x720 -b:v 2000k -acodec libvorbis -ac 2 -ar 44100 -ab 95k -pass 1 sonytemp.webm && ffmpeg -i sony.mp4 -threads 0 -s 1280x720 -b:v 2000k -acodec libvorbis -ac 2 -ar 44100 -ab 95k -pass 2 sony.webm && rm sonytemp.webm


encodage d'une vidéo avec FFmpeg

Afin de mieux comprendre ce que cette commande fait, décortiquons-la argument par argument :

ffmpeg \
-i sony.mp4 \
-threads 0 \
-s 1280x720 \
-b:v 2000k \
-acodec libvorbis \
-ac 2 \
-ar 44100 \
-ab 95k \
-pass 1 \
sonytemp.webm \
&& ffmpeg \
-i sony.mp4 \
-threads 0 \
-s 1280x720 \
-b:v 2000k \
-acodec libvorbis \
-ac 2 \
-ar 44100 \
-ab 95k \
-pass 2 \
sony.webm \
&& rm sonytemp.webm

le fichier en entrée
nombre de threads utilisés pour l'encodage
définition vidéo
le débit vidéo
le codec audio employé
nombre de canaux
fréquence d'échantillonage
débit audio
première passe
nom du fichier temporaire









seconde passe
fichier en sortie
effacer le fichier temporaire
On comprends donc successivement que :

  • le fichier en entrée se nomme « sony.mp4 » ;
  • j'ai utilisé les capacité de multi-threading de FFmpeg, 0 laisse FFmpeg employer toutes les ressources processeur disponibles ;
  • la définition vidéo sera de 1280 x 720 pixels ;
  • le débit vidéo sera de 2000 kb/s, l'argument « :v » spécifie un débit constant ;
  • le son sera encodé avec le codec Vorbis ;
  • le son sera encodé sur 2 canaux, en stéréo donc ;
  • le son sera échantillonné à 44,1 kHz ;
  • le débit audio sera de 95 kb/s, qualité radio donc ;
  • que l'encodage se fera en 2 passes ;
  • le fichier temporaire sera nommé « sonytemp.webm » ;
  • que l'on répète les même arguments pour la seconde passe ;
  • le fichier final quant à lui sera nommé « sony.webm » ;
  • une fois les 2 passes de l'encodage achevées le fichier temporaire sera supprimé


Quelques explications supplémentaires

Dans cet exemple j'ai choisi d'utiliser le multi-threading de FFmpeg ; la valeur qui suit -threads indique le nombre de cœurs de CPU à employer, si l'on spécifie 0 alors FFmpeg utilisera au mieux les ressources processeurs disponibles. Si vous souhaitez minimiser l'impact de l'encodage sur la réactivité de votre machine, choisissez 1 ou 2, en ayant conscience que ça allongera le temps de l'encodage.

L'option -b:v spécifie le débit utilisé pour le flux vidéo en forçant un débit fixe. Ce choix n'est pas forcément toujours pertinent. Dans le cas d'un film par exemple on préférera une qualité d'image fixe, quitte à avoir un débit variable. En effet une scène globalement statique ne nécessite que peu d'informations pour être encodée, contrairement à une scène avec beaucoup de mouvement qui, elle, réclamera plus d'informations et donc de débit afin de maintenir une qualité d'image acceptable.
Dans le cas de vidéos de conférences, donc composées majoritairement de plans fixes et par conséquent ne nécessitant pas de grandes variations de débit d'une part et destinées à être streamées en ligne d'autre part, donc par le biais de connexion à débits fixes cette option s'impose d'elle même.

L'encodage se fait en deux passes. D'ou l'utilisation des arguments -pass 1 et -pass 2 pour préciser à FFmpeg ou il en est et l'utilisation du fichier temporaire « sonytemp.webm ».

Les barres obliques sont ici pour un souci de lisibilité, elles permettent un retour à la ligne pour plus de compréhension par les humain⋅e⋅s tout en n'étant pas interprétées par Bash.

Ces explications fournies on comprends mieux la mécanique sous-jacente à la ligne de commande donnée en début d'article.

Tout ceci étant compris, il suffira donc lors d'un encodage de copier/coller le texte ci-dessous dans un éditeur de texte, de modifier selon les cas les valeurs en rouge puis de coller le résultat dans une console pour que l'encodage soit fait correctement.

ffmpeg \
-i sony.mp4 \
-threads 0 \
-s 1280x720 \
-b:v 2000k \
-acodec libvorbis \
-ac 2 \
-ar 44100 \
-ab 95k \
-pass 1 \
sonytemp.webm \
&& ffmpeg \
-i sony.mp4 \
-threads 0 \
-s 1280x720 \
-b:v 2000k \
-acodec libvorbis \
-ac 2 \
-ar 44100 \
-ab 95k \
-pass 2 \
sony.webm \
&& rm sonytemp.webm


Utilisation de FFprobe

Alors… j'ai expliqué une partie des valeurs et le pourquoi du comment, mais j'ai fait l'impasse sur d'autres. Alors c'est bien gentil, mais on ne va pas deviner quelle est la définition vidéo (oui, oui, définition, et non pas résolution, terme trop souvent employé à tort), l'échantillonage audio etc… ?
Pour cela il y a le programme FFprobe, packagé et livré avec FFmpeg, dont le travail consiste justement à retourner ces valeurs. Prenons l'exemple du même fichier sony.mp4 utilisé plus tôt :

ffprobe sony.mp4


Extraction des informations audio et vidéo avec FFprobe
Et voilà, toutes les informations manquantes sont sous nos yeux :

  • La définition est de 1280 x 720 ;
  • Le débit vidéo est de 1998 kb/s (que j'ai arrondi à 2000) ;
  • l'échantillonage audio (l'équivalent sonore de la définition) est de 44 100 Hz ;
  • FFprobe nous indique « stereo » donc il y a deux canaux audio ;
  • le débit audio est de 95 kb/s.

1983 - 2017 // Emmanuel Bourguin