FFmpeg
FFmpeg est un ensemble d'outils informatiques pour traiter les documents vidéos et les documents audios.
C'est en ligne de commande que sont exécutées les actions.
Généralité
FFmpeg est proposée en deux versions :
- la version static contient deux fichiers autonomes. Cette version est utile pour l'usage en ligne de commande ;
- la version shared contient tous les fichiers séparés : exécutables et bibliothèques (dll). C'est la version qui permet à d'autres applications d'utiliser la bibliothèque.
Documentation
Corbpie creatie
- site principal : https://corbpie.com/
La catégorie FFmpeg :
Une source d'information pour FFmpeg :
- https://wiki.libox.fr/applications/ffmpeg/start
- http://www.noah.org/wiki/Main_Page
- https://www.noah.org/wiki/ffmpeg
CodePen.io
FFmpeg
Site officiel :
Il existe plusieurs paquets :
- shared pour partagé : les bibliothèques (dll) sont à part des exécutables ; en conséquence l'exécutable ffmpeg.exe a une taille de 0,290 Mo
- static : ce paquet propose les programmes principaux incluant les bibliothèques (dll) ; en conséquence l'exécutable ffmpeg.exe a une taille de 60 Mo
Téléchargement de FFmpeg :
- site officiel :
- https://github.com/BtbN/FFmpeg-Builds/releases (valide au 06/03/2021)
- https://ffmpeg.zeranoe.com/builds/
- https://github.com/BtbN/FFmpeg-Builds/releases/download/autobuild-2022-10-31-12-44/ffmpeg-n4.4.3-win64-gpl-4.4.zip version 4.4, contient les programmes complet incluant les dll (au 01/11/2022)
Les différentes version (à mars 2021) :
- ffmpeg-N-101538-g63344337f9-win64-gpl.zip :
- ffmpeg.exe, ffplay.exe, ffprobe.exe : sont indépendant (ne nécessitent pas de dll).
- ffmpeg-N-101538-g63344337f9-win64-gpl-shared.zip
- nécessite les dll ; cela veut dire que les exécutables ne sont pas indépendant.
- liens internes :
- FFmpeg 3.4.2, Cantor : http://www.phpage.fr/download/ffmpeg-3.4-win64-shared.zip
- FFmpeg 4.0.1, Wu : http://www.phpage.fr/download/ffmpeg-4.0-win64-shared.zip
- FFmpeg 4.1, al-Khwarizmi : http://www.phpage.fr/download/ffmpeg-4.1-win64-static.zip
ffmpeg.exe
, version 4.1, 64 bit, seul : http://www.phpage.fr/download/ffmpeg.exe-4.1-win64.zip
FFmpeg et commentaire
Exemple :
ffmpeg -i "Nom de la vidéo.mkv" -metadata title="Nom du film" -metadata comment="q23, 1920" -metadata year=2001 -c copy output2.mkv
: ajout d'informations
FFmpeg et capture d'écran
ffmpeg -f gdigrab -framerate 25 -i desktop bureau.mp4
: capture de tout le bureau ;ffmpeg -f gdigrab -framerate 2 -i title=ffmpeg fenetre.mp4
: capture la fenêtre dont le nom est "ffmpeg", en l'occurence c'est une fenêtre de l'explorateur de fichier avec le dossier "ffmpeg" qui est ouverte ;
FFmpeg et vidéo
FFmpeg est une collection de logiciels libres destinés au traitement de flux audio ou vidéo (enregistrement, lecture ou conversion d'un format à un autre).
ffmpeg -i videoorigine.avi -vf scale=320:240 videodestination.avi
ffmpeg -i videoorigine.webm -s 720x540 videodestination.webm
redimensionne la vidéo en 720 x 540 pixels ;ffmpeg -i arte.mpg -q 0 -ss "00:03:50" -t "00:00:05" arte-03-50.mpg
extrait cinq secondes de vidéo à partir de 3 min 50 s en qualité d'origine ;ffmpeg -i videoorigine.mov -r 25 videodestination.mp4
convertit le format (de .mov à .mp4) et force la fréquence d'image à 25 images par secondes (de 30 ips à 25 ips).
Pour copier tous les flux, avec le deuxième flux (index numéro 1) encodé sous libx264 et le flux audio numéro 138 (index numéro 137) encodé sous libvorbis :
ffmpeg -i INPUT -map 0 -c copy -c:v:1 libx264 -c:a:137 libvorbis OUTPUT
Traitement en série
Traitement en série de tous les fichiers dont l'extension est .mp4
, forçage en 25 images par secondes, forçage en 1280 x 720 pixels.
rem traitement de vidéo en série rem transformation en taille et en fréquence d'image for %%i in (*.mp4) do ( ffmpeg -i "%%i" -r 25 -vf scale=1280:720 "%%i"-1280-25.mp4) pause
FFmpeg et image
Script de traitement d'image en PowerShell
- https://gist.github.com/someshinyobject/617bf00556bc43af87cd
- https://superuser.com/questions/1505735/list-of-images-exceeding-4m-pixels-with-powershell
- https://code.adonline.id.au/script-to-list-image-files-by-size-and-resolution-export-to-excel/
Pour convertir du format JPEG au format PNG.
ffmpeg -i img.jpeg img.png
Modifie la taille d'une image :
ffmpeg -i Einstein_500_459.jpg -vf scale="'if(gt(a,320/240),320,-1)':'if(gt(a,320/240),-1,240)'" Einstein_320x240_fit.png
Pour convertir une vidéo en une série d'images :
ffmpeg -i input.mp4 -r 1 -f image2 image-%2d.png
Référence
Bannerbear : https://www.bannerbear.com/
- extraire des images d'une vidéo :
- recadrer une vidéo :
FFmpeg et audio
Analyser un document multimédia (audio ou vidéo) :
ffmpeg -i input.wav -filter:a volumedetect -f null /dev/null
ffmpeg -i video.mp4 -filter:a volumedetect -f null /dev/null
Une fois le résultat donné, récupérer la valeur maximum du volume (max_volume) et appliquer la valeur avec son opposé pour la modification ; par exemple, si la valeur maximum est -17, appliquer une modification de +17. Si la valeur maximum est 5, appliquer une modification de -5.
Exemple pour modifier le volume sonore, sans réencoder la vidéo :
ffmpeg -i video.mp4 -vcodec copy -af "volume=10dB" video-augmentee.mp4
ffmpeg -i video.mp4 -vcodec copy -af "volume=-5dB" video-diminuee.mp4
Un décalage de l'audio de 0,7 seconde par rapport à la vidéo est présent ; pour corriger cela :
ffmpeg.exe -i source-original.mp4 -itsoffset 0.7 -i source-original.mp4 -map 0:v -map 1:a -c copy destination.mp4
Extraire audio
ffmpeg -i input.mp4 -vn -ac 2 -ar 44100 -ab 128k -f mp3 output.mp3
Ajouter audio
ffmpeg -i input.mp4 -i input.mp3 -c copy -map 0:0 -map 1:0 output.mp4
Pour faire des tests
La commande ci dessous permet de faire un essai d'encodage :
ffmpeg -ss 80 -t 60 -i videoInput.mpg -s 240x180 -b 380k -ab 64k videoOutput.flv
Cette commande convertit la portion commençant à t0 = 80 secondes (option -ss) et s'étendant sur une durée de 60 secondes (option -t) du fichier d'entrée "videoInput.mpg" codé en MPEG. Le fichier produit sera encodé en Flash, la taille d'image sera de 240×180, le débit engendré par son affichage de 380 kbps et le débit audio de 64 kbps.
Conversion par copie des flux vidéo et audio d'une portion commençant à 2 minutes et 58 secondes et d'une durée de 9 minutes et 34 secondes :
ffmpeg -ss 00:02:58 -t 00:09:34 -i entree.webm -vcodec copy -acodec copy sortie.webm
Exemple pour sortir un fichier AVI en qualité moyenne, à partir d'un fichier OGG Theora :
ffmpeg -ss 4518 -t 1100 -b 768k -ab 128k -i videoInput.ogv -f avi videoOutput.avi
Autres exemples :
rem transformation 1920x1080, 60 ips en 1920x1080 : original 137 Mo, après traitement 29 Mo ffmpeg -i fichiersource.mp4 -vf scale=1920:1080 mieux1920-60.mp4 rem transformation 1920x1080, 60 ips, 28000 kb/s, audio 256 kb/s en 1920x1080, 25 ips, 2048 kb/s, audio 96 kb/s : original 137 Mo, après traitement 10,5 Mo ffmpeg -i fichiersource.mp4 -r 25 -b:v 2048k -b:a 96k -vf scale=1920:1080 mieux-1920-25-v2048-a096.mp4 rem transformation 1920x1080, 60 ips en 1280x720 : original 137 Mo, après traitement 12,7 Mo ffmpeg -i fichiersource.mp4 -vf scale=1280:720 mieux-1280-60.mp4 rem transformation 1920x1080, 60 ips en 1024x576 : original 137 Mo, après traitement 8,4 Mo ffmpeg -i fichiersource.mp4 -vf scale=1024:576 mieux-1024-60.mp4
À noter : ne pas utiliser de valeur impaires pour les dimensions d'images.
ffmpeg et PowerShell
Premier exemple
Pour utiliser ffmpeg en ligne de commande avec PowerShell, il est impératif de séparer l'exécutable ffmpeg.exe et les arguments :
start-process ffmpeg.exe -argumentlist "-i 20191220_154316.mp4 -r 25 -b:v 2048k -b:a 96k -vf scale=1280:720 mieux-1280-25-v2048-a096.mp4"
À l'exécution, cette syntaxe lance une fenêtre de commande DOS le temps de l'exécution de la commande.
powershell-script video conversion-020.ps1
Accès au codeClear-Host Set-Location C:\Support\ffmpeg # Attention. Pour les noms de fichiers qui contiennent des espaces, le script de fonctionne pas. # en solution rapide, prévoir de renommer le fichier avant traitement. $listeFichier = Get-ChildItem *.mp4 $compteur = 0 ForEach ($fichier in $listeFichier) { $tl = $listeFichier.length $compteur = $compteur + 1 $tailleListe = $listeFichier.Length # récupération des dates des fichiers $dateCreation = $fichier.CreationTime $dateModif = $fichier.LastWriteTime $dateAcces = $fichier.LastAccessTime $taille = $fichier.Length/1024 # renommage des fichiers $fichierNom = $fichier.BaseName $fichierExt = $fichier.Extension $fichierAncien = $fichier.BaseName + "-vieux" + $fichier.Extension Rename-Item -Path $fichier -NewName $fichierAncien $fichierNouveau = $fichier # arguments pour le traitement vidéo $arg = "-i " + $fichierAncien + " -r 25 -b:v 2048k -b:a 96k -vf scale=1280:720 " + $fichierNouveau # $arg="-i " + $fichierAncien + " -r 25 -b:v 2048k -b:a 96k -vf scale=720:1280 " + $fichierNouveau # l'option -Wait permet d'attendre la fin d'un traitement avant de lancer le suivant Try { $debutTraitement = Get-Date # Début de traitement Write-Host $compteur "/" $tailleliste " : " $fichier.Name $taille.ToString("#") " | En cours" Start-Process -Wait ffmpeg.exe -ArgumentList $arg $finTraitement = Get-Date # Fin de traitement $duree = $fintraitement - $debuttraitement Write-Host " Terminé. Durée de traitement :" $duree.TotalSeconds "s" Start-Sleep -s 3 # modification des dates des nouveaux fichiers $(Get-Item $fichier).CreationTime = $($datemodif) $(Get-Item $fichier).LastWriteTime = $($datemodif) $(Get-Item $fichier).LastAccessTime = $($datemodif) } Catch { Write-Host $compteur "/" $tailleliste " : " $fichier.Name $taille.ToString("#") " | Erreur fichier " $fichierAncien } }
Deuxième exemple
Script qui permet de traiter une série de vidéo. Attention, créer les dossiers de travail avant de lancer le script.
powershell-script video conversion-010.ps1
Accès au code$CheminSource = "C:\Video\AConvertir\" $CheminDestinationOriginal = "C:\Video\AConvertir\original\" $CheminDestinationTraite = "C:\Video\AConvertir\conv\" $Suffixe_q23="-q23" $Suffixe_q23_1280="-q23-1280" set-location $CheminSource $CheminSource = $CheminSource+"\*" $VideoListeATraiter = Get-Item -Include @("*.mp4", "*.avi", "*.divx", "*.mov", "*.mpg", "*.wmv", "*.mkv") -Path $CheminSource; Clear-Host Write-Host Write-Host "Liste des vidéos à traiter"; $Compteur=1; foreach ($VideoATraiter in $VideoListeATraiter) { Write-Host $Compteur ".- " $VideoATraiter; $Compteur++ } Write-Host # Pause $null = Read-Host -Prompt 'Appuyer sur une touche pour continuer.'; Write-Host -ForegroundColor Green "Début du traitement" $Compteur=1; foreach ($VideoATraiter in $VideoListeATraiter) { $VideoTraite_q23 = $VideoATraiter.BaseName+$Suffixe_q23+$VideoATraiter.Extension $VideoTraite_q23_1280 = $VideoATraiter.BaseName+$Suffixe_q23_1280+$VideoATraiter.Extension Write-Host $Compteur ".- " $VideoATraiter # Déclaration des arguments pour ffmpeg.exe # -c:v libx264 -preset slow -crf 22 #$ArgumentListe = '-i "{0}" -vf scale=1024:0 "{1}"' -f $VideoATraiter, $VideoTraite; $ArgumentListe_q23 = '-i "{0}" -r 25 -preset medium -map 0:v -c:v libx264 -map 0:a -c:a copy "{1}"' -f $VideoATraiter, $VideoTraite_q23; $ArgumentListe_q23_1280 = '-i "{0}" -r 25 -preset medium -map 0:v -c:v libx264 -map 0:a -c:a copy -vf scale=1280:0 "{1}"' -f $VideoATraiter, $VideoTraite_q23_1280; # $ArgumentListe = '-i {0} -c:v libx264 -crf 23 -c:a copy {1}' -f $VideoATraiter, $VideoTraite; # Write-Host $ArgumentListe # Démarrage du traitement Start-Process -FilePath "C:\Video\AConvertir\ffmpeg.exe" -ArgumentList $ArgumentListe_q23 -Wait -NoNewWindow; Start-Process -FilePath "C:\Video\AConvertir\ffmpeg.exe" -ArgumentList $ArgumentListe_q23_1280 -Wait -NoNewWindow; Move-Item -Path $VideoATraiter -Destination $CheminDestinationOriginal Move-Item -Path $VideoTraite_q23 -Destination $CheminDestinationTraite Move-Item -Path $VideoTraite_q23_1280 -Destination $CheminDestinationTraite Write-Host -ForegroundColor Cyan " ==> traitement terminé" Write-Host $Compteur++ } Write-Host -ForegroundColor Green "Fin du traitement"
Troisième exemple
Il est nécessaire que le programme ffmpeg.exe
soit présent dans le dossier où le script est exécuté.
Nom du fichier : script-video-1280-25.bat
rem traitement de vidéo en série rem transformation en taille et en fréquence d'image for /r %%i in (*.mp4) do ( ffmpeg -i "%%i" -r 25 -vf scale=1280:720 "%%i"-1280-25.mp4) pause
Quatrième exemple
TechSnips by ATA Learning, How to join MP4 videos using ffmpeg and PowerShell
- concaténation de deux fichiers vidéos
# Chemin vers FFmpeg $ffmpeg = ".\ffmpeg\bin\ffmpeg.exe' # Chemin vers FFprobe $ffprobe = ".\ffmpeg\bin\ffprobe.exe' # Transcodage préalable vers MPEG-2 transport streams (TS), vidéo H.264 et audio AAC & $ffmpeg -y -i $file1 -c copy -bsf:v h264_mp4toannexb -f mpegts temp1.ts & $ffmpeg -y -i $file2 -c copy -bsf:v h264_mp4toannexb -f mpegts temp2.ts # Concaténation des fichiers & $ffmpeg -f mpegts -i "concat:temp1.ts|temps.ts" -c copy -bsf:a aac_adtstoasc output.mp4
Ressource
Developpez.com
Youtube, TechSnips by ATA Learning, How to join MP4 videos using ffmpeg and PowerShell
FFmpeg et delogo
Il est possible de masquer un logo en floutant le logo. Une extrapolation de la vidéo est utilisée pour masquer le logo.
Pour effectuer le traitement depuis l'original vers une nouvelle vidéo :
ffmpeg -i input.mp4 -vf "delogo=x=100:y=100:w=150:h=20" output.mp4
Pour effectuer une prévisualisation de l'effet :
ffplay -f lavfi -i "movie=input.mp4,delogo=x=100:y=100:w=150:h=20:show=1"
FFmpeg et timecode
Il est possible d'insérer un time code sur la vidéo.
Pour effectuer le traitement depuis l'original vers une nouvelle vidéo :
- pour une vidéo de dimension 1920 x 1080, à 25 images par seconde ;
- à noter le nom de la police de caractère ;
- l'emplacement du timecode : x = 900, y = 900 pour une position en bas et centré horizontalement ;
- un arrière plan est optionnel :
- boxcolor : couleur de fond
0xrrvvbbaa
(0x
indique une notation hexadécimale [de00
àff
],rr
,vv
,bb
pour les couleurs rouge, vert et bleu,aa
pour le canal alpha qui gère la transparence), ici avec une transparence de55
(sous forme hexadécimal de00
àff
), - box : 0 pour inactivé ; 1 pour activé
- boxborder : écart entre bord et texte, en pixel
- boxcolor : couleur de fond
- timecode : ici indique un début de compteur à 0 (zéro)
Exemple 1 :
ffmpeg.exe -i input.mkv -vf drawtext="fontsize=40: fontfile=arial.ttf: x=900: y=850: timecode='00\:00\:00\:00': rate=25: fontcolor='white': boxcolor=0x00000055: box=1: boxborderw=4" output.mkv
Exemple 2, avec certaines valeurs proportionnelles à la taille de l'image :
ffmpeg.exe -i swj-1280.mp4 -vf drawtext="fontsize=h/30: fontfile=cour.ttf: x=(w-text_w)/2: y=(h-text_h*2): timecode='00\:00\:00\:00': rate=30: fontcolor='white': boxcolor=0x00000055: box=1: boxborderw=4" swj-1280-TCR.mp4
FFprobe
FFprobe permet de récupérer des informations de type métadonnées sur le fichier :
Liste des métadonnées :
ffprobe -i 1.mp4
Liste des métadonnées avec export vers un fichier XML :
ffprobe -show_format -show_streams -print_format xml -i 1.mp4
Repère
Taille d'écran, format 4/3 :
Taille | Proportion | Nom |
---|---|---|
400 x 300 | 1,333:1 | |
480 x 360 | 1,333:1 | |
640 x 480 | 1,333:1 | |
768 x 576 | 1,333:1 | |
800 x 600 | 1,333:1 | |
1024 x 768 | 1,333:1 |
Taille des vidéos, format 16/9 :
Taille | Proportion | Nom |
---|---|---|
16 x 9 | 1,777:1 | 16/9e |
160 x 90 | 1,777:1 | |
240 x 135 | 1,777:1 | |
320 x 180 | 1,777:1 | |
480 x 270 | 1,777:1 | |
640 x 360 | 1,777:1 | |
720 x 406 | 1,777:1 | |
800 x 450 | 1,777:1 | |
1 024 x 576 | 1,777:1 | SD (720 x 576) |
1 280 x 720 | 1,777:1 | 720p, HD TV |
1 920 x 1 080 | 1,777:1 | 1080p, Full HD |
Taille | Proportion | Nom |
---|---|---|
2,35 x 1 | 2.35:1 | CinemaScope ou Panavision |
1 920 x 818 | 2.35:1 | CinemaScope ou Panavision |
720 x 302 | 2,379 | |
1 024 x 430 | 2,379 | |
1 280 x 538 | 2,379 | |
1 024 x 426 | 2,4 | |
1 280 x 534 | 2,4 | |
1 920 x 800 | 2,4 |
Repère de paramétrage
Type | Durée | Dimension en pixel |
Poids | Débit vidéo | Débit audio | Observation |
---|---|---|---|---|---|---|
Original | 1 h 37 min 55 s | 1 280 x 720 | 1 969 584 ko | 2 616 kb/s | 125 kb/s | |
Essai 1 | 1 h 37 min 55 s | 1 024 x 576 | 1 538 461 ko | 2 042 kb/s | 96 kb/s | dimension et débit audio forcés |
Essai 2 | 1 h 37 min 55 s | 1 024 x 576 | 804 928 ko | 1 024 kb/s | 96 kb/s | dimension, débit vidéo et débit audio forcés |
Essai 3 | 1 h 37 min 55 s | 1 024 x 576 | 621 760 ko | 768 kb/s | 96 kb/s | dimension, débit vidéo et débit audio forcés |
Essai 4 | 1 h 37 min 55 s | 720 x 406 | 344 605 ko | 480 kb/s | 128 kb/s | dimension forcée |
Source Wikipédia, définition d'écran : https://fr.wikipedia.org/wiki/D%C3%A9finition_d%27%C3%A9cran
Type | Durée | Nb images | Codec vidéo |
Dimension en pixel |
Fréquence d'image |
Audio | Poids | Débit vidéo | Débit audio | Observation |
---|---|---|---|---|---|---|---|---|---|---|
Original | 5 min 55 s | 8875 i | H264 | 1 920 x 1 080 | 25 ips | MPEG AAC, stéréo, 48 kHz, 32 bit | 397 416 ko | 10 281 kb/s | 160 kb/s | |
Essai 1 | 5 min 55 s | 8875 i | H264 | 1 920 x 1 080 | 25 ips | MPEG AAC, stéréo | 80 637 ko | 2 048 kb/s | 96 kb/s | dimension, débit vidéo et débit audio forcés |
Essai 2a | 5 min 55 s | 8875 i | H264 | 1 280 x 720 | 25 ips | MPEG AAC, stéréo | 80 637 ko | 2 048 kb/s | 96 kb/s | dimension, débit vidéo et débit audio forcés |
Essai 2b | 5 min 55 s | 8875 i | H264 | 1 280 x 720 | 25 ips | MPEG AAC, stéréo | 61 496 ko | 1 536 kb/s | 96 kb/s | dimension, débit vidéo et débit audio forcés |
Essai 2c | 5 min 55 s | 8875 i | H264 | 1 280 x 720 | 25 ips | MPEG AAC, stéréo | 42 316 ko | 1 024 kb/s | 96 kb/s | dimension, débit vidéo et débit audio forcés |
Essai 3a | 5 min 55 s | 8875 i | H264 | 1 024 x 576 | 25 ips | MPEG AAC, stéréo | 42 409 ko | 1 024 kb/s | 96 kb/s | dimension, débit vidéo et débit audio forcés |
Essai 3b | 5 min 55 s | 8875 i | H264 | 1 024 x 576 | 25 ips | MPEG AAC, stéréo | 32 805 ko | 768 kb/s | 96 kb/s | dimension, débit vidéo et débit audio forcés |
Essai 4a | 5 min 55 s | 8875 i | H264 | 720 x 406 | 25 ips | MPEG AAC, stéréo | 32 909 ko | 768 kb/s | 96 kb/s | dimension, débit vidéo et débit audio forcés |
Essai 4b | 5 min 55 s | 8875 i | H264 | 720 x 406 | 25 ips | MPEG AAC, stéréo | 22 058 ko | 480 kb/s | 96 kb/s | dimension, débit vidéo et débit audio forcés |
Voir aussi
Liens externes
- https://sebsauvage.net/wiki/doku.php?id=ffmpeg
- https://korben.info/ffmpeg-pour-les-nuls.html
- https://www.linuxtricks.fr/wiki/ffmpeg-la-boite-a-outils-multimedia
- https://doc.ubuntu-fr.org/ffmpeg
- https://www.jcartier.net/FFMpeg-par-l-exemple.html
Multimédia | |
Logiciel relatif à la vidéo | Aegisub • Avidemux • Blender • Captvty • FFmpeg • Kdenlive MKVToolNix • OBS Studio • Olive • VLC |
Logiciel relatif à l'image | GIMP • Hugin • ImageMagick • Inkscape |
Matériel | Enregistreur TV • Plustek PhotoFilm 7400 • Terratec |
Divers | Chaine TV et langue audio • Vidéo |