3 Punkte von GN⁺ 2023-07-31 | 1 Kommentare | Auf WhatsApp teilen
  • ffmprovisr ist eine Hilfswebsite zum Erstellen von Befehlen, auf der Nutzer, denen das Schreiben von FFmpeg-Kommandos schwerfällt, eine Aufgabe auswählen und dazu Beispielbefehle sowie Erklärungen zu den einzelnen Flags einsehen können
  • Die Rezepte zerlegen rund um ffmpeg, ffplay und ffprobe Elemente wie Eingabedateien, Codecs, Filter, Stream-Mapping und Ausgabe-Container und stellen sie übersichtlich dar
  • Der abgedeckte Bereich ist breit und reicht von Remuxing/Transcoding über Zuschneiden und Zusammenfügen, Untertitel und Wasserzeichen, Thumbnails und GIFs bis hin zu Testdateien, Metadaten, Prüfsummen und QCTools-Berichten
  • Es gibt keine eigene Suche, stattdessen wird empfohlen, alle Rezepte aufzuklappen und dann per Browsersuche nach den benötigten Schlüsselwörtern zu suchen
  • Neben FFmpeg werden auch Werkzeuge wie CDDA-Ripping, ImageMagick und flac behandelt, sodass sich die Sammlung als praktische Befehlssammlung für Workflows zur digitalen Bewahrung nutzen lässt

Was ffmprovisr bietet

  • ffmprovisr stellt aufgabenbezogene Beispielbefehle und Optionserklärungen bereit und verringert so den Aufwand, FFmpeg-Kommandos selbst zusammensetzen zu müssen
  • Nutzer klicken auf einen Aufgaben-Button und gelangen zu einem einzelnen Befehl oder einer Liste verwandter Befehle, wo sie Beispielkommandos und das Verhalten der einzelnen Flags prüfen können
  • Die Seite selbst bietet keine Suchfunktion; empfohlen wird, alle Rezepte zu öffnen und dann mit ctrl+f oder cmd+f die Browsersuche zu verwenden
  • Als grundlegende Referenzen verlinkt sie die FFmpeg-offizielle Website, Reto Kromers installation instructions, den Command Line Crash Course und explainshell.com
  • Die Lizenz ist die Creative Commons Attribution 4.0 International License

Grundlegende Art, FFmpeg-Befehle zu lesen

  • FFmpeg wird nach der Installation in der Eingabeaufforderung durch Eingabe von ffmpeg aufgerufen
  • Ein Befehl besteht in der Regel aus Paaren aus Flags und Werten
    • In -i input_file.ext ist -i das Flag zur Angabe der Eingabedatei, und input_file.ext ist die Zieldatei
    • In -c:v prores gibt -c:v die Kodierung des Videostreams an, und prores ist der zu verwendende Codec
  • Der Name der Ausgabedatei steht am Ende des Befehls und wird ohne eigenes Ausgabe-Flag einfach als Dateiname angegeben
  • ffmpeg speichert Video, während ffplay ein erzeugtes Video wiedergeben kann, ohne es zu speichern
    • Ein Beispiel zum Speichern von SMPTE-Bars ist ffmpeg -f lavfi -i smptebars=size=640x480 -t 5 output_file
    • Ein Beispiel zum Abspielen von SMPTE-Bars ist ffplay -f lavfi smptebars=size=640x480
    • Das FFmpeg-Beispiel benötigt -i, die Aufnahmedauer -t 5 und eine Ausgabedatei, während das FFplay-Beispiel kein -i braucht

Checkpoints zur Verringerung von Fehlern

  • Es sollte geprüft werden, ob sich die Ausgabedatei öffnen und abspielen lässt und ob sie wie beabsichtigt aussieht und klingt
  • Die Ausgabeerweiterung muss zum beabsichtigten Codec passen; einige Erweiterungen führen in FFmpeg zu bestimmten Standard-Codecs
    • Zum Beispiel kann .mp4 standardmäßig auf H.264-Kodierung gesetzt werden
  • "Error: No such file or directory" kann durch ein falsches Verzeichnis, Tippfehler, fehlende Leerzeichen oder falsch angehängte Flags entstehen
    • Um unter macOS in den Downloads-Ordner zu wechseln, verwendet man cd $HOME/Downloads
    • Wenn ein kopierter und eingefügter Befehl trotz korrekt aussehender Syntax Fehler wirft, wird empfohlen, ihn in der Befehlszeile noch einmal direkt einzugeben
  • "Could not find tag for codec" tritt auf, wenn versucht wird, eine Datei mit Audio- oder Video-Codecs in einen anderen Container zu remuxen, die mit der Ausgabeerweiterung nicht kompatibel sind
    • Man kann zuerst in einen passenden Codec transkodieren oder -c copy entfernen, wenn man sicher ist, dass die Erweiterung automatisch mit dem richtigen Codec kodiert
  • "Killed" kann erscheinen, wenn eine Datei die Speicherkapazität des Servers überschreitet
    • Auf einem Remote-Server kann das durch Erhöhen des verfügbaren Speichers gelöst werden
    • Auf einem lokalen Server ist es sinnvoll, die FFmpeg-Version aktuell zu halten und das Programm nicht gleichzeitig mit anderen speicherintensiven Anwendungen auszuführen
  • Wenn bei der Verwendung von Filtern "Error splitting argument list: option not found" erscheint, sollte die Verwendung von Anführungszeichen und die Form des Filtergraphs geprüft werden
  • Filter erfordern eine erneute Kodierung des Streams; deshalb kann ihre Verwendung zusammen mit -c copy, das Dateistreams direkt kopiert, Probleme verursachen

