3 points par GN⁺ 2023-07-31 | 1 commentaires | Partager sur WhatsApp
  • ffmprovisr est un site d’aide à la génération de commandes qui permet aux utilisateurs ayant du mal à écrire des commandes FFmpeg de choisir une tâche, puis de consulter une commande d’exemple et l’explication de chaque option
  • Les recettes s’articulent autour de ffmpeg, ffplay et ffprobe, en décomposant des éléments comme le fichier d’entrée, les codecs, les filtres, le mapping des flux et le conteneur de sortie
  • Le périmètre est large : du remuxing/transcodage au découpage et à l’assemblage, en passant par les sous-titres et filigranes, les miniatures et GIF, les fichiers de test, les métadonnées, checksums et rapports QCTools
  • Il n’y a pas de recherche intégrée, mais le site explique comment déplier toutes les recettes puis utiliser la recherche du navigateur pour trouver les mots-clés nécessaires
  • En plus de FFmpeg, il couvre aussi des outils comme le rip CDDA, ImageMagick et flac, ce qui en fait un recueil de commandes pratiques pour des workflows de préservation numérique

Ce que propose ffmprovisr

  • ffmprovisr réduit la charge liée à l’assemblage manuel de commandes FFmpeg en fournissant, pour chaque tâche, des commandes d’exemple et des explications d’options
  • L’utilisateur clique sur un bouton de tâche pour accéder à une commande unique ou à une liste de commandes associées, puis consulte la commande d’exemple et le comportement de chaque option
  • La page elle-même ne comporte pas de fonction de recherche ; elle recommande d’ouvrir toutes les recettes puis d’utiliser ctrl+f ou cmd+f pour lancer la recherche du navigateur
  • Parmi les ressources de référence de base, elle renvoie au site officiel de FFmpeg, aux instructions d’installation de Reto Kromer, à Command Line Crash Course et à explainshell.com
  • La licence est la Creative Commons Attribution 4.0 International License

Principes de base pour lire une commande FFmpeg

  • Une fois FFmpeg installé, on l’appelle en saisissant ffmpeg dans l’invite de commandes
  • Une commande est généralement composée de paires option-valeur
    • Dans -i input_file.ext, -i est l’option qui désigne le fichier d’entrée, et input_file.ext est le fichier cible
    • Dans -c:v prores, -c:v indique l’encodage du flux vidéo, et prores est le codec à utiliser
  • Le nom du fichier de sortie se place à la fin de la commande et se spécifie par son nom, sans option de sortie séparée
  • ffmpeg enregistre la vidéo, tandis que ffplay peut lire la vidéo générée sans l’enregistrer
    • Exemple d’enregistrement de barres SMPTE : ffmpeg -f lavfi -i smptebars=size=640x480 -t 5 output_file
    • Exemple de lecture de barres SMPTE : ffplay -f lavfi smptebars=size=640x480
    • L’exemple FFmpeg nécessite -i, une durée d’enregistrement -t 5 et un fichier de sortie, mais l’exemple FFplay n’a pas besoin de -i

Points de contrôle pour réduire les erreurs

  • Il faut vérifier que le fichier de sortie s’ouvre, se lit, et que son image et son son correspondent au résultat attendu
  • L’extension de sortie doit correspondre au codec voulu, et certaines extensions amènent FFmpeg à choisir par défaut certains codecs
    • Par exemple, .mp4 peut être configuré par défaut avec un encodage H.264
  • "Error: No such file or directory" peut être dû à un mauvais répertoire, une faute de frappe, un espace manquant ou une option mal accolée
    • Pour accéder au dossier Downloads sous macOS, utilisez cd $HOME/Downloads
    • Si une commande copiée-collée semble correcte mais génère une erreur, il est recommandé de la retaper directement dans la ligne de commande
  • "Could not find tag for codec" apparaît lorsqu’on tente de remuxer un fichier contenant un codec audio ou vidéo incompatible avec l’extension de sortie
    • Il faut d’abord transcoder vers un codec approprié, ou retirer -c copy lorsqu’on est certain que l’extension entraînera automatiquement un encodage avec le bon codec
  • "Killed" peut apparaître lorsque le fichier dépasse la capacité mémoire du serveur
    • Sur un serveur distant, on peut résoudre le problème en augmentant la capacité mémoire
    • Sur un serveur local, il vaut mieux maintenir FFmpeg à jour et éviter de l’exécuter en même temps que d’autres programmes gourmands en mémoire
  • Si "Error splitting argument list: option not found" apparaît lors de l’utilisation d’un filtre, il faut vérifier l’usage des guillemets et le format du filtergraph
  • Les filtres nécessitent un réencodage des flux ; les utiliser avec -c copy, qui copie directement les flux du fichier, peut donc poser problème

