ffmpeg

(page créée le 15 juillet 2021)
Voir aussi : la fabrique gif / ffmpeg

ffmpeg est un logiciel en ligne de commande pour la manipulation de fichiers audiovisuels (video, audio, image, son, metadonnées). Il fait partie des logiciels “couteaux suisses” de manipulation de fichiers multimédia (avec imagemagick et sox). ffmpeg est utile pour :

  • changer les caractéristiques d'une vidéo (définition, nombre d'images par seconde),
  • changer les caractéristiques d'un fichier audio : par ex. conversion de wav vers mp3,
  • transcoder (changer de format et de codec),
  • extraire d'une vidéo : des images, une bande-son, une séquence, etc.,
  • manipuler les sous-titres,
  • créer des vidéos : en mixant images, séquences, bandes son,
  • ajouter / manipuler les méta-données
  • et une multitude d'autres choses!

ffmpeg est fourni avec deux autres utilitaires :

  • ffprobe : affichage des caractéristiques d'un fichier (doc ffprobe)
  • ffplay : lecteur de fichiers multimedia (doc ffplay)

Ce script traite tous les fichiers .wav d'un répertoire pour les transformer en .mp3 en ajoutant des métadonnées (utilisé pour les podcasts des 26 heures de radio baleine)

#!/bin/bash
# ffmpeg 3.2.12-1 / debian 9.5 @ kirin / 20210715
# conversion de fichiers audio .wav en fichiers .mp3 podcastables
# la plupart des métadonnées sont ajoutées automatiquement, pour les autres il faut compléter à la main!
# ffmpeg et métadonnées : https://wiki.multimedia.cx/index.php/FFmpeg_Metadata
 
metadataArtist="(collectif)"
metadataAlbum="Marathon Radio La Baleine"
metadataGenre="Spoken & Audio" 
metadataYear="2021"
 
for i in *.wav; do
    ffmpeg -i "$i" \
	-vn -ar 44100 -ac 2 -b:a 192k -f mp3 \
	-metadata artist="$metadataArtist" \
	-metadata album="$metadataAlbum" \
	-metadata genre="$metadataGenre" \
	-metadata date="$metadataYear" \
	"${i%wav}mp3"
done