Filtergraphen, Stream-Mapping und Standard-Codecs

  • Wenn FFmpeg-Batch-Jobs innerhalb einer Schleife ausgeführt werden, kann vor der Eingabe -nostdin gesetzt werden, um das Standardverhalten für Interaktionen über die Standardeingabe zu überschreiben
    • Beispiel: ffmpeg -nostdin -i input_file ...
  • FFmpeg setzt Standardwerte für Codecs und Codec-Parameter automatisch anhand des Ausgabeformats
    • .avi: Audio mp3, Video mpeg4
    • .mkv: Audio ac3, Video H.264
    • .mov: Audio AAC, Video H.264
    • .mp4: Audio AAC, Video H.264
    • .mpg: Audio mp2, Video mpeg1video
    • .mxf: Audio pcm_s16le, Video mpeg2video
    • .wav: Audio pcm_s16le
  • Ein Filtergraph ist eine Kombination aus Filternamen und Optionen nach -vf oder -af
    • -vf ist ein Alias für -filter:v
    • Ein Beispiel für einen Videofilter ist hflip, ein Beispiel für einen Audiofilter amerge
    • Mehrere Filter werden mit Kommas verbunden, mehrere Filterketten mit Semikolons getrennt
    • -vf "fieldmatch,yadif,decimate" ist eine einzelne Filterkette für die Inverse-Telecine-Verarbeitung
    • Bei mehr als einer Eingabe oder Ausgabe muss statt -vf -filter_complex verwendet werden
    • Es sollten gerade Anführungszeichen verwendet und typografische Anführungszeichen vermieden werden
  • Stream-Mapping legt fest, welche Video-, Audio-, Untertitel-, Daten- und Anhang-Streams einer Eingabedatei in die Ausgabe übernommen werden
    • FFmpeg erkennt die Stream-Typen a, v, s, d, t
    • -map 0:v wählt alle Videostreams der ersten Eingabedatei aus
    • -map 0:3 wählt den vierten Stream der ersten Eingabedatei aus
    • -map 0:a:2 wählt den dritten Audiostream der ersten Eingabedatei aus
    • Wenn kein Mapping angegeben wird, übernimmt der Standard bei Videodateien nur einen Videostream und einen Audiostream in die Ausgabe
    • Um alle Streams zu mappen, verwendet man -map 0
    • Mit einem angehängten ? wie in -map 0:a? lassen sich bei Batch-Verarbeitung auch Dateien ohne Audio ohne Fehler verarbeiten

Containerwechsel und Transkodierung

  • Das Rewrapping von Dateien erfolgt mit ffmpeg -i input_file.ext -c copy -map 0 output_file.ext
    • Dabei werden die internen Video-, Audio- und Untertiteldaten nicht verändert, sondern nur in ein anderes Containerformat verschoben
    • Rewrapping wird auch als Remuxing oder Re-Multiplexing bezeichnet
    • Mit -map 0 lassen sich alle Streams wie mehrere Audiospuren erhalten
    • Manche Container können nur bestimmte Stream-Encoding-Typen enthalten, sodass Rewrapping ohne Re-Encoding möglicherweise nicht möglich ist
  • Zum Erstellen von Broadcast WAV werden mit -write_bext 1 und -metadata field_name='Content' der BEXT-Chunk und zugehörige Metadaten geschrieben
    • Häufig verwendete Felder sind description, originator, originator_reference, origination_date, origination_time, coding_history, IARL
    • Für BWF-Metadatenfelder gelten Zeichenbegrenzungen; OriginatorReference ist maximal 32 Zeichen lang
  • Beim Rewrapping von DV-Codec-Video in eine .dv-Datei wird -f rawvideo -c:v copy verwendet, damit Quellmetadaten im DV-Stream nicht unbeabsichtigt entfernt werden
  • Ein Beispiel für Apple ProRes LT-Transkodierung ist -c:v prores -profile:v 1 -vf yadif -c:a pcm_s16le
    • Die ProRes-422-Profile sind 0 Proxy, 1 LT, 2 Standard, 3 HQ
    • Von FFmpeg unterstützte ProRes-Container sind QuickTime .mov, Matroska .mkv und MXF .mxf
  • Ein Beispiel für H.264-Transkodierung ist -c:v libx264 -pix_fmt yuv420p -c:a aac
    • Der Standard für libx264 ist das Preset medium und CRF 23
    • -pix_fmt yuv420p legt 4:2:0-Chroma-Subsampling für die Kompatibilität mit QuickTime und den meisten nicht auf FFmpeg basierenden Playern fest
    • Für Streaming-Optimierung wird -movflags +faststart ergänzt
    • Ein Beispiel für höhere Qualität ist -preset veryslow -crf 18; CRF 18 gilt oft als „visuell verlustfrei“
  • Nvidia-GPU-basiertes H.264/H.265-Encoding verwendet h264_nvenc oder hevc_nvenc
    • Nvidias festverdrahtete Hardware kann 10-mal so schnell sein wie CPU-Encoding, erfordert bei der Qualitätsoptimierung für niedrige Bitraten aber mehr Parameter
    • HEVC wird als effizienterer Codec beschrieben, der auf GPUs etwa seit 2015 unterstützt wird
  • Für H.265/HEVC-Transkodierung wird -c:v libx265 -pix_fmt yuv420p -c:a copy verwendet
    • Der Standard für libx265 ist das Preset medium und CRF 28
    • CRF 28 bei H.265 entspricht CRF 23 bei H.264; die Dateigröße kann etwa halb so groß sein
  • Ein verlustfreies Beispiel für die Archivierung nutzt FFV1 Version 3 in einem Matroska-Container und erzeugt zusätzlich eine Eingabe-framemd5
    • -map 0 mappt alle Streams
    • -dn schließt Datenströme aus, die Matroska nicht erlaubt
    • -slicecrc 1 fügt CRC-Informationen hinzu, damit Decoder beschädigte Slices erkennen können
    • -f framemd5 -an erzeugt MD5-Prüfsummen pro Videoframe