Filtergraph, mapping des flux et codecs par défaut

  • Lorsqu’on exécute des traitements FFmpeg par lot dans une boucle, on peut placer -nostdin avant l’entrée afin d’écraser le comportement par défaut d’interaction avec l’entrée standard
    • Exemple : ffmpeg -nostdin -i input_file ...
  • FFmpeg définit automatiquement les codecs et les paramètres de codec par défaut selon le format du fichier de sortie
    • .avi : audio mp3, vidéo mpeg4
    • .mkv : audio ac3, vidéo H.264
    • .mov : audio AAC, vidéo H.264
    • .mp4 : audio AAC, vidéo H.264
    • .mpg : audio mp2, vidéo mpeg1video
    • .mxf : audio pcm_s16le, vidéo mpeg2video
    • .wav : audio pcm_s16le
  • Un filtergraph est une combinaison de noms de filtres et d’options placée après -vf ou -af
    • -vf est un alias de -filter:v
    • hflip est un exemple de filtre vidéo, amerge un exemple de filtre audio
    • Plusieurs filtres se chaînent avec des virgules, et plusieurs chaînes de filtres se séparent par des points-virgules
    • -vf "fieldmatch,yadif,decimate" est une chaîne de filtres utilisée pour le traitement inverse telecine
    • S’il y a plus d’une entrée ou sortie, il faut utiliser -filter_complex au lieu de -vf
    • Il faut utiliser des guillemets droits et éviter les guillemets courbes
  • Le mapping des flux détermine quels flux vidéo, audio, sous-titres, données ou pièces jointes du fichier d’entrée seront inclus dans la sortie
    • FFmpeg reconnaît les types de flux a, v, s, d et t
    • -map 0:v sélectionne tous les flux vidéo du premier fichier d’entrée
    • -map 0:3 sélectionne le quatrième flux du premier fichier d’entrée
    • -map 0:a:2 sélectionne le troisième flux audio du premier fichier d’entrée
    • Si aucun mapping n’est spécifié, le comportement par défaut pour un fichier vidéo consiste à n’inclure dans la sortie qu’un seul flux vidéo et un seul flux audio
    • Pour mapper tous les flux, utilisez -map 0
    • Ajouter ?, comme dans -map 0:a?, permet de traiter par lot des fichiers sans audio sans provoquer d’erreur

Changement de conteneur et transcodage

  • Le réemballage d’un fichier se fait avec ffmpeg -i input_file.ext -c copy -map 0 output_file.ext
    • Les données vidéo, audio et sous-titres internes sont transférées vers un autre format de conteneur sans être modifiées
    • Le réemballage est aussi appelé remuxing ou re-multiplexing
    • Il faut utiliser -map 0 pour conserver tous les flux, par exemple plusieurs pistes audio
    • Certains conteneurs ne peuvent contenir que certains encodages de flux, ce qui peut rendre le réemballage impossible sans réencodage
  • La création d’un Broadcast WAV écrit le chunk BEXT et les métadonnées associées avec -write_bext 1 et -metadata field_name='Content'
    • Les champs couramment utilisés sont description, originator, originator_reference, origination_date, origination_time, coding_history et IARL
    • Les champs de métadonnées BWF ont une limite de nombre de caractères, et OriginatorReference est limité à 32 caractères
  • Lors du réemballage d’une vidéo au codec DV dans un fichier .dv, utiliser -f rawvideo -c:v copy afin d’éviter que les métadonnées d’origine contenues dans le flux DV ne soient supprimées involontairement
  • Exemple de transcodage en Apple ProRes LT : -c:v prores -profile:v 1 -vf yadif -c:a pcm_s16le
    • Les profils ProRes 422 sont distingués ainsi : 0 Proxy, 1 LT, 2 Standard, 3 HQ
    • Les conteneurs ProRes pris en charge par FFmpeg sont QuickTime .mov, Matroska .mkv et MXF .mxf
  • Exemple de transcodage H.264 : -c:v libx264 -pix_fmt yuv420p -c:a aac
    • Les valeurs par défaut de libx264 sont le préréglage medium et un CRF de 23
    • -pix_fmt yuv420p spécifie un sous-échantillonnage chroma 4:2:0 pour la compatibilité avec QuickTime et la plupart des lecteurs non basés sur FFmpeg
    • Pour l’optimisation du streaming, ajouter -movflags +faststart
    • Exemple de qualité plus élevée : -preset veryslow -crf 18, le CRF 18 étant souvent considéré comme « visuellement sans perte »
  • L’encodage H.264/H.265 basé sur GPU Nvidia utilise h264_nvenc ou hevc_nvenc
    • Le matériel à fonctions fixes de Nvidia peut offrir des performances 10 fois supérieures à l’encodage CPU, mais l’optimisation de la qualité à bas débit nécessite davantage de paramètres
    • HEVC est décrit comme un codec plus efficace pris en charge sur les GPU depuis environ 2015
  • Le transcodage H.265/HEVC utilise -c:v libx265 -pix_fmt yuv420p -c:a copy
    • Les valeurs par défaut de libx265 sont le préréglage medium et un CRF de 28
    • Un CRF 28 en H.265 correspond à un CRF 23 en H.264, et la taille du fichier peut être environ divisée par deux
  • L’exemple sans perte pour l’archivage consiste à placer FFV1 Version 3 dans un conteneur Matroska et à générer en même temps un framemd5 de l’entrée
    • -map 0 mappe tous les flux
    • -dn exclut les flux de données que Matroska n’autorise pas
    • -slicecrc 1 ajoute des informations CRC permettant au décodeur de détecter les slices endommagées
    • -f framemd5 -an génère une somme de contrôle MD5 pour chaque frame vidéo

