FFmpeg

Révision datée du 5 juillet 2023 à 22:35 par Fylip22 (discussion | contributions)
(diff) ← Version précédente | Voir la version actuelle (diff) | Version suivante → (diff)
Aller à la navigation Aller à la recherche
Vidéo
Audio
PowerShell

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

La catégorie FFmpeg :

Une source d'information pour 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 :

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.

FFmpeg et commentaire

https://write.corbpie.com/

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

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/

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.

Contenu du fichier powershell-script video conversion-020.ps1 Accès au code
Clear-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.

Contenu du fichier 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

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 [de 00 à 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 de 55 (sous forme hexadécimal de 00 à ff),
    • box : 0 pour inactivé ; 1 pour activé
    • boxborder : écart entre bord et texte, en pixel
  • 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



Multimédia Modifier
Logiciel relatif à la vidéo AegisubAvidemuxBlenderCaptvtyFFmpegKdenlive
MKVToolNixOBS StudioOliveVLC
Logiciel relatif à l'image GIMPHuginImageMagickInkscape
Matériel Enregistreur TVPlustek PhotoFilm 7400Terratec
Divers Chaine TV et langue audioVidéo