Ändern von Video- und Audioeigenschaften

  • Das Rezept zum Ändern des Seitenverhältnisses verwendet den Padding-Filter
    • Um 4:3 in 16:9 umzuwandeln, wird Pillarboxing angewendet
    • Um 16:9 in 4:3 umzuwandeln, wird Letterboxing angewendet
    • Bei stummen Videos kann statt -c:a copy auch -an verwendet werden
  • Ein Beispiel für die Umwandlung von SD in HD verwendet die drei Filter colormatrix=bt601:bt709, scale=1440:1080:flags=lanczos, pad=1920:1080:240:0
    • Dabei werden die Luma-Koeffizienten von Rec. 601 auf Rec. 709 geändert
    • Lanczos-Skalierung ist langsamer als das standardmäßige Bilinear, liefert aber bessere Ergebnisse
    • Bei Interlaced-Quellen wird empfohlen, vor dem Skalieren mit yadif zu deinterlacen
  • Das Display-Seitenverhältnis kann auf Containerebene mit Optionen wie -aspect 4:3 geändert werden
    • In Verbindung mit -c:v copy beeinflusst das nicht das Seitenverhältnis in den kodierten Frames, sondern das im Container gespeicherte Seitenverhältnis
  • Für Farbraumkonvertierung wird der Filter colormatrix=src:dst verwendet
    • Zu den zulässigen Werten gehören bt601, smpte170m, bt470bg, bt709, bt2020
    • Zum Einbetten von Farbraum-Metadaten werden -color_primaries, -color_trc, -colorspace verwendet
    • Es ist Vorsicht geboten, da man einer tatsächlichen Rec.601-Datei auch Rec.709-Tags zuweisen kann
    • Metadaten-Tags werden von libx264 oder libx265 geschrieben und können daher nicht ohne Re-Encoding hinzugefügt werden
  • Für Geschwindigkeitsänderungen werden setpts und atempo zusammen verwendet
    • Das Beispiel erstellt eine PAL-Access-Kopie, bei der 24 fps auf 25 fps geändert werden, während die Audio-Tonhöhe erhalten bleibt
  • Für Fade-Effekte werden die Filter fade und afade verwendet; wegen des Filtereinsatzes müssen Video und Audio neu kodiert werden
  • Zum Audio-Extrahieren wird mit -c:a copy -vn der Audiostream verlustfrei ohne Video herausgezogen
  • Zum Zusammenführen von zwei Audiospuren werden amerge und -filter_complex verwendet
    • Das kann für nachgelagerte Prozesse nützlich sein, die eine einzelne Audiospur erwarten, etwa automatische YouTube-Untertitel
    • Vor dem Schreiben eines Skripts wird empfohlen, zunächst ffprobe auszuführen, um die gewünschten Spuren zu prüfen
  • Für Lautheitsanalyse und -normalisierung wird der Filter loudnorm verwendet
    • Die JSON-Ausgabe kann als Eingabewert für eine 2-Pass-Normalisierung dienen
    • Die Standardwerte werden als gut passend zu den von PBS empfohlenen Ziel-Lautheitswerten beschrieben
    • 1-Pass ist schneller, aber weniger präzise als 2-Pass
  • Ebenfalls enthalten sind Rezepte für CD-Pre-Emphasis, RIAA-Entzerrung, Audio-Resampling und das erzwungene Interpretieren von 192-kHz-WAV als 96 kHz