Modification des propriétés vidéo et audio

  • La recette de changement de rapport d’image utilise un filtre de padding
    • Pour passer de 4:3 à 16:9, elle applique un pillarbox
    • Pour passer de 16:9 à 4:3, elle applique un letterbox
    • Pour une vidéo sans son, on peut utiliser -an au lieu de -c:a copy
  • L’exemple de conversion SD vers HD utilise trois filtres : colormatrix=bt601:bt709, scale=1440:1080:flags=lanczos et pad=1920:1080:240:0
    • Il change les coefficients de luminance de Rec. 601 vers Rec. 709
    • Le scaling Lanczos est plus lent que le bilinear par défaut, mais donne de meilleurs résultats
    • Pour une source entrelacée, il est conseillé de désentrelacer avec yadif avant le scaling
  • Le rapport d’affichage peut être modifié au niveau du conteneur avec une option comme -aspect 4:3
    • Utilisé avec -c:v copy, cela affecte le rapport d’image stocké dans le conteneur, et non celui des frames encodées
  • La conversion d’espace colorimétrique utilise le filtre colormatrix=src:dst
    • Les valeurs autorisées incluent bt601, smpte170m, bt470bg, bt709 et bt2020
    • L’intégration de métadonnées d’espace colorimétrique utilise -color_primaries, -color_trc et -colorspace
    • Il faut être prudent, car un vrai fichier Rec.601 peut aussi recevoir une balise Rec.709
    • Les balises de métadonnées étant écrites par libx264 ou libx265, elles ne peuvent pas être ajoutées sans réencodage
  • Le changement de vitesse utilise conjointement setpts et atempo
    • L’exemple crée une copie de type PAL speed-up en passant de 24 fps à 25 fps tout en conservant la hauteur audio
  • Les fondus utilisent les filtres fade et afade, et nécessitent de réencoder la vidéo et l’audio en raison de l’utilisation de filtres
  • L’extraction audio utilise -c:a copy -vn pour extraire sans perte le flux audio, sans vidéo
  • La combinaison de deux pistes audio utilise amerge et -filter_complex
    • Cela peut être utile pour des traitements ultérieurs qui attendent une seule piste audio, comme les sous-titres automatiques de YouTube
    • Il est recommandé d’exécuter ffprobe avant d’écrire un script pour identifier les pistes voulues
  • L’analyse et la normalisation du volume utilisent le filtre loudnorm
    • La sortie JSON peut servir de valeurs d’entrée pour une normalisation en 2 passes
    • Les valeurs par défaut sont décrites comme correspondant bien au niveau cible recommandé par PBS
    • La normalisation en 1 passe est rapide, mais moins précise que celle en 2 passes
  • Des recettes couvrant le préaccentuation CD, l’égalisation RIAA, le rééchantillonnage audio et l’interprétation forcée d’un WAV 192 kHz comme 96 kHz sont également incluses

