Vous n'êtes pas identifié(e).
L'icône rouge permet de télécharger chaque page du wiki visitée au format PDF et la grise au format ODT →
Ceci est une ancienne révision du document !
ffmpeg est une suite de logiciels libres en ligne de commande qui permet de traiter des flux vidéos ou audio. Avec ffmpeg, on peut déclencher des enregistrements, comme des lectures, appliquer des corrections à l'aide de filtres, ou transcoder des médias d'un format à un autre.
Aujourd'hui, il est préférable d'utiliser avconv à la place de ffmpeg tout en conservant les mêmes options.
Pour ce faire, si ce n'est déjà fait, installer :
apt-get update && apt-get install libav-tools
Et lancez vos commandes en remplaçant ffmpeg par avconv, tout simplement.
ffmpeg est dans les fichiers sources.list - deb-multimedia :
apt-get install ffmpeg
FFmpeg peut être manipulé à l'aide de différentes interfaces graphique:
Ou directement en ligne de commande comme on va le détailler ci-dessous.
Une petite introduction aux différentes terminologies de la vidéo peut être utile pour bien comprendre la syntaxe de ffmpeg.
Le format est le container qui permet le transport de la vidéo, du son et des sous-titres soit sous forme de fichier (mkv, mov…) soit sous forme de flux (MPEG TS). A l’intérieur d'un container on peut insérer (muxer) ou extraire (demuxer):
On parle de multiplexer les différentes pistes (flux ou stream) dans un format.
FFmpeg fournit une liste des formats qu'il supporte:
ffmpeg -formats
DE avi AVI (Audio Video Interleaved) DE ogg Ogg D matroska,webm Matroska / WebM E mov QuickTime / MOV D mov,mp4,m4a,3gp,3g2,mj2 QuickTime / MOV E webm WebM
Le D signifie la capacité à le lire, et E la possibilité d'encapsuler dans le format.
Le codec est un algorithme qui permet d'encoder la vidéo ou le son afin de l'adapter au protocole de transport (IP,DVB,fichier…) notamment en réduisant le débit(Kbits/s). Selon les codecs, la compression peut s'accompagner d'une perte de qualité dans l'image ou le son plus ou moins importante.
De la même manière que pour les formats, ffmpeg liste les codecs qu'il est capable de gérer:
ffmpeg -codecs
ffmpeg dispose aussi d'une base importante de filtres qui permettent de modifier le contenu de chaque flux, comme changer la résolution, modifier le volume d'une piste, incruster un logo etc….
ffmpeg -filters
Si on résume, ffmpeg permet de multiplexer ou de-multiplexer dans différents formats:
Et de modifier à l'aide de filtres le contenu de chaque flux indépendamment.
En effet, chaque codec ou format comporte sa propre norme avec plus ou moins de licences restrictives, toutes les combinaisons ne sont donc pas possibles.
Heureusement le libre fournit plusieurs formats ainsi que plusieurs codecs libre de droit :
Avant de commencer tout encodage il est bon de connaître son contenu, ffmpeg permet de lire l'entête du “format”:
ffmpeg -i tears_of_steel.mkv
Ce qui nous retourne ceci:
Input #0, matroska,webm, from 'tears_of_steel.mkv': Metadata: title : ARTIST : COMPOSER : SYNOPSIS : DATE_RELEASED : GENRE : ENCODER : Lavf54.29.104 Duration: 00:12:14.12, start: 0.000000, bitrate: 4615 kb/s Stream #0:0(eng): Video: h264 (Main), yuv420p, 1280x534 [SAR 1:1 DAR 640:267], 24 fps, 24 tbr, 1k tbn, 180k tbc (default) Stream #0:1(eng): Audio: aac, 44100 Hz, stereo, s16 (default) Stream #0:2(eng): Audio: ac3, 48000 Hz, 5.1(side), s16, 448 kb/s (default) Stream #0:3(eng): Subtitle: ssa (default) Stream #0:4(fr): Subtitle: ssa (default)
Et pour ce fichier, on y apprend beaucoup de choses :
On peut facile changer de format sans toucher au flux :
ffmpeg -i tears_of_steel.mkv -c copy tears_of_steel.mov
COMMANDE | ACTION |
---|---|
-i | spécifie le fichier d'entrée |
-c copy | copie à l'identique la totalité des flux |
-c:v copy | copie à l'identique les pistes vidéos |
-c:a copy | copie à l'identique les pistes audio |
-c:s copy | copie à l'identique les pistes sous-titres |
Si l'on souhaite différencier les flux entre eux
COMMANDE | ACTION |
---|---|
-c:v:0 | première piste vidéo |
-c:a:0 | première piste audio |
-c:a:1 | deuxième piste audio |
-c:s:0 | première piste sous-titre |
-c:s 1 | deuxième piste sous-titre |
ffmpeg permet de modifier l'ordre des flux pour les adapter à ses usages à l'aide du paramètre “-map” :
ffmpeg -i tears_of_steel.mkv -map 0:0 -map 0:2 -map 0:1 -map 0:4 -map 0:3 -c copy tears_of_steel-v2.mkv
Dans cette commande j'inverse les deux flux audio entre-eux et ainsi que les deux sous-titres.
Lors de l’exécution ffmpeg indique quel croisement (mapping) il applique :
Stream mapping: Stream #0:0 -> #0:0 (copy) Stream #0:2 -> #0:1 (copy) Stream #0:1 -> #0:2 (copy) Stream #0:4 -> #0:3 (copy) Stream #0:3 -> #0:4 (copy)
Le paramètre -map
permet aussi d'ajouter un flux.Dans l'exemple qui suit un sous-titre en espagnol (TOS-es.srt) en position 4 :
ffmpeg -i tears_of_steel.mkv -i TOS-es.srt -map 0:0 -map 0:1 -map 0:2 -map 1:0 -map 0:3 -map 0:4 -c:v copy -c:a copy -metadata:s:s:0 language=esp tears_of_steel-v2.mkv
Cela permet de l’insérer où l'on souhaite :
L'option metadata permet de renseigner la langue du fichier :
En utilisant les possibilités du mapping il est très facile d'extraire un seul flux d'un fichier en comportant plusieurs :
ffmpeg -i tears_of_steel.mkv -map 0:2 -acodec copy tears_of_steel_BO.mkv
Dans cet exemple, je copie qu'une seule des pistes audio.
Et l'on peut, très bien, faire une conversion dans la foulée :
ffmpeg -i tears_of_steel.mkv -map 0:2 -acodec libmp3lame -ar 44100 -ac 2 -ab 192k tears_of_steel_BO.mp3
ffmpeg -i tears_of_steel.mkv -map 0:4 -c:s srt tears_of_steel_FR.srt
FFmpeg permet d'extraire, des morceaux d'un média, en précisant un point d'entrée avec -ss (-ss 00:06:46) et précisant un durée avec -t (-t 00:01:00). Cette fonction est très utile pour faire des tests d'encodage et pour valider sa commande. A noter que -ss et -t doivent être placés devant le premier input (-i).
ffmpeg -ss 00:06:46 -t 00:01:00 -i tears_of_steel.mkv -c copy tears_of_steel_extrait.mkv
Parfois la durée -t n'est pas prise en compte. On peut utiliser l'option -to en la plaçant au niveau du fichier de sortie
ffmpeg -ss 00:06:46 -i tears_of_steel.mkv -c copy -to 00:01:00 tears_of_steel_extrait.mkv
Selon les codecs, il est possible de lancer une conversion sur plusieurs threads processeurs grâce à l'option threads :
ffmpeg -threads 4 -i tears_of_steel.mkv -c copy tears_of_steel_extrait.mkv
Ici je force le travail sur 4 threads ce qui peux me faire gagner un temps précieux.
option | explication de l'option |
---|---|
-b | configuration du débit binaire par défaut 200 kbps |
-sameq | copie à l'identique le débit binaire |
-s | configuration de la taille du cadre d'affichage |
-aspect | configuration du format d'affichage (4:3, 16:9 ou 1.3333, 1.7777) |
-vcodec ou -c:v | décision du choix du codec |
-pass | nombre de passage à l'encodage, une passe (-pass 1) ou deux passes (-pass 2) |
-qmin | détermine le seuil minimum du débit binaire variable (VBR) |
-qmax | détermine le seuil maximum du débit binaire variable (VBR) |
-f | sélectionne le nom du conteneur |
-r | définit le nombre d'images par seconde |
Se placer dans le répertoire VIDEO_TS contenant les fichiers.VOB avec la commande cd, puis, en utilisant la commande cat, faire la convertion ainsi :
cat *.VOB | ffmpeg -i - video.mkv
Il suffit de changer en sortie l'extension vidéo mkv en mp2, mp4, etc… pour que la convertion se fasse dans le format vidéo indiqué.
VP8 est un codec vidéo libre promu par Google, un bon équivalent au h264/mp4 :
ffmpeg -i tears_of_steel_720p.mkv -c:v:0 libvpx -crf 10 -vb 4M -c:a copy tears_of_steel_vp8.mkv
Ici on utilise la librairie libvpx avec deux options :
Une liste des options possibles pour encoder en vp8 est disponible ici:
Le h264 ou mpeg4 est un codec propriétaire couramment utilisé pour son bon rapport qualité/débit :
ffmpeg -i tears_of_steel_720p.mkv -c:v:0 libx264 -preset slow -crf 22 -c:a copy tears_of_steel_h264.mp4
Une documentation plus détaillé en anglais est disponible ici:
Il y a une fonction concat qui concatène des fichiers en entrée. C’est ce que l’on va utiliser… sauf que cela ne fonctionne pas avec des fichiers MP4 (container MOV, h264 en codec vidéo, et aac en codec audio).
On va d’abord changer de container pour nos flux source, puis les assembler, car on ne va pas refaire de transcodage, juste de la copie de flux.
La fonction concat accepte bien le MPEG Transport Stream, allons y :
ffmpeg -y -i "source1.mp4" -c copy -bsf:v h264_mp4toannexb -f mpegts "source1.ts"
Le -bsf:v h264_mp4toannexb restructure le flux h264 pour qu’il puisse rentrer dans le TS. Il le demande, et ça marche.
Une fois que tous les fichiers à assembler sont passés en TS, on les regroupe et les converti en mp4 ainsi :
ffmpeg -y -i concat:"source1.ts|source2.ts" -c copy -f mov "destination.mp4"
Source :
Si les fichiers à assembler sont nombreux, on peut utiliser une boucle.
Rassembler les vidéos afin qu'elle portent un numéro progressif pour la vidéo finale.
Créer le répertoire accueillant les MPG, par exemple :
mkdir ~./video-mpg
Y déposer les videos MPG à assembler :
mv /répertoire_acquis/*.mpg ~./video-mpg
Les numéroter dans l'ordre où nous souhaitons les assembler.
Perso, j'utilise GPRENAME qui me rend la vie facile…
Lister le contenu obtenu :
ls ~./video/
0001.mpg 0002.mpg 0003.mpg 0004.mpg 0005.mpg
Nous allons d'abord les convertir chacune en mp4 en utilisant une première fois la boucle for :
cd /repertoire/video-mpg
for i in {0001..0005}; do $i -c:v:0 libx264 -preset slow -crf 15 -s 1024x768 -threads 0 -c:a $i.mp4; done
Explication :
for i in {0001..0005};
Se traduit : la variable i
prendra respectivement les chiffres 0001
0002
0003
0004
0005
comme valeur.
Le point virgule ;
indique la fin de cette indication.
Ensuite vient :
do $i -c:v:0 libx264 -preset slow -crf 15 -s 1024×768 -threads 0 -c:a $i.mp4;done
Explication :
Au début : do $i
indique qu'il faut considérer chacun des numéros attribués à la variable i
précédemment définie.
Le : ;done
indique la fin de la commande qui est à répéter pour chaque variable $i
trouvée.
Se placer dans le dossier rassemblant les vidéos MPG numérotées :
cd /repertoire/video-mpg
On exécute la commande de conversion en TS :
for i in {0001..0005}; do ffmpeg -y -i "$i.mp4" -c copy -bsf:v h264_mp4toannexb -f mpegts "$i.ts"; done
Et pour assembler le tout directement en MP4 :
ffmpeg -y -i concat:"0001.ts|0002.ts|0003.ts|0004.ts|0005.ts" -c copy -f mov "1.mp4"
Où la vidéo 1.mp4 est la vidéo finale assemblée.
Alternative :
En utilisant la boucle de nouveau :
toto=""; for i in {0001..0005}; do toto="$toto$i.ts|"; done; ffmpeg -y -i concat:"$toto" -c copy -f mov "1.mp4"
Merci kyodev pour cette astuce !
Source de la boucle :
Encoder une vidéo captée en 4:3 pour la remettre en 16:9 :
ffmpeg -i film.mkv -aspect 16:9 -c copy film2.mkv
On peut en profiter pour changer le codage par la même occasion, par exemple :
ffmpeg -i film.avi -aspect 16:9 -c copy film2.mkv
Il faut utiliser le CRF pour définir une qualité d'image constante. L'objectif est d'obtenir une qualité d'image stable entre plusieurs vidéos. À durée égale, la taille du fichier peut varier suivant si la vidéo est facilement compressible ou pas.
L'encodage en 1 ou 2 passes en spécifiant un bitrate était utile à une certaine époque pour utiliser le maximum de place disponibles sur des supports comme le CD ou le DVD, typiquement obtenir la meilleure qualité de vidéo sur 700Mo exactement. En définissant un bitrate de 1000kb/s (vidéo+audio) pour une vidéo de 30mn00s, on obtient un fichier de 219,72 Mio exactement (ajouter quelques Mio pour le conteneur mkv).
Si tu ne comptes pas utiliser ces formats de stockage, je te conseille vivement d'utiliser le CRF. Pour info, un encodage en 2 passes ne fait que définir précisément un CRF lors de la première passe, et fait un encodage tout à fait normal en 2ème passe avec le CRF défini précédemment.
Voir discussion avec un des devs du x264 :
Par défaut le CRF est fixé à 23, ce qui donne une très bonne qualité.
L'échelle est logarithmique, une différence de 6 points double ou divise par 2 environ la taille du fichier final
Commentaire | Option | |
---|---|---|
On peut séparer plusieurs filtres avec une virgule, l'ordre est important | -vf filtre1,filtre2,etc | |
Rogner l'image, origine = en haut à gauche | -vf crop=largeurX:hauteurY:decalageX:decalageY | |
Mettre à l'échelle | -1 conserve le ratio et flag peut être 'bicubic' : -vf scale=-1:480:flags='lanczos' | |
Débruitage de vidéo | défaut = 4. Utiliser 2 pour les vidéos faiblement bruitées : -vf hqdn3d=2 | |
Désentralaçage (mcdeint et kerndeint sont moins efficaces) | -vf yadif | |
Ajustement des couleurs | ([mini/maxi|défaut]) : -vf mp=eq2=gamma:contraste:luminosite:saturation | [0.1/10|1:-2/2|1:-1/1|0:0/3|1] |
Modifie le ratio, le lecteur affichera la vidéo en 16/9 peut importe la définition | -aspect 16:9 | |
Change le départ, la fin ou la durée | -ss départ en secondes -t durée en secondes -to fin en secondes | |
Désactive les flux audios ou vidéos | -an sans audio -vn sans vidéo | |
Audio Opus | bitrate -c:a libopus -b:a 64k | |
Audio Vorbis, qualité | -c:a libvorbis | -q:a 0 (~64 kbps) -q:a 2 (~96 kbps -q:a 3 (~112 kbps standard) -q:a 4 (~128 kbps) -q:a 5 (~160 kbps) |
Conversion audio multi-canaux vers stéréo | -ac 2 |
Et le lien vers la doc complète de ffmpeg avec toutes les options disponibles pour faire des trucs vraiment spéciaux :
Les conseils pour du x264 sur le wiki ffmpeg :
Pompé du forum df là :
Merci ska ! Que ton chemin se couvre de pétales de rose…
La liste des options ffmpeg pour le traitement Audio est disponible ici: http://ffmpeg.org/ffmpeg.html#Audio-Options
En voici les principales:
option | explication de l'option |
---|---|
-acodec ou -c:a | détermine le choix du codec |
-ar | configuration de la fréquence d'échantillonnage (44100 Hz) |
-ab | configuration du débit binaire par défaut 64 kbps |
-ac | configure le nombre de canaux (mono-stéréo) |
Vorbis est un codec audio libre, d'encodage avec perte, équivalent au mp3/h263 :
ffmpeg -i tears_of_steel_720p.mkv -c:v copy -c:a:0 libvorbis -qscale:a 5 -ar 48000 tears_of_steel_vorbis.mkv
Créer un fondu entrant et sortant sur un fichier wav :
ffmpeg -i LE_FICHIER.wav -af "afade=t=in:ss=0:d=15,afade=t=out:st=200:d=22" output.wav
Merci golgot200
Plusieurs codec permettent d'encoder le son en mp3, libmp3lame est l'un des plus utilisé.
Voici un exemple en forçant le bitrate à 256kbits/s, en ré-échantillonnant en 44100hz et en forçant la fabrication d'un stéréo :
ffmpeg -i 01.ogg -acodec libmp3lame -ar 44100 -ac 2 -ab 256k 01.mp3
ffmpeg -f image2 -i image%d.jpg video.mpg
Ce qui transformera les images du répertoire courant nommées image1.jpg, image2.jpg, image3.jpg, … en un fichier vidéo nommé video.mpg.
Notons que %d sera automatiquement transformé en 1, 2, 3, 4, 5…
Si l’on a des images nommées image001.jpg, image002.jpg, image003.jpg, … vous utiliserez la commande :
ffmpeg -f image2 -i image%03d.jpg video.mpg
Mais on peut aussi utiliser d’autres types de format d’images : PGM, PPM, PAM, PGMYUV, JPEG, GIF, PNG, TGA, TIFF, SGI, PTX
On peut aussi paramétrer plus finement l’export vidéo :
ffmpeg -r 24 -b 1800 -i image%d.bmp video.mpg
Ici on spécifie 24 images par seconde et un bitrate de 1800kb/s.
Transformer une image fixe jpg en video mp4 :
ffmpeg -i votre_image.jpg -c:v huffyuv -vcodec libx264 -r 0.07 votre_image.mp4
L'option :
-r 0.-r 0.07
module à environ 1/15e la vitesse de défilement pour la video MP4. Si on augmente, ça accélère, si on diminue, ça ralentit.
Merci au captnfab qui de son vaisseau flambloie les tutos à tour de bras !
ffmpeg -i video.mpg image%d.jpg
ce qui générera les fichiers image1.jpg, image2.jpg, …
Mais on peut aussi générer des images au format : PGM, PPM, PAM, PGMYUV, JPEG, GIF, PNG, TIFF, SGI. Par exemple :
ffmpeg -i video.mpg image%d.tif
ffmpeg -i fichier_video -f mjpeg -ss 10 -vframes 1 -s 320x240 fichier_vignette.jpg
La capture d'écran vidéo dépend beaucoup des capacités de votre machine, notamment de la vitesse d'écriture des disques et de la rapidité du processeur pour l'encodage temps réel. Il est d'ailleurs conseillé de faire la capture de manière brute et de faire un encodage plus fin par la suite.
Si votre machine ne permet d'enregistrer qu'un nombre plus petit d'images que prévu, la vidéo semblera accélérée.
FFmpeg permet de capturer la sortie du serveurX avec le module x11grab :
ffmpeg -f x11grab -r 25 -s 1280x1024 -i :0.0 -vcodec libx264 -crf 0 -preset ultrafast output.mkv
Pour capturer seulement un morceau de l'écran, on peut préciser les coordonnées du point de départ de la capture (x=200 et y= 100) :
ffmpeg -f x11grab -r 25 -s 512x512 -i :0.0+200,100 -vcodec libx264 -crf 0 -preset ultrafast output.mkv
Plus d'informations disponibles sur :
FFmpeg permet de capturer l'image en provenance d'une Webcam grâce au module video4linux2 :
ffmpeg -f video4linux2 -r 25 -s 640x480 -i /dev/video0 mawebcam.avi
Plus d'information sur la capture avec video4linux2 :