Schneiden, Zusammenfügen und Segmente

  • Zum Zusammenfügen von Dateien mit denselben technischen Spezifikationen wird der Concat-Demuxer verwendet
    • ffmpeg -f concat -i mylist.txt -c copy output_file
    • Die zusammenzufügenden Dateien müssen denselben Codec und dieselben technischen Spezifikationen haben; die Ausgabedatei sollte unbedingt vorab geprüft werden
    • Für absolute Pfade wird -safe 0 ergänzt
  • Zum Zusammenfügen von Dateien mit unterschiedlichen Dateiformaten oder Codecs werden der concat-Filter und -filter_complex verwendet
    • Die Eingabedateien können sich in Container, Codec, Chroma-Subsampling, Framerate usw. unterscheiden
    • Das Standardbeispiel funktioniert nur korrekt, wenn die Auflösung gleich ist
    • Bei unterschiedlicher Framerate kann die Ausgabe eine variable Framerate haben
    • Bei unterschiedlicher Auflösung wird vor dem Concat mit scale angeglichen; beim Zusammenfügen von SD und HD kann SD mit Pillarboxing versehen werden
  • Das Aufteilen von Dateien erfolgt mit dem Segment-Muxer
    • -segment_time 60 erzeugt Segmente mit einer maximalen Länge von 60 Sekunden
    • %03d erzeugt Dateinamen mit dreistelliger, nullaufgefüllter Nummerierung
  • Für Trimmen ohne Re-Encoding werden -ss, -to, -t, -c copy, -map 0 verwendet
    • Interframe-Codecs wie H.264 können am nächstgelegenen Punkt auf Basis eines I-Frames beginnen
    • -sseof -5 kopiert ab 5 Sekunden vor dem Dateiende
  • Zum Entfernen von Stille am Anfang einer Audiodatei wird silenceremove=start_threshold=-57dB:start_duration=1:start_periods=1 verwendet
    • -57dB wird als geeigneter Wert vorgeschlagen, um analoges Rauschen zu berücksichtigen
    • Wegen des Filtereinsatzes wird das Audio neu kodiert
  • Zum Entfernen von Stille am Ende einer Audiodatei wird die Reihenfolge areverse, silenceremove, areverse verwendet
    • Da silenceremove besser zum Entfernen von Stille am Anfang geeignet ist, wird das Audio umgedreht und danach wieder zurückgedreht

Verarbeitung von Interlaced-Video

  • Beim Erstellen einer zugänglichen HD-H.264-Datei aus einer SD-NTSC-Quelle werden yadif, scale, pad und format=yuv420p zusammen verwendet
    • yadif ist ein Deinterlacing-Filter
    • scale=1440:1080:flags=lanczos passt das Bild auf 1440x1080 an
    • pad=1920:1080:(ow-iw)/2:(oh-ih)/2 fügt Padding hinzu, damit ein 4:3-Eingang in einen 16:9-Ausgabeframe passt
  • Ein allgemeines Deinterlacing-Beispiel ist -vf "yadif,format=yuv420p"
    • format=yuv420p legt 4:2:0-Chroma-Subsampling für die H.264-Wiedergabekompatibilität fest
    • FFmpeg bietet neben yadif auch die Deinterlacer bwdif, w3fdif, kerndeint und nnedi
  • Für Deinterlacing mit Auftrennung von Feldern in Frames wird idet,bwdif,format=yuv420p verwendet
    • Dies wird bevorzugt, um die visuelle Cadence der Quelle bei Interlaced-Video mit viel Bewegung zu erhalten
    • idet erkennt die Feldreihenfolge
    • bwdif gibt standardmäßig für jedes Feld einen Frame aus
  • Für Inverse Telecine wird fieldmatch,yadif,decimate verwendet
    • Dadurch wird 3:2-Pulldown rückgängig gemacht, um 29.97fps-Interlaced-Video auf die 24fps-Bildrate der ursprünglichen Filmquelle zurückzuführen
    • Bei Anwendung auf eine 29.97i-Datei beträgt die Ausgabebildrate tatsächlich 23.976fps
  • Zum Ändern der Feldreihenfolge wird setfield=tff oder setfield=bff verwendet
    • Da ein Videofilter verwendet wird, kann -c copy nicht genutzt werden und eine Neuencodierung ist erforderlich
  • Das Interlacing-Muster lässt sich mit ffmpeg -i input_file -filter:v idet -f null - ohne Ausgabedatei analysieren

Wasserzeichen, Untertitel, Thumbnails, GIF

  • Ein Text-Wasserzeichen wird mit dem Filter drawtext erzeugt
    • Dabei werden die Optionen fontfile, fontsize, text, fontcolor, alpha, x und y festgelegt
    • x=(w-text_w)/2:y=(h-text_h)/2 positioniert es unabhängig von der Videogröße mittig
  • Ein Bild-Wasserzeichen kann mit overlay=main_w-overlay_w-5:5 oben rechts platziert werden
  • Eingebrannter Timecode verwendet die Optionen timecode, box, boxcolor und rate von drawtext
    • Der Start-Timecode hat das Format hh:mm:ss[:;.]ff
  • Zum Einbetten einer Untertiteldatei wird -i subtitles_file -c copy -c:s mov_text verwendet
    • mov_text funktioniert in MP4- und MOV-Containern
    • Zulässige Formate im MKV-Container sind ASS, SRT und SSA
  • Ein einzelnes Thumbnail wird mit -ss 00:00:20 -vframes 1 thumb.png extrahiert
  • Um jede Minute ein Thumbnail zu erzeugen, wird -vf fps=1/60 out%d.png verwendet
  • Zum Erstellen eines GIF aus einer Bildsequenz werden image2, -framerate, -pattern_type glob und scale verwendet
  • Ein hochwertiges GIF wird in zwei Schritten erzeugt
    • Der erste Befehl erstellt mit palettegen eine benutzerdefinierte Palette
    • Der zweite Befehl wendet die Palette mit paletteuse an
    • Die einfachere Methode ist -vf "fps=10,scale=500:-1", aber dabei ist Dithering deutlicher sichtbar und die Dateigröße kleiner