Découpage, assemblage et segments

  • Pour assembler des fichiers ayant les mêmes spécifications techniques, utiliser le demuxer concat
    • ffmpeg -f concat -i mylist.txt -c copy output_file
    • Les fichiers à assembler doivent avoir les mêmes codecs et spécifications techniques, et le fichier obtenu doit impérativement être prévisualisé
    • Pour utiliser des chemins absolus, ajouter -safe 0
  • Pour assembler des fichiers de formats ou de codecs différents, utiliser le filtre concat et -filter_complex
    • Les fichiers d’entrée peuvent différer par le conteneur, le codec, le sous-échantillonnage chroma, la fréquence d’images, etc.
    • L’exemple de base ne fonctionne correctement que si les fichiers ont la même résolution
    • Si les fréquences d’images diffèrent, la sortie peut avoir une fréquence d’images variable
    • Si les résolutions diffèrent, les aligner avec scale avant concat ; pour assembler SD et HD, la SD peut être traitée en pillarbox
  • La division de fichiers est gérée avec le muxer segment
    • -segment_time 60 crée des segments d’une durée maximale de 60 secondes
    • %03d crée des noms de fichiers numériques sur 3 chiffres avec padding par zéros
  • Le trimming sans réencodage utilise -ss, -to, -t, -c copy et -map 0
    • Les codecs interframe comme H.264 peuvent démarrer au point le plus proche basé sur une i-frame
    • -sseof -5 copie à partir de 5 secondes avant la fin du fichier
  • La suppression du silence au début d’un fichier audio utilise silenceremove=start_threshold=-57dB:start_duration=1:start_periods=1
    • -57dB est présenté comme un niveau adapté pour tenir compte du souffle analogique
    • L’utilisation du filtre entraîne le réencodage de l’audio
  • La suppression du silence à la fin d’un fichier audio s’effectue dans l’ordre areverse, silenceremove, areverse
    • Comme silenceremove est mieux adapté à la suppression du silence au début, l’audio est inversé puis remis dans son sens d’origine

Traitement de la vidéo entrelacée

  • Lors de la création d’un fichier d’accès HD H.264 à partir d’une source SD NTSC, on utilise ensemble yadif, scale, pad et format=yuv420p
    • yadif est un filtre de désentrelacement
    • scale=1440:1080:flags=lanczos redimensionne l’image en 1440x1080
    • pad=1920:1080:(ow-iw)/2:(oh-ih)/2 ajoute des bandes pour adapter une entrée 4:3 à une image de sortie 16:9
  • Un exemple de désentrelacement courant est -vf "yadif,format=yuv420p"
    • format=yuv420p spécifie un sous-échantillonnage de chrominance 4:2:0 pour la compatibilité de lecture H.264
    • FFmpeg propose aussi d’autres désentrelaceurs que yadif : bwdif, w3fdif, kerndeint, nnedi
  • Le désentrelacement qui sépare les champs en images utilise idet,bwdif,format=yuv420p
    • Il est privilégié pour préserver la cadence visuelle de la source dans les vidéos entrelacées avec beaucoup de mouvement
    • idet détecte l’ordre des champs
    • bwdif produit par défaut une image pour chaque champ
  • L’inverse telecine utilise fieldmatch,yadif,decimate
    • Il annule le pulldown 3:2 et restaure une vidéo entrelacée à 29,97 fps au framerate 24 fps de la source film d’origine
    • Appliqué à un fichier 29,97i, le framerate de sortie devient en réalité 23,976 fps
  • Pour modifier l’ordre des champs, on utilise setfield=tff ou setfield=bff
    • Comme un filtre vidéo est utilisé, -c copy n’est pas possible et un réencodage est nécessaire
  • Pour vérifier le motif d’entrelacement, on analyse sans fichier de sortie avec ffmpeg -i input_file -filter:v idet -f null -

Filigranes, sous-titres, vignettes, GIF

  • Un filigrane texte se crée avec le filtre drawtext
    • On spécifie les options fontfile, fontsize, text, fontcolor, alpha, x et y
    • x=(w-text_w)/2:y=(h-text_h)/2 le place au centre quelle que soit la taille de la vidéo
  • Un filigrane image peut être placé en haut à droite avec overlay=main_w-overlay_w-5:5
  • Un timecode incrusté utilise les options timecode, box, boxcolor et rate de drawtext
    • Le timecode de départ est au format hh:mm:ss[:;.]ff
  • L’intégration d’un fichier de sous-titres utilise -i subtitles_file -c copy -c:s mov_text
    • mov_text fonctionne dans les conteneurs MP4 et MOV
    • Les formats autorisés dans un conteneur MKV sont ASS, SRT et SSA
  • Une vignette unique s’extrait avec -ss 00:00:20 -vframes 1 thumb.png
  • Pour créer une vignette toutes les minutes, utilisez -vf fps=1/60 out%d.png
  • Pour transformer une séquence d’images en GIF, on utilise image2, -framerate, -pattern_type glob et scale
  • Un GIF de haute qualité se crée en deux étapes
    • La première commande crée une palette personnalisée avec palettegen
    • La deuxième commande applique la palette avec paletteuse
    • Une méthode plus simple consiste à utiliser -vf "fps=10,scale=500:-1", mais le dithering est plus visible et la taille de fichier plus faible

