Howto FFmpeg
FFmpeg est un outil en CLI permettant d’enregistrer, convertir et streamer des flux vidéos et audio.
- Statut de la page : nouvelle.
- Documentation officielle
- Wiki officiel
Installer FFmpeg
# apt install ffmpeg
Utiliser FFmpeg
Syntaxe générale
/!\ Attention : l’ordre des arguments et des options est important !
La syntaxe de la commande est la suivante :
$ ffmpeg [global_options] {[input_file_options] -i input_url} ... {[output_file_options] output_url} ...
On passe en option plusieurs flux d’entrée et de sortie. Les flux d’entrée sont ré-encodés et redirigés vers les sorties (en fonction des options).
Chaque flux d’entrée est déclaré d’abord avec ses options et un
-i <INPUT_URL>
final (« URL » est à prendre au sens
large).
Idem pour chaque flux de sortie, mais sans le -i
.
Lister les formats et les codecs supportés
$ ffmpeg -formats
On peut aussi lister les codecs pour l’encodage et le décodage avec :
$ ffmpeg -decoders
$ ffmpeg -encoders
Enregistrer
Enregistrer du son à partir d’un micro
Pour la capture audio, on utilise les flux fournis par le serveur de son PulseAudio, qui fait le lien avec les pilotes ALSA des périphériques audio.
Lister les périphériques d’entrée de PulseAudio :
$ pactl list short sources | grep input
Il est possible de fournir à FFmpeg le numéro du périphérique audio
(colonne 1, par exemple : 1
) ou bien son nom complet
(colonne 2, par exemple :
alsa_input.pci-0000_00_1f.3.analog-stereo
) :
Puis lancer un enregistrement (voir Lister les formats et les codecs supportés pour les formats supportés en sortie) :
$ ffmpeg -f pulse -i <SOURCE_NUMBER|NAME> <OUTPUT_FILE>
$ # Par exemple :
$ ffmpeg -f pulse -i 1 output.wav
Utiliser Ctrl+c
pour stopper l’enregistrement.
Les blocs d’arguments indiqués dans la section Syntaxe générale sont les suivants :
(Entrée audio ) (Flux de sortie)
$ ffmpeg (-f pulse -i 1) (output.wav)
Enregistrer une discussion audio
En plus de la source du micro, on ajoute la sortie audio comme
seconde source avec un autre bloc d’arguments -i
.
Lister les périphériques d’entrée et de sortie de PulseAudio :
$ pactl list short sources | grep -E "(in|out)put"
Il est possible de fournir à FFmpeg le numéro des périphériques audio
(colonne 1) ou bien leur nom complet (colonne 2). Le nom du périphérique
de sortie audio de sortie à utiliser contient normalement
.monitor
(par exemple :
alsa_output.pci-0000_00_1f.3.analog-stereo.monitor
) :
Il faut également indiquer comme option de sortie
-filter_complex amix=inputs=2
pour dire à FFmpeg de
fusionner les deux entrées audio.
$ ffmpeg -f pulse -i <INPUT_SOURCE_NUMBER|NAME> -f pulse -i <OUTPUT_SOURCE_NUMBER|NAME> -filter_complex amix=inputs=2 <OUTPUT_FILE>
$ # Par exemple :
$ ffmpeg -f pulse -i 1 -f pulse -i 2 -filter_complex amix=inputs=2 output.wav
Utiliser Ctrl+c
pour stopper l’enregistrement.
Les blocs d’arguments indiqués dans la section Syntaxe générale sont les suivants :
(Entrée audio ) (Sortie audio ) ( Flux de sortie )
$ ffmpeg (-f pulse -i 1) (-f pulse -i 2) (-filter_complex amix=inputs=2 output.wav)
Enregistrer une vidéo à partir d’un affichage Xorg
Pour la capture vidéo (image seulement, sans le son), on utilise les flux fournis fournis par le serveur graphique Xorg.
Lister les écrans connectés et identifier la résolution (par exemple
2560x1080
) et le décalage (par exemple
+2560+0
) de l’écran à enregistrer :
$ xrandr | grep -E "[[:space:]]connected"
Puis lancer un enregistrement (voir Lister les formats et les codecs supportés pour les formats supportés en sortie) :
$ ffmpeg -f x11grab -video_size <SCREEN_RESOLUTION> -i :0.0<OFFSET> <OUTPUT_FILE>
$ # Par exemple :
$ ffmpeg -f x11grab -video_size 2560x1080 -i :0.0+2560+0 output.webm
Utiliser Ctrl+c
pour stopper l’enregistrement (la
clôture prend un peu de temps pour l’encodage, ne pas forcer l’arrêt en
faisant 2 fois Ctrl+c
).
Enregistrer une visioconférence (audio + vidéo)
Combiner les options des sections Enregistrer une discussion audio et Enregistrer une vidéo à partir d’un affichage Xorg (voir ces sections pour trouver les bons arguments) :
$ ffmpeg -f pulse -i <INPUT_SOURCE_NUMBER|NAME> -f pulse -i <OUTPUT_SOURCE_NUMBER|NAME> # flux audio en entrée \
-f x11grab -video_size <SCREEN_RESOLUTION> -i :0.0<OFFSET> # flux vidéo en entrée \
-filter_complex amix=inputs=2 <OUTPUT_FILE> # flux audio+vidéo en sortie
$ # Par exemple :
$ ffmpeg -f pulse -i 1 -f pulse -i 2 -f x11grab -video_size 2560x1080 -i :0.0+2560+0 -filter_complex amix=inputs=2 output.webm
Utiliser Ctrl+c
pour stopper l’enregistrement (la
clôture prend un peu de temps pour l’encodage, ne pas forcer l’arrêt en
faisant 2 fois Ctrl+c
).
Les blocs d’arguments indiqués dans la section Syntaxe générale sont les suivants :
(Entrée audio ) (Sortie audio ) ( Vidéo ) ( Flux de sortie )
$ ffmpeg (-f pulse -i 1) (-f pulse -i 2) (-f x11grab -video_size 2560x1080 -i :0.0+2560+0) (-filter_complex amix=inputs=2 output.webm)
Éditer
Couper un son ou une vidéo
Couper le début :
ffmpeg -i <INPUT_FILE> -ss <NEW_START_TIME> -c copy <OUTPUT_FILE>
L’option -c copy
indique à FFmpeg de copier le flux
entrant sans le ré-encoder. Le format de NEW_START_TIME
est
: [<HH>:]<MM>:<SS>[.<ms>]
.
Couper la fin :
ffmpeg -sseof -<NEW_END_TIME> -i <INPUT_FILE> -c copy <OUTPUT_FILE>
Noter le -
devant NEW_END_TIME
, car on part
de la fin (EOF = end of file).
Extraire une partie spécifique :
ffmpeg -i <INPUT_FILE> -ss <START_TIME> -to <END_TIME> -c copy <OUTPUT_FILE>
On peut profiter de la commande de découpe pour faire aussi une
conversion. Par exemple d’un fichier .wav
en
.ogg
(Vorbis), auquel cas l’option -c copy
n’est plus pertinente :
ffmpeg -i <INPUT_FILE> -ss <START_TIME> -to <END_TIME> -c:a libvorbis <OUTPUT_FILE>
Troubleshooting
Problème de lecture de vidéos avec Firefox
Il semble que certaines versions de Firefox ne supportent pas
l’espace de couleurs par défaut GBRP
pour le codec VP9 du
format WEBM
.
A la place, utiliser l’espace de couleurs YUV420P
en
ajoutant l’option -pix_fmt yuv420p
au flux de sortie :
(Flux d'entrée...) ( Flux de sortie )
$ ffmpeg (... ) (... -pix_fmt yuv420p <OUTPUT_FILE>)
De la même manière, pour corriger l’espace de couleurs d’une vidéo existante :
$ ffmpeg -i <INPUT_FILE> -pix_fmt yuv420p <OUTPUT_FILE>