ffmpeg, encodeur-décodeur vidéo en ligne de commande

L

E monde des fichiers «multimédia» est assez complexe, avec ses containeurs et ses formats image, son, sous-titres... ffmpeg est un programme en ligne de commande qui en permet les conversions.

La commande ffmpeg n'est pas incluse dans les dépôts de Debian 8 Jessie ni Debian 9 Stretch parce que toutes ses composantes ne sont pas libres. Il figure sur le dépôt deb-multimedia, à activer sur votre système. Il permettra également l'installation de la librairie libmp3lame0, pour le codec mp3.

Cette page explique le minimum à connaître sur un système GNU/Linux (ligne de commande, système de fichiers...)

2014.10.03 – rév. 2019.03.17

Prise en main

La forme la plus simple d'utilisation est

ffmpeg -i fichier_original.flv fichier_produit.mp4

L'option -i précède le fichier d'origine ; la chaîne non précédée d'une option est le fichier de sortie. Les options et paramètres destinés au fichier d'entrée doivent figurer avant -i, les paramètres à appliquer au fichier de sortie doivent figurer avant son nom:

ffmpeg -ss 3.14 -i zouc.mov -vf "transpose=1" zouc.webm

passe (-ss) 3,14 secondes du premier fichier avant de commencer le transcodage en format webm, avec une rotation d'un quart de tour (sens horaire ; "transpose=2" pour le sens trigonométrique). Le format webm est directement utilisable en HTML5 avec la balise <video> :

<video src="zouc.webm" width="300" height="400" controls="true" type="video/webm; codecs='vp8,vorbis'">
</video>

Note: beaucoup de «formats» ne sont que des conteneurs, une façon d'organiser l'image, un ou plusieurs flux audio, des sous-titres... sans préjuger de l'encodage du son (wav, mp3, Vorbis...) ni de l'image (vp8, H.264, Theora, MPEG-1...): une extension (MP4, AVI, MOV...) n'implique donc pas toujours les types d'encodages utilisés.

ffmpeg -formats liste les formats connus.

-target x spécifie le type de média à créer en fonction de son utilisation: vcd, svcd, dvd, dv ou dv50, qui peuvent être préfixé de pal-, ntsc- ou film-. Les formats seront alors alignés sur les standards.

Il peut y avoir deux fichiers en entrée, par exemple pour mixer son et image:

ffmpeg -i audio.mp3 -i video.mpg sortie.mp4

Pour extraire chaque image d'une (petite) vidéo:

ffmpeg -i video.flv image%d.jpg

Assurez-vous de disposer de suffisamment de place sur votre disque si vous appliquez cette commande sur un gros fichier, la compression vidéo étant en général bien plus efficace que la compression de chaque image produite. %d est nécessaire pour la numérotation des photos.

Codecs et bitrates

Codecs

L'extension utilisée permet en général à ffmpeg de choisir automatiquement l'encodage (ici, libvorbis):

ffmpeg -i original.wav sortie.ogg

Mais les conteneurs admettent parfois plusieurs encodages et il peut être nécessaire de le(s) spécifier:

ffmpeg -i original.mkv -acodec ac3 sortie.mpg

ffmpeg -codecs liste les codecs utilisables. Parmi ceux-ci:

Pour réduire une vidéo à un fichier son:

ffmpeg -i original.mp4 sortie.mp3

Pour forcer le codec:

ffmpeg -i original.mp4 -acodec libvorbis sortie.oga

Pour supprimer le son, utiliser -an

ffmpeg -i original.avi -an sortie.mpg

-vn peut être utilisé pour supprimer l'image d'une vidéo, mais autant produire alors un fichier audio.

Débits audio et vidéo (bitrate): -b:x n

-b:a n permet de préciser le débit audio (en kbps, kilobits par seconde, 128 par défaut):

ffmpeg -i original.wav -b:a 64 sortie.mp3

-b:v n permet de préciser le débit audio, également exprimé en kbps. Cela s'applique au ficher de sortie. Pour forcer l'encodage en mpg à 64kbps (audio) et 1200kbps (vidéo):

ffmpeg -i original.avi -b:a 64 -b:v 1200 sortie.mpg

Ces deux taux sont de qualité moyenne, mais il ne sert à rien de tenter de l'augmenter si le fichier de départ est de mauvaise qualité (note: -b:a et -b:v remplacent -ab et -b, en désuétude).

Dimensions et sens

Dimensions et proportion

-s 400x300 précise la largeur et la hauteur de l'image, mais en fait, la hauteur dépend de la largeur, ce paramètre ne modifie pas la proportion (ratio).

-aspect 16:9 ou -aspect 16:9 précise un ratio largeur/hauteur; le plus courant étant 4:3

Miroirs et rotations

-vf définit les filtres vidéos (video-filters)

-vf vflip miroir vertical de l'image
-vf hflip miroir horizontal de l'image

-vf "transpose=1" rotation de l'image d'un quart de tour, sens horaire
-vf "transpose=2" rotation de l'image d'un quart de tour, sens trigonométrique
-vf "transpose=3" rotation de l'image d'un quart de tour, sens horaire et miroir vertical

Temporalité

Pour choisir une image par seconde:

ffmpeg -r 25 -i original.avi -r 1 sortie.avi

considère les 25 fps du fichier origine.avi, et en affiche une par seconde dans le fichier de sortie. -r est utilisé deux fois: la première avant le fichier d'origine et l'autre avant le fichier de sortie.

-r 50 -i original.mp4 -r 25 sortie.mp4

double la vitesse de l'image: à 50 images du fichier d'origine correspondent 25 dans le fichier de sortie. Le son ne change pas: les images vont deux fois plus vite que le son.

-fs n s'arrête lorsque le fichier de sortie atteint n octets
-t n s'arrête après n secondes ; accepte la forme 00:03:45

-ss n laisse tomber les n premières secondes (accepte la forme 00:03:45).
-sseof n compte le nombre de secondes en commençant par la fin du fichier

-ss et -sseof peuvent être placés avant -i, les n premières secondes seront simplement ignorées. Après -i origine.ext, les n premières secondes sont traitées mais non enregistrées, ce qui apporte plus de sécurité dans le traitement.

ffmpeg -i fichier.mov -vf trim=443:512 sortie.mov coupe ce qui précède la seconde 443 et ce qui excède la seconde 512