Séquences d’images, scopes, OCR

  • Pour créer une vidéo non compressée 10 bits à partir d’une séquence d’images, on utilise -f image2 -framerate 24 -i input_file_%06d.ext -c:v v210
    • Le framerate par défaut du demuxer image2 est de 25 fps
    • %06d lit les noms de fichiers numériques à six chiffres dans l’ordre croissant
  • Pour créer une vidéo en combinant une image et un fichier audio, on utilise -loop 1, -shortest et -vf scale=1280:720
    • Cela peut être utile lorsqu’on veut mettre en ligne un fichier audio sur une plateforme comme YouTube
  • ffplay -f lavfi et des filtres permettent de visualiser la profondeur de bits audio, un graphe en décibels, les pixels hors plage broadcast et un vectorscope
  • tblend=all_mode=difference128 et hstack affichent côte à côte les différences temporelles entre deux vidéos d’entrée
  • xstack sert à créer une fenêtre de sortie empilant plusieurs sources vidéo verticalement ou horizontalement, et est utile pour le même usage que la fenêtre de sortie utilisée dans vrecord
  • Un exemple d’OCR utilise le filtre ocr et drawtext pour afficher le texte reconnu sur l’image
  • La sortie des données OCR s’affiche à l’écran sous la forme ffprobe -show_entries frame_tags=lavfi.ocr.text -f lavfi -i "movie=input_file,ocr"

Métadonnées, sommes de contrôle, travaux de préservation

  • L’extraction des métadonnées techniques s’effectue avec ffprobe -i input_file -show_format -show_streams -show_data -print_format xml
    • Outre XML, les formats de sortie JSON et flat peuvent être utilisés
  • La suppression des métadonnées utilise -map_metadata -1 -c:v copy -c:a copy
    • La vidéo et l’audio sont copiés, mais pas les métadonnées
  • Le traitement par lot en Bash s’effectue avec un fichier .sh et une boucle for
    • Exemple : for file in *.mxf; do ffmpeg -i "$file" -map 0 -c copy "${file%.mxf}.mov"; done
    • Le fichier .sh et les fichiers .mxf à traiter doivent se trouver dans le même répertoire, et la commande doit être exécutée depuis ce répertoire
    • Pour un traitement récursif, on peut utiliser find input_directory -iname "*.mxf" -exec ffmpeg -i {} -map 0 -c copy {}.mov \;
  • Sous Windows, le traitement par lot s’effectue avec des scripts PowerShell .ps1
    • L’exemple crée une liste de fichiers .mp4 et les remuxe en remplaçant l’extension de chaque fichier par .mkv
    • Pour appeler ffmpeg sans chemin complet, il doit être correctement configuré
  • La vérification des erreurs de décodeur décode sans fichier de sortie avec ffmpeg -i input_file -f null - et affiche les erreurs à l’écran
  • La vérification de fixité FFV1 Version 3 utilise -report -i input_file -f null - pour détecter les CRC checksum mismatch
    • Le Frame CRC est activé par défaut dans FFV1 Version 3
  • Le MD5 vidéo image par image se génère avec -f framemd5 -an
  • Le MD5 par groupe d’échantillons audio se génère avec asetnsamples=n=48000 -f framemd5 -vn
    • Il est présenté comme une bonne pratique d’aligner le nombre de groupes d’échantillons sur la fréquence d’échantillonnage du média
    • Par défaut, l’audio est transcodé en PCM 16 bits pour générer le framemd5
  • Le MD5 de flux peut être créé en mappant séparément les flux vidéo et audio avec -map, puis avec -c copy -f md5
    • Il sert à vérifier l’intégrité des informations A/V indépendamment des modifications des métadonnées du conteneur
  • streamhash affiche un hash par flux pour tous les flux
    • Comme il n’est pas nécessaire de savoir quels flux existent ni combien il y en a, c’est utile pour le hachage de mixed born-digital material
  • Les rapports QCTools génèrent un fichier .qctools.xml.gz avec ffprobe -f lavfi et notamment signalstats, cropdetect, idet, psnr, ssim, ebur128, astats
    • Des commandes distinctes sont fournies pour les fichiers avec audio et sans audio
  • L’extraction des sous-titres codés EIA-608 Line 21 sort les valeurs hexadécimales en CSV avec le filtre readeia608 et ffprobe