Bildsequenzen, Scopes, OCR

  • Um aus einer Bildsequenz ein unkomprimiertes 10-Bit-Video zu erstellen, wird -f image2 -framerate 24 -i input_file_%06d.ext -c:v v210 verwendet
    • Die Standardbildrate des image2-Demuxers beträgt 25fps
    • %06d liest Dateinamen mit sechsstelliger Nummerierung in aufsteigender Reihenfolge
  • Um aus Bild- und Audiodatei ein Video zu erzeugen, werden -loop 1, -shortest und -vf scale=1280:720 verwendet
    • Das kann nützlich sein, wenn man eine Audiodatei auf Plattformen wie YouTube hochladen möchte
  • Mit ffplay -f lavfi und Filtern lassen sich Audiobittiefe visualisieren, Dezibelgrafen anzeigen, Pixel außerhalb des Broadcast-Bereichs markieren und ein Vectorscope darstellen
  • tblend=all_mode=difference128 und hstack zeigen die zeitlichen Unterschiede zwischen zwei Eingabevideos nebeneinander
  • xstack wird verwendet, um ein Ausgabefenster zu erstellen, das mehrere Videoquellen vertikal oder horizontal stapelt, und ist für denselben Zweck nützlich wie das von vrecord verwendete Ausgabefenster
  • Das OCR-Beispiel verwendet den Filter ocr und drawtext, um erkannten Text über dem Video anzuzeigen
  • Die Ausgabe von OCR-Daten erfolgt mit ffprobe -show_entries frame_tags=lavfi.ocr.text -f lavfi -i "movie=input_file,ocr" auf dem Bildschirm

Metadaten, Checksummen, Erhaltungsarbeit

  • Das Extrahieren technischer Metadaten erfolgt mit ffprobe -i input_file -show_format -show_streams -show_data -print_format xml
    • Als Ausgabeformate können neben XML auch JSON und flat verwendet werden
  • Zum Entfernen von Metadaten wird -map_metadata -1 -c:v copy -c:a copy verwendet
    • Video und Audio werden kopiert, Metadaten jedoch nicht
  • Batch-Verarbeitung in Bash erfolgt mit einer .sh-Datei und einer for-Schleife
    • Beispiel: for file in *.mxf; do ffmpeg -i "$file" -map 0 -c copy "${file%.mxf}.mov"; done
    • Die .sh-Datei und die zu verarbeitenden .mxf-Dateien müssen sich im selben Verzeichnis befinden, und der Befehl muss in diesem Verzeichnis ausgeführt werden
    • Für rekursive Verarbeitung kann find input_directory -iname "*.mxf" -exec ffmpeg -i {} -map 0 -c copy {}.mov \; verwendet werden
  • Unter Windows erfolgt die Batch-Verarbeitung mit einem PowerShell-.ps1-Skript
    • Das Beispiel erstellt eine Liste von .mp4-Dateien und relabelt jede Datei, indem die Erweiterung in .mkv geändert wird
    • Damit ffmpeg ohne vollständigen Pfad aufgerufen werden kann, muss es korrekt eingerichtet sein
  • Decoder-Fehler werden mit ffmpeg -i input_file -f null - geprüft, wobei ohne Ausgabedatei decodiert und Fehler auf dem Bildschirm ausgegeben werden
  • Die Fixity-Prüfung für FFV1 Version 3 erfolgt mit -report -i input_file -f null -, um CRC checksum mismatch zu prüfen
    • Frame CRC ist in FFV1 Version 3 standardmäßig aktiviert
  • Video-MD5 pro Frame wird mit -f framemd5 -an erzeugt
  • MD5 pro Audiosample-Gruppe wird mit asetnsamples=n=48000 -f framemd5 -vn erzeugt
    • Es wird als gute Praxis empfohlen, die Anzahl der Sample-Gruppen an die Mediensamplerate anzupassen
    • Standardmäßig wird Audio für die Erzeugung von framemd5 in 16-Bit-PCM transkodiert
  • Stream-MD5 kann erzeugt werden, indem Video- und Audiostream jeweils mit -map ausgewählt und mit -c copy -f md5 verarbeitet werden
    • Dies dient zur Prüfung der Integrität von A/V-Informationen unabhängig von Änderungen an Container-Metadaten
  • streamhash gibt streamweise Hashes für alle Streams aus
    • Das ist nützlich zum Hashing gemischter born-digitaler Materialien, da man nicht wissen muss, wie viele Streams vorhanden sind
  • Ein QCTools-Report erzeugt mit ffprobe -f lavfi und signalstats, cropdetect, idet, psnr, ssim, ebur128, astats usw. eine .qctools.xml.gz
    • Es werden separate Befehle für Dateien mit und ohne Audio bereitgestellt
  • Das Extrahieren von EIA-608-Line-21-Untertiteln gibt mit dem Filter readeia608 und ffprobe Hex-Werte als CSV aus

