2023-02-21 12:29:05 +01:00
---
categories: video audio stream flux
title: Howto FFmpeg
...
[FFmpeg ](http://ffmpeg.org ) est un outil en CLI permettant d'enregistrer, convertir et streamer des flux vidéos et audio.
* Statut de la page : nouvelle.
* [Documentation officielle ](https://ffmpeg.org/ffmpeg.html )
* [Wiki officiel ](https://trac.ffmpeg.org/wiki )
# Installer FFmpeg
~~~
# apt install ffmpeg
~~~
# Utiliser FFmpeg
## Syntaxe générale
2023-09-08 14:42:42 +02:00
/!\ Attention : l'ordre des arguments et des options est important !
2023-02-21 12:29:05 +01:00
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
~~~
2023-09-08 14:42:42 +02:00
## Enregistrer
### Enregistrer du son à partir d'un micro
2023-02-21 12:29:05 +01:00
Pour la capture audio, on utilise les flux fournis par le serveur de son [PulseAudio ](https://www.freedesktop.org/wiki/Software/PulseAudio/ ), qui fait le lien avec les pilotes ALSA des périphériques audio.
2023-04-24 17:33:30 +02:00
Lister les périphériques d'entrée de PulseAudio :
2023-02-21 12:29:05 +01:00
~~~
2023-04-24 17:33:30 +02:00
$ pactl list short sources | grep input
2023-02-21 12:29:05 +01:00
~~~
2023-04-24 17:33:30 +02:00
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` ) :
2023-02-21 12:29:05 +01:00
Puis lancer un enregistrement (voir [Lister les formats et les codecs supportés ](https://wiki.evolix.org/HowtoFFmpeg#lister-les-formats-et-les-codecs-support%C3%A9s ) pour les formats supportés en sortie) :
~~~
2023-04-24 17:33:30 +02:00
$ ffmpeg -f pulse -i < SOURCE_NUMBER | NAME > < OUTPUT_FILE >
2023-03-29 19:10:30 +02:00
2023-02-21 12:29:05 +01:00
$ # Par exemple :
$ ffmpeg -f pulse -i 1 output.wav
~~~
2023-04-24 16:43:10 +02:00
Utiliser `Ctrl+c` pour stopper l'enregistrement.
2023-04-24 16:27:08 +02:00
Les blocs d'arguments indiqués dans la section [Syntaxe générale ](#syntaxe-générale ) sont les suivants :
2023-03-29 19:10:30 +02:00
~~~
2023-04-24 16:43:10 +02:00
(Entrée audio ) (Flux de sortie)
2023-03-29 19:10:30 +02:00
$ ffmpeg (-f pulse -i 1) (output.wav)
~~~
2023-09-08 14:42:42 +02:00
### Enregistrer une discussion audio
2023-03-29 19:10:30 +02:00
En plus de la source du micro, on ajoute la sortie audio comme seconde source avec un autre bloc d'arguments `-i` .
2023-04-24 17:33:30 +02:00
Lister les périphériques d'entrée et de sortie de PulseAudio :
2023-03-29 19:10:30 +02:00
~~~
2023-04-24 17:33:30 +02:00
$ pactl list short sources | grep -E "(in|out)put"
2023-03-29 19:10:30 +02:00
~~~
2023-04-24 17:33:30 +02:00
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` ) :
2023-03-29 19:10:30 +02:00
Il faut également indiquer comme option de sortie `-filter_complex amix=inputs=2` pour dire à FFmpeg de fusionner les deux entrées audio.
~~~
2023-04-24 17:33:30 +02:00
$ ffmpeg -f pulse -i < INPUT_SOURCE_NUMBER | NAME > -f pulse -i < OUTPUT_SOURCE_NUMBER | NAME > -filter_complex amix=inputs=2 < OUTPUT_FILE >
2023-03-29 19:10:30 +02:00
$ # Par exemple :
$ ffmpeg -f pulse -i 1 -f pulse -i 2 -filter_complex amix=inputs=2 output.wav
~~~
2023-04-24 16:43:10 +02:00
Utiliser `Ctrl+c` pour stopper l'enregistrement.
2023-04-24 16:27:48 +02:00
Les blocs d'arguments indiqués dans la section [Syntaxe générale ](#syntaxe-générale ) sont les suivants :
2023-03-29 19:10:30 +02:00
~~~
2023-04-24 16:43:10 +02:00
(Entrée audio ) (Sortie audio ) ( Flux de sortie )
2023-03-29 19:10:30 +02:00
$ ffmpeg (-f pulse -i 1) (-f pulse -i 2) (-filter_complex amix=inputs=2 output.wav)
~~~
2023-02-21 12:29:05 +01:00
2023-09-08 14:42:42 +02:00
### Enregistrer une vidéo à partir d'un affichage Xorg
2023-02-21 12:29:05 +01:00
2023-06-30 14:49:14 +02:00
Pour la capture vidéo (image seulement, sans le son), on utilise les flux fournis fournis par le serveur graphique [Xorg ](https://www.x.org/wiki/ ).
2023-02-21 12:29:05 +01:00
2023-04-24 16:43:10 +02:00
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 :
2023-02-21 12:29:05 +01:00
~~~
$ xrandr | grep -E "[[:space:]]connected"
~~~
Puis lancer un enregistrement (voir [Lister les formats et les codecs supportés ](https://wiki.evolix.org/HowtoFFmpeg#lister-les-formats-et-les-codecs-support%C3%A9s ) pour les formats supportés en sortie) :
~~~
2023-04-24 16:43:10 +02:00
$ ffmpeg -f x11grab -video_size < SCREEN_RESOLUTION > -i :0.0< OFFSET > < OUTPUT_FILE >
2023-02-21 12:29:05 +01:00
$ # 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` ).
2023-09-08 14:42:42 +02:00
### Enregistrer une visioconférence (audio + vidéo)
2023-04-24 16:43:10 +02:00
2023-06-01 10:14:28 +02:00
Combiner les options des sections [Enregistrer une discussion audio ](#enregistrer-une-discussion-audio ) et [Enregistrer une vidéo à partir d’ un affichage Xorg ](#enregistrer-une-vidéo-à-partir-dun-affichage-xorg ) (voir ces sections pour trouver les bons arguments) :
2023-04-24 16:43:10 +02:00
~~~
2023-04-24 17:33:30 +02:00
$ ffmpeg -f pulse -i < INPUT_SOURCE_NUMBER | NAME > -f pulse -i < OUTPUT_SOURCE_NUMBER | NAME > # flux audio en entrée \
2023-04-24 16:45:34 +02:00
-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
2023-04-24 16:43:10 +02:00
$ # 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 ](#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)
~~~
2023-09-08 14:42:42 +02:00
## É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 >
~~~
2023-07-17 18:08:46 +02:00
# Troubleshooting
2023-07-17 18:09:00 +02:00
## Problème de lecture de vidéos avec Firefox
2023-07-17 18:08:46 +02:00
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 >
~~~