Fichiers de test et autres exemples FFmpeg

  • Les vidéos de test sont créées ou lues à partir d’entrées lavfi comme mandelbrot, smptebars, testsrc ou smptehdbars
    • L’exemple Mandelbrot produit une sortie H.264 en 1280x720, 25 fps, 10 secondes
    • L’exemple SMPTE bars produit une sortie ProRes en 720x576, 25 fps, 10 secondes
    • La lecture des HD SMPTE bars se fait avec ffplay -f lavfi -i smptehdbars=size=1920x1080
    • La lecture des VGA SMPTE bars se fait avec ffplay -f lavfi -i smptebars=size=640x480
  • L’audio de test en sinusoïde génère un fichier WAV avec sine=frequency=1000:sample_rate=48000:duration=5 et pcm_s16le
  • La vidéo de test combinant des SMPTE bars et une sinusoïde à 1 kHz utilise deux entrées lavfi ainsi que -c:v ffv1 et -c:a pcm_s16le
  • Le fichier de test corrompu altère volontairement le contenu des paquets avec -bsf noise=1 -c copy, sans endommager le conteneur
  • Le jeu de la vie de Conway est simulé avec ffplay -f lavfi life=..., et l’on peut enregistrer un segment avec ffmpeg et -t 5
  • La comparaison de similarité perceptuelle de deux vidéos utilise le filtre signature=detectmode=full:nb_inputs=2
  • Le hachage perceptuel de la vidéo d’entrée génère un fichier XML avec signature=format=xml:filename="output.xml"
  • Une séquence d’images peut être lue directement avec ffplay -framerate 5 input_file_%06d.ext, sans créer de vidéo
  • La séparation des pistes audio et vidéo utilise -map 0:v:0 et -map 0:a:0
  • La fusion des pistes audio et vidéo combine la vidéo du premier fichier et l’audio du second avec -map 0:v -map 1:a -c copy
  • Le fichier MPEG destiné à créer une image ISO pour accès DVD se crée avec -aspect 4:3 -target ntsc-dvd output_file.mpg, et nécessite l’installation de dvdauthor
  • Le CSV pour la détection de scènes basée sur YDIF affiche les valeurs lavfi.signalstats.YDIF de ffprobe et signalstats
  • Le head switching noise peut être masqué en dessinant une boîte noire en bas de l’image avec drawbox=w=iw:h=7:y=ih-h:t=max
  • Pour diffuser en direct vers une destination RTMP tout en enregistrant localement en MP4, on utilise le muxer tee
    • L’entrée est mise à l’échelle à 1280 px de largeur, et le flux est arrêté après une durée définie
    • L’exemple inclut une note indiquant qu’il a été utilisé quotidiennement pendant environ 4 ans pour diffuser en direct une véritable émission TV
  • Les informations sur un décodeur, encodeur, demuxer, muxer ou filtre précis se consultent avec ffmpeg -h type=name
    • Les exemples sont encoder=libx264, decoder=mp3, muxer=matroska, demuxer=mov et filter=crop

Outils connexes présentés avec FFmpeg

  • Les outils d’extraction CDDA couvrent la vérification de l’offset du lecteur CD et l’extraction précise de CD audio
    • Les différents modèles de lecteurs CD ayant des positions de début de lecture différentes, une correction d’offset est nécessaire pour vérifier les checksums d’un même contenu
    • L’identification du lecteur peut être vérifiée avec cdda2wav -scanbus, cdda2wav et cdparanoia -vsQ
    • L’offset se trouve dans la liste des offsets de lecteurs CD Accurate Rip
    • XLD est présenté comme outil GUI pour macOS
  • L’extraction avec CD Paranoia utilise cdparanoia -L -B -O [Drive Offset] [Starting Track Number]-[Ending Track Number] output_file.wav
    • -B correspond au mode batch, qui sépare automatiquement les pistes en fichiers distincts
  • Cdda2wav est un outil qui utilise la bibliothèque Paranoia pour extraire précisément les CD audio
    • La commande d’installation Homebrew est brew install cdrtools
    • La commande d’exemple extrait tout le CD dans un seul WAV, interroge CDDB et génère une cue sheet
    • Sur macOS, il faut démonter le CD avant d’exécuter la commande
  • CD emphasis est décrit comme une méthode de réduction du bruit pouvant affecter certains CD du début des années 1980 et des CD pressés au Japon
    • La vérification de sa présence s’effectue avec cdda2wav -J ou cdparanoia -Q
    • Pour corriger pendant l’extraction avec Cdda2wav, il faut ajouter le flag -T
  • ImageMagick est une suite de logiciels libres et open source permettant d’afficher, convertir et éditer des fichiers d’images raster et vectorielles
    • Les commandes sont appelées individuellement, comme convert, montage ou mogrify
    • La comparaison d’images renvoie le nombre de pixels différents avec compare -metric ae image1.ext image2.ext null:
    • La génération de miniatures utilise mogrify -resize 80x80 -format jpg -quality 75 -path thumbs *.jpg
    • Une grille d’images se crée avec montage @list.txt -tile 6x12 -geometry +0+0 output_grid.jpg
    • La suppression des données EXIF utilise mogrify -path ./stripped/ -strip *.jpg
  • L’outil flac est un outil de transcodage FLAC et de manipulation de métadonnées créé par le projet FLAC
    • Il a l’avantage, par rapport à d’autres outils, de pouvoir intégrer des métadonnées étrangères comme BWF
    • Pour convertir un WAV en FLAC tout en conservant les métadonnées BWF, on utilise flac --best --keep-foreign-metadata --preserve-modtime --verify input.wav
    • Pour reconstruire le BWF d’origine depuis le FLAC, on utilise --decode à la place de --best