Testdateien und weitere FFmpeg-Beispiele

  • Testvideos werden mit lavfi-Eingängen wie mandelbrot, smptebars, testsrc oder smptehdbars erzeugt oder abgespielt
    • Das Mandelbrot-Beispiel ist eine H.264-Ausgabe mit 1280x720, 25 fps und 10 Sekunden Länge
    • Das SMPTE-Bars-Beispiel ist eine ProRes-Ausgabe mit 720x576, 25 fps und 10 Sekunden Länge
    • HD-SMPTE-Bars werden mit ffplay -f lavfi -i smptehdbars=size=1920x1080 abgespielt
    • VGA-SMPTE-Bars werden mit ffplay -f lavfi -i smptebars=size=640x480 abgespielt
  • Testaudio mit Sinuswelle erzeugt mit sine=frequency=1000:sample_rate=48000:duration=5 und pcm_s16le eine WAV-Datei
  • Ein Testvideo aus SMPTE-Bars und einem 1-kHz-Sinuston verwendet zwei lavfi-Eingänge sowie -c:v ffv1 und -c:a pcm_s16le
  • Eine beschädigte Testdatei verfälscht mit -bsf noise=1 -c copy absichtlich den Paketinhalt, ohne den Container zu beschädigen
  • Conway's Game of Life wird mit ffplay -f lavfi life=... simuliert; mit ffmpeg und -t 5 lässt sich ein Abschnitt speichern
  • Für den Vergleich der perzeptuellen Ähnlichkeit zweier Videos wird der Filter signature=detectmode=full:nb_inputs=2 verwendet
  • Der perzeptuelle Hash eines Eingabevideos erzeugt mit signature=format=xml:filename="output.xml" eine XML-Datei
  • Eine Bildsequenz kann mit ffplay -framerate 5 input_file_%06d.ext direkt abgespielt werden, ohne zuerst ein Video zu erstellen
  • Audio- und Videospuren werden mit -map 0:v:0 und -map 0:a:0 getrennt
  • Audio- und Videospuren werden mit -map 0:v -map 1:a -c copy zusammengeführt, wobei das Video aus der ersten Datei und das Audio aus der zweiten Datei kombiniert werden
  • Eine MPEG-Datei zur Erstellung einer ISO für den DVD-Zugriff wird mit -aspect 4:3 -target ntsc-dvd output_file.mpg erzeugt; dafür ist dvdauthor erforderlich
  • CSV für die YDIF-basierte Szenenerkennung gibt mit ffprobe und dem Wert lavfi.signalstats.YDIF aus signalstats aus
  • Head-Switching-Noise kann mit drawbox=w=iw:h=7:y=ih-h:t=max überdeckt werden, indem am unteren Rand des Frames ein schwarzer Balken gezeichnet wird
  • Für gleichzeitiges Live-Streaming an ein RTMP-Ziel und lokales Aufzeichnen als MP4 wird der tee-Muxer verwendet
    • Die Eingabe wird auf 1280 px Breite skaliert, und der Stream wird nach der angegebenen Zeit beendet
    • Das Beispiel enthält den Hinweis, dass dies etwa 4 Jahre lang täglich für echtes TV-Show-Live-Streaming verwendet wurde
  • Informationen zu bestimmten Decodern, Encodern, Demuxern, Muxern und Filtern lassen sich mit ffmpeg -h type=name anzeigen
    • Beispiele sind encoder=libx264, decoder=mp3, muxer=matroska, demuxer=mov, filter=crop

Verwandte zusammen mit FFmpeg vorgestellte Tools

  • Ein CDDA-Ripping-Tool behandelt die Ermittlung des CD-Laufwerk-Offsets und das präzise Rippen von Audio-CDs
    • Unterschiedliche CD-Laufwerksmodelle haben verschiedene Startpositionen beim Lesen, daher ist zum Prüfen von Checksummen desselben Inhalts eine Offset-Korrektur erforderlich
    • Die Laufwerkserkennung kann mit cdda2wav -scanbus, cdda2wav und cdparanoia -vsQ erfolgen
    • Offsets finden sich in der Accurate Rip CD drive offset list
    • Als macOS-GUI-Tool wird XLD vorgestellt
  • Für CD-Paranoia-Ripping wird cdparanoia -L -B -O [Drive Offset] [Starting Track Number]-[Ending Track Number] output_file.wav verwendet
    • -B ist der Batch-Modus, der Tracks automatisch in separate Dateien aufteilt
  • Cdda2wav ist ein Tool zum präzisen Rippen von Audio-CDs unter Verwendung der Paranoia library
    • Der Homebrew-Installationsbefehl lautet brew install cdrtools
    • Der Beispielbefehl rippt die gesamte CD in eine einzelne WAV-Datei, fragt CDDB ab und erstellt ein Cue Sheet
    • Unter macOS muss die CD vor Ausführung des Befehls unmountet werden
  • CD-Emphasis wird als Rauschminderungsverfahren beschrieben, das einige frühe CDs aus den 1980er Jahren und in Japan gepresste CDs betreffen kann
    • Das Vorhandensein wird mit cdda2wav -J oder cdparanoia -Q geprüft
    • Um die Korrektur beim Rippen mit Cdda2wav anzuwenden, wird das Flag -T hinzugefügt
  • ImageMagick ist eine freie Open-Source-Softwaresammlung zum Anzeigen, Konvertieren und Bearbeiten von Raster- und Vektorbilddateien
    • Befehle werden als einzelne Kommandos wie convert, montage und mogrify aufgerufen
    • Der Bildvergleich mit compare -metric ae image1.ext image2.ext null: gibt die Anzahl unterschiedlicher Pixel zurück
    • Zur Thumbnail-Erstellung wird mogrify -resize 80x80 -format jpg -quality 75 -path thumbs *.jpg verwendet
    • Ein Bildraster wird mit montage @list.txt -tile 6x12 -geometry +0+0 output_grid.jpg erstellt
    • EXIF wird mit mogrify -path ./stripped/ -strip *.jpg entfernt
  • Das Tool flac ist ein vom FLAC-Projekt entwickeltes Werkzeug für FLAC-Transkodierung und Metadatenbearbeitung
    • Gegenüber anderen Tools hat es den Vorteil, fremde Metadaten wie BWF einbetten zu können
    • Um von WAV nach FLAC zu konvertieren und dabei BWF-Metadaten zu erhalten, wird flac --best --keep-foreign-metadata --preserve-modtime --verify input.wav verwendet
    • Um das ursprüngliche BWF aus FLAC wiederherzustellen, wird statt --best --decode verwendet