(Sans recompression la partie sonore)
Pas facile de trouver des infos récapitulatives sur la définition et le poids des fichiers recommandés pour des podcasts… (ici l'image fait 512×512 et < 200 ko

ffmpeg -i in.mp3 -i image.png -map 0:0 -map 1:0 -codec copy -id3v2_version 3 -metadata:s:v title="Album cover" -metadata:s:v comment="Cover (front)" out.mp3

-codec copy : pas de réencodage, ni pour l'image, ni pour le son

sous forme de script pour traiter tout un répertoire

#!/bin/bash
# ffmpeg 3.2.12-1 / debian 9.5 @ kirin / 20210715
 
for i in *.mp3; do
    ffmpeg -i "$i" -i image.png -map 0:0 -map 1:0 -codec copy -id3v2_version 3 -metadata:s:v title="Album cover" -metadata:s:v comment="Cover (front)" "${i%wav}mp3"
done

Comment savoir si une vidéo a une piste son audible ? Le script renvoie le nom de chaque fichier avec le volume moyen, en décibel.

#!/bin/bash
#  20230131 @ kirin / ffmpeg 3.2.12-1 / debian 9.5
#  Passer le chemin du dossier en argument : liste_volume_video.sh /chemin/vers/dossier
#  Ce script ne vérifie pas que les fichiers sont bien des vidéos!
 
# Définir le dossier selon l'argument passé
 
if [ -z "$1" ]; then
  dir="."
else
  dir=$1
fi
 
# Parcourir le dossier et traiter chaque fichier
 
for file in "$dir"/*; do
  echo -n "$file : " 
  ffmpeg -i "$file" -af "volumedetect" -f null /dev/null 2>&1 | grep "mean_volume:" | sed 's/\[.*\]//g'
done
echo -e "\n"
#!/bin/bash
# ffmpeg 3.2.5-1 debian 9.1 stretch @ urzhiata / 20180807 
for i in *.mp3
do
  ffmpeg -i "$i" -t 10 -vn -acodec pcm_s16le -sample_fmt s16 -ar 44.1k -ac 1 mod_"$i".wav
done

Convertir des fichiers realmedia (.rm) en mp3
Ça fonctionnerait aussi avec un autre format audio en entrée (wav, aiff, etc.)

# 20210927 ffmpeg 3.2.12-1 / debian 9.5 @ kirin
ffmpeg -i realmedia.rm -vn -ar 44100 -ac 2 -ab 192k -f mp3 audio.mp3

Convertir des fichiers audio en wav mono 16 bits et avec une fréquence d’échantillonnage de 16000 Hz

$ ffmpeg -i in.mp3 -acodec pcm_s16le -ac 1 -ar 16000 out.wav

Réencoder en changeant les dimensions

# testé 14 juin 2023 / ffmpeg version 3.2.18-0+deb9u1
ffmpeg -i video.mp4 -vf scale="360:360" -c:a aac -b:a 128k -ac 2 -ar 44100 -pix_fmt yuv420p output.mp4

Concaténer plusieurs fichiers son en un seul

$ ffmpeg -f concat -safe 0 -i <(for f in ./*.wav; do echo "file '$PWD/$f'"; done) -c copy out.wav

Vidéo à partir d'une image fixe (sans son)

ffmpeg -loop 1 -i image.png -c:v libx264 -t 10 -pix_fmt yuv420p -vf scale=768:768 video.mp4

Vidéo à partir d'une image fixe et d'un son, la vidéo fait la durée du son

ffmpeg -loop 1 -r 30 -i 5054.png -i 5054.wav -c:v libx264 -tune stillimage -c:a aac -b:a 250k -shortest 5054.mp4

Vidéo à partir d'une image fixe et d'un son, pour publication en post instagram (source)

# testé 21 fev 2023 / ffmpeg version 3.2.18-0+deb9u1
ffmpeg -loop 1 -i image.png -i son.wav -map 0:v -map 1:a -r 25 -c:v h264 -tune stillimage -crf 18 -c:a aac -b:a 128k -ac 2 -ar 44100 -pix_fmt yuv420p -max_muxing_queue_size 1024 -shortest video.mp4

-loop 1 : joue le flux vidéo en boucle, ici une image qui se répète indéfiniment (mais sera adaptée à la longueur du son, voir plus bas -shortest)
-map 0:v -map 1:a: comment les entrées sont mappées sur les flux de sortie, ici le flux 0 sera utilisé pour la vidéo principale et le flux 1 pour le son principal
-r 25: 25 images par seconde
-c:v h264 -tune stillimage -crf 18: encodage h264 basique, avec réglage optionnel pour image fixe
-c:a aac -b:a 128k -ac 2 -ar 44100: encodage audio selon les recommandations d'instagram : format AAC, 128Kbps, stereo, 44.100 kHz.
-pix_fmt yuv420p: encodage colorimétrique, cf. https://en.wikipedia.org/wiki/YUV
-max_muxing_queue_size 1024: instruction magique pour repousser le mauvais sort et les bugs
-shortest: adapte à la longueur du flux le plus court, ici le son car les mages sont en boucle

Vidéo à partir de plusieurs images fixes, sans son, pour publication en story instagram

# testé 31 mai 2023 / ffmpeg version 3.2.18-0+deb9u1
ffmpeg -f concat -i input.txt -map 0:v -c:v h264 -tune stillimage -crf 18 -an -pix_fmt yuv420p -max_muxing_queue_size 1024 -vsync vfr output.mp4

Les images sont à la même définition : 1080×1920
Elles sont listés dans le fichier texte input.txt avec leur durée en seconde (la dernière image est répété dans le fichier texte, c'est comme ça!) :

file 'image1.png'
duration 5
file 'image2.png'
duration 1
file 'image3.png'
duration 3
file 'image3.png'

Atout de son à une vidéo pour publication instagram

# testé 6 juin 2023 / ffmpeg version 3.2.18-0+deb9u1
# sans réencodage de la vidéo
ffmpeg -i video.mp4 -i son.wav -map 0:v -map 1:a -c:v copy -shortest video3.mp4
# avec réencodage
ffmpeg -i video.mp4 -i son.wav -map 0:v -map 1:a -r 25 -c:v h264 -tune stillimage -crf 18 -c:a aac -b:a 128k -ac 2 -ar 44100 -pix_fmt yuv420p -max_muxing_queue_size 1024 -shortest video2.mp4

“Hardsub” (incruster des sous-titres dans une vidéo)

# testé 27 avril 2023 / ffmpeg version 3.2.18-0+deb9u1
ffmpeg -i film.mp4 -c:v libx264 -crf 18 -preset slow -c:a copy -vf "\subtitles=sous-titre.srt" film_sub.mp4

(-c:a copy : copie du flux audio, -crf : 18 qualité visuellement proche du lossless)
cf. infos sur les qualité du h264 : https://trac.ffmpeg.org/wiki/Encode/H.264

Vidéo sans son en ping-pong / yoyo (source)
Une fois à l'endroit, une fois à l'envers

# testé 12 juin 2023 / ffmpeg version 3.2.18-0+deb9u1
ffmpeg -i input.mp4 -filter_complex "[0:v]reverse,fifo[r];[0:v][r] concat=n=2:v=1 [v]" -map "[v]" output.mp4

Assembler une vidéo à partir d'une série d'images fixes, sans son

# testé 6 juin 2024 / ffmpeg version 3.2.18-0+deb9u1  
ffmpeg -r 25 -an -i image-%03d.png -s 768x960 video.mp4 # image-001.png à image-999.png 

Avec des réglages adaptés à instagram

# test 10 juil. 2024 / ffmpeg version 5.1.5-0+deb12u1
ffmpeg -r 25 -an -i segwords-%06d.png -s 1024x1280 -map 0:v -c:v h264 -tune stillimage -crf 18 -an -pix_fmt yuv420p -max_muxing_queue_size 1024 -vsync vfr segwords.mp4

Répéter une séquence x fois dans une même vidéo

# testé 7 juin 2024 sans son / ffmpeg version 3.2.18-0+deb9u1  
ffmpeg -f concat -i sequences.txt -c copy video.mp4

Au préalable il faut avoir préparé un fichier texte comme ceci :

# sequences.txt
file 'scene.mp4'
file 'scene.mp4'
file 'scene.mp4'

Assembler une vidéo de 10 images à partir d'une image unique, sans son

# testé 10 juin 2024 sans son / ffmpeg version 3.2.18-0+deb9u1 
ffmpeg -loop 1 -i image.png -c:v libx264 -t 1 -r 10 -pix_fmt yuv420p -vf scale=1536:1920 video.mp4

-t 1 : durée de la vidéo = 1 seconde
-r 10 : nombre d'images par secondes

Extraction d'un son depuis une vidéo en mp3

# ffmpeg 3.2.12-1 / debian 9.5 stretch @ kirin / 20190327
ffmpeg -i video.mp4 -vn -ar 44100 -ac 2 -ab 320k -f mp3 audio.mp3

Extraction d'un son depuis un VOB en .wav 16bits

# ffmpeg 3.2.5-1 / debian 9.1 @ urzhiata / 20180415
ffmpeg -i ./VTS_01_1.VOB -vn -acodec pcm_s16le -sample_fmt s16 -ar 44.1k -ac 2 ./son.wav

Extraire une image d'une vidéo

ffmpeg -i video.mp4 -vframes 1 image.png
ffmpeg -i video.mp4 -ss 00:23:45 -vframes 1 image.png   # momen de capture de l'image défini par -ss 

Extraction d'images de film toutes les x secondes

# ffmpeg 3.2.5-1 / debian 9.1 @ urzhiata / 20180831
ffmpeg -i film.avi -r 1 -f image2 "image-du-film-%4d"
# pour des versions de ffmpeg plus récentes, essayer
ffmpeg -i video.mp4 -vf fps=1 out%d.png       # extraction d'une image par seconde
ffmpeg -i video.mp4 -vf fps=1/60 out%02d.jpg  # extraction d'une image par minute

Extraction de toutes les images d'une vidéo

# testé 1( juin 2023 / ffmpeg version 3.2.18-0+deb9u1
ffmpeg -i video.mp4 images_%04d.png

Extraire une séquence sans réencoder

# testé 23 juillet 2024 / ffmpeg version 5.1.5-0+deb12u1 @ tenko
ffmpeg -ss 20 -i video.mp4 -c copy -t 00:00:30 extrait.mp4

-ss 30 : placer le point de départ de l'extrait à la seconde 20 -t 00:00:30 : extraire 30 secondes

Enregistrer une video du bureau (sur Debian)

# ffmpeg 3.2.12-1 / debian 9.5 @ kirin / 20181203
ffmpeg -video_size 1600x900 -framerate 10 -f x11grab -i :0.0+0,0 output.mp4

options : https://trac.ffmpeg.org/wiki/Capture/Desktop

Ajouter du délai à un sous-titre externe (au format .srt)

# testé 27 avril 2023 / ffmpeg version 3.2.18-0+deb9u1
# cas ou les sous-titres sont en avance de 3s, on les retarde
ffmpeg -itsoffset 3 -i sous-titre.srt -c copy sous-titre_retard.srt

Changer le framerate et modifier la vitesse de lecture, sans réencoder (source)
En 2 étapes, en partant d'une vidéo à 60 fps pour la passer à 30 fps, et la ralentir (2 fois plus lente). Dans ce cs, je n'ai pas besoin de son mais l'exemple de la source concerne aussi le son.

# testé 12 juin 2023 / ffmpeg version 3.2.18-0+deb9u1
ffmpeg -i video_60fps.mp4 -c copy -f h264 output_raw_bitstream.h264
ffmpeg -r 30 -i output_raw_bitstream.h264 -c copy video_30fps.mp4

Inverser les couleurs de pixel d'une vidéo (négatif)

# testé 17 juillet 2024 sans son / ffmpeg version 5.1.5-0+deb12u1 @ tenko
ffmpeg -i video.mp4 -vf lutrgb="r=negval:g=negval:b=negval" negatif.mp4

doc :

Miroir

# testé 17 juillet 2024 sans son / ffmpeg version 5.1.5-0+deb12u1 @ tenko
ffmpeg -i 01.mp4 -vf "crop=iw/2:ih:0:0,split[left][tmp];[tmp]hflip[right];[left][right] hstack" 01miroir.mp4
ffmpeg -i 01miroir.mp4 -vf "crop=iw:ih/2:0:0,split[top][tmp];[tmp]vflip[bottom];[top][bottom] vstack" 01miroirhv.mp4

Pour éditer des métadonnées avec une interface graphique, on peut utiliser picard : https://picard.musicbrainz.org/ , des alternatives existent!
Pour éditer des métadonnées en ligne de commande : lltag ou id3v2 ou id3tool

Pour en apprendre plus sur ffmpeg :

  • ressource/logiciel/ffmpeg/start.txt
  • Dernière modification: 2024/07/23 17:04
  • par emoc