1 commentaires

 
GN⁺ 2023-07-31
Avis de Hacker News
  • Un peu hors sujet, mais je considère ffmpeg comme l’un des meilleurs logiciels jamais créés
    Des ingénieurs talentueux comme Fabrice Bellard sont un immense cadeau pour la communauté FOSS, et même dans une licorne valorisée à environ 2 milliards de dollars où j’ai travaillé auparavant, une grande partie du produit reposait sur ffmpeg

    • Donc ils ont sûrement fait un don assez conséquent ?
      https://ffmpeg.org/donations.html
    • Ce n’est pas « Fabian Fabrice », mais Fabrice Bellard
      C’est aussi lui qui a créé QEMU, TCC, QuickJS, etc.
    • Il n’y a personne comme lui. Personne n’est dans la même catégorie que Fabrice Bellard ; on dirait même que personne ne joue au même jeu :-)
      Plus sérieusement, à n’importe quel instant, le nombre d’appareils exécutant du code qu’il a écrit est absolument délirant
    • Pour info, le « FF » de « FFmpeg » signifie « fast forward »
    • J’aime ffmpeg, mais les performances sur ARM doivent être améliorées
  • La ligne de commande de ffmpeg reste à s’arracher les cheveux, même avec de bons guides, donc j’ai envie de recommander VapourSynth
    https://www.vapoursynth.com/
    C’est un outil de filtrage vidéo façon Python, optimisé, mais il fait aussi beaucoup plus : https://vsdb.top/
    Et StaxRip exploite très bien ffmpeg, VapourSynth, des dizaines d’encodeurs et d’outils, au point que je redémarre de Linux vers Windows à cause de lui : https://github.com/staxrip/staxrip

    • Rien qu’un wrapper ffmpeg avec une meilleure interface en ligne de commande serait vraiment appréciable
      C’est inutilement complexe, et d’un certain point de vue toute la structure a peut-être du sens, mais pour effectuer des tâches très courantes, devoir connaître des options qui ressemblent à des incantations n’est pas normal
      Je dois avoir des dizaines d’alias bash qui réduisent des commandes ffmpeg de 150 caractères à deux mots
      ffprobe n’a pas non plus de sens : dans 99 % des cas, on le lance sans argument juste pour voir rapidement la durée, la résolution, le framerate et le nombre de pistes audio, mais 99 % de la sortie concerne des choses totalement hors sujet comme les options de compilation
  • Quelques ressources à voir aussi :
    https://ffmpeg.guide/ — créer rapidement et correctement des graphes de filtres FFmpeg complexes
    https://www.hadet.dev/ffmpeg-cheatsheet/ — découpe, ajout de fondus en entrée/sortie, mise à l’échelle, concaténation, etc.

    • La commande de découpe du deuxième lien n’a pas été idéale d’après mon expérience
      Pour une raison inconnue, ffmpeg se comporte différemment selon que les options -ss et -t/-to sont placées avant ou après -i, et dans mon cas les mettre avant fonctionnait mieux
      Le texte original a le même problème
    • ffmpeg.guide a l’air excellent, mais j’ai le sentiment qu’il devrait y avoir quelque chose de mieux dans ffmpeg lui-même
      Forcer un graphe non linéaire à entrer dans une ligne de commande plate et linéaire, c’est étrange
      Rien qu’une configuration JSON plus détaillée serait déjà bien mieux
    • ffmpeg.guide est vraiment bon. Existe-t-il quelque chose de similaire pour ImageMagick ?
    • Il suffit d’utiliser ffmpeg-python
  • Très utile
    J’ai commencé à utiliser ChatGPT pour créer des commandes ffmpeg, et c’est beaucoup plus rapide et plus simple pour trouver ce dont j’ai besoin
    J’ai aussi créé un petit outil pour le faire directement en ligne de commande : https://github.com/alexkrkn/help-cli
    J’ai également fait une vidéo à ce sujet : https://www.youtube.com/watch?v=pOda6TDBqcY

  • En cherchant récemment une interface pour ffmpeg, j’ai découvert Shutter Encoder : c’est un très bon logiciel, open source et compatible mac/windows
    J’ai enfin commencé à compresser 300 Go de vidéos personnelles accumulées sur 15 ans
    https://www.shutterencoder.com/
    Je compresse tout en H.265, et la taille des vidéos descend parfois jusqu’à 1/10. Y a-t-il une raison de ne pas faire ça ? J’ai lu que lire les vidéos compressées demandait plus de puissance de traitement, mais je ne sais pas vraiment si ce sera un gros problème à l’avenir

    • Je l’ai appliqué automatiquement à une grosse collection de vidéos et, même si les vidéos de test semblaient correctes, le réglage CRF était trop faible et la qualité s’est révélée inférieure à ce que j’espérais
      À prendre comme un avertissement : vérifiez plusieurs vidéos avant de supprimer les originaux
      Cela dit, pour 300 Go, le stockage est assez bon marché, donc autant garder les originaux
    • L’une des raisons de choisir encore H.264 est que le vieux matériel ou le matériel bas de gamme n’a souvent pas de décodage matériel H.265
      Et pour l’utiliser avec Plex sans transcodage, c’est aussi plus simple dans mon homelab
  • Ce guide recommande yadif comme filtre de désentrelacement, mais à mes yeux w3fdif donne de meilleurs résultats
    Il ne fait pas de suivi de mouvement comme yadif, donc il est assez rapide, et il évite les artefacts gênants que le suivi de mouvement produit parfois
    Je préfère un résultat constamment moyen à un résultat parfois excellent et parfois mauvais
    En revanche, contrairement à yadif qui regarde deux champs, w3fdif prend en compte trois champs à la fois, ce qui masque mieux les artefacts d’entrelacement

    • Il existe une version étendue : https://github.com/HomeOfVapourSynthEvolution/VapourSynth-Bw...
      Si vous devez de toute façon réencoder, autant aller jusqu’à QTGMC
    • Comme mentionné plus haut, w3fdif a été largement remplacé par bwdif
      w3fdif peut produire un effet de scintillement, contrairement à yadif ; bwdif se comporte donc comme yadif tout en utilisant le meilleur appariement de champs de w3fdif
    • bwdif est un hybride de yadif et w3fdif
  • Le principal obstacle à l’adoption de ffmpeg est sans doute constitué par les outils freemium premium hors ligne et les front-ends web
    Ces sites ont optimisé leur référencement sur des requêtes que les gens tapent souvent dans Google, comme « avi to mp4 » ou « mp3 to wav »
    Il m’a fallu étonnamment longtemps pour accepter les applications en ligne de commande, parce que le monde Windows m’avait appris que tout devait avoir une GUI

    • Je pensais que la plupart de ces sites de conversion de fichiers reposaient sur une architecture avec ffmpeg posé sur quelque chose comme nginx
  • Les gens disent que ffmpeg est compliqué, mais même avec une belle GUI, ça ne devient pas vraiment plus simple. Ce qui est compliqué, c’est la compression vidéo elle-même
    À moins d’un outil qui prend les décisions à votre place, comme une interface à clics à la HandBrake, aucun logiciel ne pourra vraiment rendre ça plus facile
    Je n’en suis pas certain, mais une fois qu’on a appris l’encodage et la compression vidéo numérique avec assez de finesse, ce qu’il faut faire dans ffmpeg doit aussi paraître assez intuitif. Quelqu’un l’a déjà fait en pratique ?

    • Il y a environ 17 ans, j’ai écrit un filtre DirectShow pour WindowsMobile, donc je comprends assez bien les codecs et les conteneurs
      À l’époque, il n’y avait pas encore de formats comme mkv ni de codecs comme HEVC, mais le concept consistant à manipuler l’audio/vidéo au moyen de plusieurs filtres est excellent, et la plupart des logiciels de conversion A/V fonctionnent ainsi
      Quand j’ai commencé à lire les pages de manuel de FFmpeg, j’ai vu les liens, et après environ une journée d’expérimentation, j’ai pu m’en servir
      Le fait que j’aime la ligne de commande et que je lise les pages man m’a peut-être avantagé
  • ffmpeg est puissant et je l’utilise souvent, mais sa structure d’API ne me rentre pas dans la tête. Ce serait bien d’avoir un front-end basé sur un LLM

    • L’API ne rentre pas vraiment dans ma tête non plus, mais en général, en faisant un grep dans https://ffmpeg.org/ffmpeg-all.html, j’arrive à trouver l’option dont j’ai besoin
  • Bonne idée. Amener FFmpeg à faire exactement ce qu’on veut est toujours intimidant
    ChatGPT m’a aidé, mais ce n’était pas parfait

    • ChatGPT a rendu les arguments et options de nombreux outils en ligne de commande beaucoup plus faciles à utiliser
      J’ai toujours eu du mal à mémoriser les options et arguments d’OpenSSL, alors maintenant j’utilise simplement GPT
    • ChatGPT a vraiment rendu ffmpeg accessible
      Cela dit, les différences subtiles entre systèmes d’exploitation restent un petit problème