1 Kommentare

 
GN⁺ 2023-07-31
Meinungen auf Hacker News
  • Etwas off-topic, aber ich halte ffmpeg für eine der besten Softwares, die je entwickelt wurden.
    Talentierte Ingenieure wie Fabrice Bellard sind ein großes Geschenk für die FOSS-Community, und selbst bei einem Unicorn im Wert von etwa 2 Milliarden Dollar, bei dem ich früher gearbeitet habe, hing ein großer Teil des Produkts von ffmpeg ab.

    • Dann habt ihr sicher eine ziemlich große Summe gespendet, oder?
      https://ffmpeg.org/donations.html
    • Es heißt nicht „Fabian Fabrice“, sondern Fabrice Bellard.
      Er hat auch QEMU, TCC, QuickJS usw. entwickelt.
    • Es gibt niemanden wie ihn. Niemand spielt in derselben Liga wie Fabrice Bellard; es sieht nicht einmal so aus, als würde überhaupt jemand dasselbe Spiel spielen :-)
      Im Ernst: Die Zahl der Geräte, auf denen zu jedem beliebigen Zeitpunkt Code von ihm läuft, ist wirklich absurd.
    • Zur Info: Das „FF“ in „FFmpeg“ steht für „fast forward“.
    • Ich mag ffmpeg, aber die ARM-Performance müsste besser werden.
  • Die ffmpeg-Kommandozeile lässt einen selbst mit guten Guides immer noch die Haare raufen, deshalb möchte ich VapourSynth empfehlen.
    https://www.vapoursynth.com/
    Ein optimiertes, Python-artiges Tool für Videofilterung, aber auch noch viel mehr: https://vsdb.top/
    Und StaxRip nutzt ffmpeg, VapourSynth sowie Dutzende Encoder und Tools gut aus; dafür boote ich sogar von Linux nach Windows neu: https://github.com/staxrip/staxrip

    • Schon ein ffmpeg-Wrapper mit besserem Kommandozeileninterface wäre wirklich großartig.
      Es ist unnötig kompliziert, und aus irgendeiner Perspektive mag die Struktur vielleicht überall Sinn ergeben, aber für sehr häufige Aufgaben magische Optionen kennen zu müssen, ist nicht angemessen.
      Ich dürfte Dutzende Bash-Aliase haben, die 150 Zeichen lange ffmpeg-Befehle auf zwei Wörter reduzieren.
      ffprobe ist auch unsinnig: In 99 % der Fälle führt man es ohne Argumente aus, um schnell Länge, Auflösung, Framerate und vielleicht die Anzahl der Audiospuren zu sehen, aber 99 % der Ausgabe sind völlig irrelevante Dinge wie Compile-Optionen.
  • Weitere sehenswerte Ressourcen:
    https://ffmpeg.guide/ — komplexe FFmpeg-Filtergraphen schnell und präzise erstellen
    https://www.hadet.dev/ffmpeg-cheatsheet/ — Schneiden, Fade-in/out hinzufügen, Skalieren, Zusammenfügen usw.

    • Der Schneidebefehl im zweiten Link war meiner Erfahrung nach nicht ideal.
      Aus unbekannten Gründen verhält sich ffmpeg unterschiedlich, je nachdem, ob man die Flags -ss und -t/-to vor oder nach -i setzt; bei mir funktionierte es besser, sie davor zu setzen.
      Im Originaltext gibt es dasselbe Problem.
    • ffmpeg.guide sieht großartig aus, aber ich habe das Gefühl, dass ffmpeg selbst etwas Besseres haben sollte.
      Es ist seltsam, einen nichtlinearen Graphen gewaltsam in eine flache, lineare Kommandozeile zu pressen.
      Schon eine ausführlichere JSON-Konfiguration wäre viel besser.
    • ffmpeg.guide ist wirklich gut. Gibt es etwas Ähnliches für ImageMagick?
    • Man kann einfach ffmpeg-python verwenden.
  • Sehr nützlich.
    Ich habe angefangen, ChatGPT zum Erstellen von ffmpeg-Befehlen zu nutzen, und es ist viel schneller und einfacher, das zu finden, was ich brauche.
    Ich habe auch ein kleines Tool gebaut, damit das direkt auf der Kommandozeile geht: https://github.com/alexkrkn/help-cli
    Dazu habe ich auch ein Video gemacht: https://www.youtube.com/watch?v=pOda6TDBqcY

  • Auf der Suche nach einer ffmpeg-UI habe ich kürzlich Shutter Encoder entdeckt; es ist Open Source, unterstützt Mac/Windows und ist wirklich gute Software.
    Endlich habe ich angefangen, meine 300 GB große persönliche Videosammlung aus 15 Jahren zu komprimieren.
    https://www.shutterencoder.com/
    Ich komprimiere alles nach H.265, und die Videogröße schrumpft manchmal auf ein Zehntel. Gibt es einen Grund, das nicht zu tun? Ich habe zwar gelesen, dass die Wiedergabe komprimierter Videos mehr Rechenleistung braucht, aber ich bin mir nicht sicher, ob das künftig ein großes Problem wird.

    • Ich habe das automatisiert auf eine große Videosammlung angewendet; obwohl es bei Testvideos okay aussah, waren die CRF-Einstellungen zu schwach, und die Qualität blieb hinter den Erwartungen zurück.
      Das kann man als Warnung verstehen, mehrere Videos zu prüfen, bevor man die Originale löscht.
      Bei 300 GB ist Speicher aber billig genug, also kann man die Originale auch einfach behalten.
    • Einer der Gründe, warum ich weiterhin H.264 wähle, ist, dass ältere oder günstige Hardware oft keine H.265-Hardwaredekodierung hat.
      Außerdem ist es für die Nutzung mit Plex ohne Transcoding auch in meinem Homelab einfacher.
  • Dieser Guide empfiehlt yadif als Deinterlacing-Filter, aber für mein Auge sieht w3fdif besser aus.
    Es macht kein Motion Tracking wie yadif, ist daher ziemlich schnell und vermeidet die störenden Artefakte, die Motion Tracking gelegentlich erzeugt.
    Ich finde konstant mittelmäßige Ergebnisse besser als Ergebnisse, die manchmal hervorragend und manchmal schlecht sind.
    Allerdings betrachtet w3fdif im Gegensatz zu yadif, das zwei Felder betrachtet, drei Felder auf einmal und kaschiert Interlacing-Artefakte dadurch besser.

    • Es gibt eine erweiterte Variante davon: https://github.com/HomeOfVapourSynthEvolution/VapourSynth-Bw...
      Wenn man ohnehin neu encodiert, sollte man gleich bis zu QTGMC gehen.
    • Wie oben erwähnt, wurde w3fdif im Allgemeinen durch bwdif ersetzt.
      w3fdif kann Flimmern erzeugen, yadif dagegen nicht; bwdif verhält sich daher wie yadif, nutzt aber das bessere Field Matching von w3fdif.
    • bwdif ist ein Hybrid aus yadif und w3fdif.
  • Die größte Hürde für die Einführung von ffmpeg dürften wohl Offline-Premium-Freemium-Tools und Web-Frontends sein.
    Die Sites sind für Suchbegriffe optimiert, die Leute häufig bei Google eingeben, etwa „avi to mp4“ oder „mp3 to wav“.
    Es hat länger gedauert als gedacht, bis ich mich auf Kommandozeilen-Apps eingelassen habe, weil die Windows-Welt einem beigebracht hat, dass alles eine GUI haben muss.

    • Ich dachte, die meisten dieser Dateikonvertierungsseiten seien im Grunde ffmpeg auf etwas wie nginx.
  • Leute sagen, ffmpeg sei kompliziert, aber auch mit einer schicken GUI wird es nicht wirklich einfacher. Kompliziert ist Videokompression an sich.
    Wenn es nicht wie ein klickbares Interface à la HandBrake Entscheidungen für einen trifft, kann vermutlich keine Software das wirklich einfacher machen.
    Ich bin mir nicht sicher, aber wenn man digitale Videocodierung und -kompression ausreichend detailliert gelernt hat, dürfte sich auch recht intuitiv anfühlen, was man in ffmpeg tun muss. Hat das tatsächlich schon jemand so gemacht?

    • Vor etwa 17 Jahren habe ich einmal DirectShow-Filter für Windows Mobile geschrieben, daher verstehe ich Codecs und Container ziemlich gut.
      Damals gab es Formate wie mkv oder Codecs wie HEVC noch nicht, aber das Konzept, Audio/Video über mehrere Filter zu manipulieren, ist hervorragend, und die meiste A/V-Konvertierungssoftware funktioniert so.
      Als ich anfing, die Manpages von FFmpeg zu lesen, sah ich die Zusammenhänge, und nach ungefähr einem Tag Herumprobieren konnte ich es benutzen.
      Dass ich die Kommandozeile mag und Manpages lese, könnte mir dabei geholfen haben.
  • ffmpeg ist mächtig, deshalb nutze ich es oft, aber die API-Struktur geht mir nicht in den Kopf. Ein LLM-Frontend wäre schön.

  • Gute Idee. FFmpeg dazu zu bringen, genau das zu tun, was man will, ist immer mühsam.
    ChatGPT war zwar hilfreich, aber nicht perfekt.

    • Dank ChatGPT sind die Argumente und Optionen vieler Kommandozeilen-Tools leichter zu verwenden geworden.
      Es war immer mühsam, sich OpenSSL-Optionen und -Argumente zu merken; inzwischen nutze ich dafür einfach GPT.
    • Dank ChatGPT ist ffmpeg wirklich zugänglicher geworden.
      Allerdings bleiben subtile Unterschiede zwischen Betriebssystemen ein kleines Problem.