ffmprovisr: Rezeptsammlung zum einfachen Erstellen von FFmpeg-Befehlen
(amiaopensource.github.io)- 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,ffplayundffprobeElemente 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
flacbehandelt, 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+fodercmd+fdie 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
ffmpegaufgerufen - Ein Befehl besteht in der Regel aus Paaren aus Flags und Werten
- In
-i input_file.extist-idas Flag zur Angabe der Eingabedatei, undinput_file.extist die Zieldatei - In
-c:v proresgibt-c:vdie Kodierung des Videostreams an, undproresist der zu verwendende Codec
- In
- Der Name der Ausgabedatei steht am Ende des Befehls und wird ohne eigenes Ausgabe-Flag einfach als Dateiname angegeben
ffmpegspeichert Video, währendffplayein 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 5und eine Ausgabedatei, während das FFplay-Beispiel kein-ibraucht
- Ein Beispiel zum Speichern von SMPTE-Bars ist
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
.mp4standardmäßig auf H.264-Kodierung gesetzt werden
- Zum Beispiel kann
"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
- Um unter macOS in den Downloads-Ordner zu wechseln, verwendet man
"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 copyentfernen, wenn man sicher ist, dass die Erweiterung automatisch mit dem richtigen Codec kodiert
- Man kann zuerst in einen passenden Codec transkodieren oder
"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
-nostdingesetzt werden, um das Standardverhalten für Interaktionen über die Standardeingabe zu überschreiben- Beispiel:
ffmpeg -nostdin -i input_file ...
- Beispiel:
- FFmpeg setzt Standardwerte für Codecs und Codec-Parameter automatisch anhand des Ausgabeformats
.avi: Audiomp3, Videompeg4.mkv: Audioac3, Video H.264.mov: Audio AAC, Video H.264.mp4: Audio AAC, Video H.264.mpg: Audiomp2, Videompeg1video.mxf: Audiopcm_s16le, Videompeg2video.wav: Audiopcm_s16le
- Ein Filtergraph ist eine Kombination aus Filternamen und Optionen nach
-vfoder-af-vfist ein Alias für-filter:v- Ein Beispiel für einen Videofilter ist
hflip, ein Beispiel für einen Audiofilteramerge - 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_complexverwendet 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:vwählt alle Videostreams der ersten Eingabedatei aus-map 0:3wählt den vierten Stream der ersten Eingabedatei aus-map 0:a:2wä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
- FFmpeg erkennt die Stream-Typen
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 0lassen 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 1und-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;
OriginatorReferenceist maximal 32 Zeichen lang
- Häufig verwendete Felder sind
- Beim Rewrapping von DV-Codec-Video in eine
.dv-Datei wird-f rawvideo -c:v copyverwendet, 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
0Proxy,1LT,2Standard,3HQ - Von FFmpeg unterstützte ProRes-Container sind QuickTime
.mov, Matroska.mkvund MXF.mxf
- Die ProRes-422-Profile sind
- Ein Beispiel für H.264-Transkodierung ist
-c:v libx264 -pix_fmt yuv420p -c:a aac- Der Standard für
libx264ist das Presetmediumund CRF 23 -pix_fmt yuv420plegt 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 +faststartergänzt - Ein Beispiel für höhere Qualität ist
-preset veryslow -crf 18; CRF 18 gilt oft als „visuell verlustfrei“
- Der Standard für
- Nvidia-GPU-basiertes H.264/H.265-Encoding verwendet
h264_nvencoderhevc_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 copyverwendet- Der Standard für
libx265ist das Presetmediumund CRF 28 - CRF 28 bei H.265 entspricht CRF 23 bei H.264; die Dateigröße kann etwa halb so groß sein
- Der Standard für
- Ein verlustfreies Beispiel für die Archivierung nutzt FFV1 Version 3 in einem Matroska-Container und erzeugt zusätzlich eine Eingabe-
framemd5-map 0mappt alle Streams-dnschließt Datenströme aus, die Matroska nicht erlaubt-slicecrc 1fügt CRC-Informationen hinzu, damit Decoder beschädigte Slices erkennen können-f framemd5 -anerzeugt 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 copyauch-anverwendet 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
yadifzu deinterlacen
- Das Display-Seitenverhältnis kann auf Containerebene mit Optionen wie
-aspect 4:3geändert werden- In Verbindung mit
-c:v copybeeinflusst das nicht das Seitenverhältnis in den kodierten Frames, sondern das im Container gespeicherte Seitenverhältnis
- In Verbindung mit
- Für Farbraumkonvertierung wird der Filter
colormatrix=src:dstverwendet- Zu den zulässigen Werten gehören
bt601,smpte170m,bt470bg,bt709,bt2020 - Zum Einbetten von Farbraum-Metadaten werden
-color_primaries,-color_trc,-colorspaceverwendet - Es ist Vorsicht geboten, da man einer tatsächlichen Rec.601-Datei auch Rec.709-Tags zuweisen kann
- Metadaten-Tags werden von
libx264oderlibx265geschrieben und können daher nicht ohne Re-Encoding hinzugefügt werden
- Zu den zulässigen Werten gehören
- Für Geschwindigkeitsänderungen werden
setptsundatempozusammen 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
fadeundafadeverwendet; wegen des Filtereinsatzes müssen Video und Audio neu kodiert werden - Zum Audio-Extrahieren wird mit
-c:a copy -vnder Audiostream verlustfrei ohne Video herausgezogen - Zum Zusammenführen von zwei Audiospuren werden
amergeund-filter_complexverwendet- 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
ffprobeauszuführen, um die gewünschten Spuren zu prüfen
- Für Lautheitsanalyse und -normalisierung wird der Filter
loudnormverwendet- 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 0ergänzt
- Zum Zusammenfügen von Dateien mit unterschiedlichen Dateiformaten oder Codecs werden der
concat-Filter und-filter_complexverwendet- 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
scaleangeglichen; beim Zusammenfügen von SD und HD kann SD mit Pillarboxing versehen werden
- Das Aufteilen von Dateien erfolgt mit dem Segment-Muxer
-segment_time 60erzeugt Segmente mit einer maximalen Länge von 60 Sekunden%03derzeugt Dateinamen mit dreistelliger, nullaufgefüllter Nummerierung
- Für Trimmen ohne Re-Encoding werden
-ss,-to,-t,-c copy,-map 0verwendet- Interframe-Codecs wie H.264 können am nächstgelegenen Punkt auf Basis eines I-Frames beginnen
-sseof -5kopiert ab 5 Sekunden vor dem Dateiende
- Zum Entfernen von Stille am Anfang einer Audiodatei wird
silenceremove=start_threshold=-57dB:start_duration=1:start_periods=1verwendet-57dBwird 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,areverseverwendet- Da
silenceremovebesser zum Entfernen von Stille am Anfang geeignet ist, wird das Audio umgedreht und danach wieder zurückgedreht
- Da
Verarbeitung von Interlaced-Video
- Beim Erstellen einer zugänglichen HD-H.264-Datei aus einer SD-NTSC-Quelle werden
yadif,scale,padundformat=yuv420pzusammen verwendetyadifist ein Deinterlacing-Filterscale=1440:1080:flags=lanczospasst das Bild auf 1440x1080 anpad=1920:1080:(ow-iw)/2:(oh-ih)/2fügt Padding hinzu, damit ein 4:3-Eingang in einen 16:9-Ausgabeframe passt
- Ein allgemeines Deinterlacing-Beispiel ist
-vf "yadif,format=yuv420p"format=yuv420plegt 4:2:0-Chroma-Subsampling für die H.264-Wiedergabekompatibilität fest- FFmpeg bietet neben
yadifauch die Deinterlacerbwdif,w3fdif,kerndeintundnnedi
- Für Deinterlacing mit Auftrennung von Feldern in Frames wird
idet,bwdif,format=yuv420pverwendet- Dies wird bevorzugt, um die visuelle Cadence der Quelle bei Interlaced-Video mit viel Bewegung zu erhalten
ideterkennt die Feldreihenfolgebwdifgibt standardmäßig für jedes Feld einen Frame aus
- Für Inverse Telecine wird
fieldmatch,yadif,decimateverwendet- 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=tffodersetfield=bffverwendet- Da ein Videofilter verwendet wird, kann
-c copynicht genutzt werden und eine Neuencodierung ist erforderlich
- Da ein Videofilter verwendet wird, kann
- 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
drawtexterzeugt- Dabei werden die Optionen
fontfile,fontsize,text,fontcolor,alpha,xundyfestgelegt x=(w-text_w)/2:y=(h-text_h)/2positioniert es unabhängig von der Videogröße mittig
- Dabei werden die Optionen
- Ein Bild-Wasserzeichen kann mit
overlay=main_w-overlay_w-5:5oben rechts platziert werden - Eingebrannter Timecode verwendet die Optionen
timecode,box,boxcolorundratevondrawtext- Der Start-Timecode hat das Format
hh:mm:ss[:;.]ff
- Der Start-Timecode hat das Format
- Zum Einbetten einer Untertiteldatei wird
-i subtitles_file -c copy -c:s mov_textverwendetmov_textfunktioniert in MP4- und MOV-Containern- Zulässige Formate im MKV-Container sind
ASS,SRTundSSA
- Ein einzelnes Thumbnail wird mit
-ss 00:00:20 -vframes 1 thumb.pngextrahiert - Um jede Minute ein Thumbnail zu erzeugen, wird
-vf fps=1/60 out%d.pngverwendet - Zum Erstellen eines GIF aus einer Bildsequenz werden
image2,-framerate,-pattern_type globundscaleverwendet - Ein hochwertiges GIF wird in zwei Schritten erzeugt
- Der erste Befehl erstellt mit
palettegeneine benutzerdefinierte Palette - Der zweite Befehl wendet die Palette mit
paletteusean - Die einfachere Methode ist
-vf "fps=10,scale=500:-1", aber dabei ist Dithering deutlicher sichtbar und die Dateigröße kleiner
- Der erste Befehl erstellt mit
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 v210verwendet- Die Standardbildrate des
image2-Demuxers beträgt 25fps %06dliest Dateinamen mit sechsstelliger Nummerierung in aufsteigender Reihenfolge
- Die Standardbildrate des
- Um aus Bild- und Audiodatei ein Video zu erzeugen, werden
-loop 1,-shortestund-vf scale=1280:720verwendet- Das kann nützlich sein, wenn man eine Audiodatei auf Plattformen wie YouTube hochladen möchte
- Mit
ffplay -f lavfiund Filtern lassen sich Audiobittiefe visualisieren, Dezibelgrafen anzeigen, Pixel außerhalb des Broadcast-Bereichs markieren und ein Vectorscope darstellen tblend=all_mode=difference128undhstackzeigen die zeitlichen Unterschiede zwischen zwei Eingabevideos nebeneinanderxstackwird verwendet, um ein Ausgabefenster zu erstellen, das mehrere Videoquellen vertikal oder horizontal stapelt, und ist für denselben Zweck nützlich wie das vonvrecordverwendete Ausgabefenster- Das OCR-Beispiel verwendet den Filter
ocrunddrawtext, 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 copyverwendet- Video und Audio werden kopiert, Metadaten jedoch nicht
- Batch-Verarbeitung in Bash erfolgt mit einer
.sh-Datei und einerfor-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
- Beispiel:
- 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.mkvgeändert wird - Damit
ffmpegohne vollständigen Pfad aufgerufen werden kann, muss es korrekt eingerichtet sein
- Das Beispiel erstellt eine Liste von
- 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 -anerzeugt - MD5 pro Audiosample-Gruppe wird mit
asetnsamples=n=48000 -f framemd5 -vnerzeugt- 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
-mapausgewählt und mit-c copy -f md5verarbeitet werden- Dies dient zur Prüfung der Integrität von A/V-Informationen unabhängig von Änderungen an Container-Metadaten
streamhashgibt 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 lavfiundsignalstats,cropdetect,idet,psnr,ssim,ebur128,astatsusw. 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
readeia608undffprobeHex-Werte als CSV aus
Testdateien und weitere FFmpeg-Beispiele
- Testvideos werden mit lavfi-Eingängen wie
mandelbrot,smptebars,testsrcodersmptehdbarserzeugt 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=1920x1080abgespielt - VGA-SMPTE-Bars werden mit
ffplay -f lavfi -i smptebars=size=640x480abgespielt
- Testaudio mit Sinuswelle erzeugt mit
sine=frequency=1000:sample_rate=48000:duration=5undpcm_s16leeine WAV-Datei - Ein Testvideo aus SMPTE-Bars und einem 1-kHz-Sinuston verwendet zwei lavfi-Eingänge sowie
-c:v ffv1und-c:a pcm_s16le - Eine beschädigte Testdatei verfälscht mit
-bsf noise=1 -c copyabsichtlich den Paketinhalt, ohne den Container zu beschädigen - Conway's Game of Life wird mit
ffplay -f lavfi life=...simuliert; mitffmpegund-t 5lässt sich ein Abschnitt speichern - Für den Vergleich der perzeptuellen Ähnlichkeit zweier Videos wird der Filter
signature=detectmode=full:nb_inputs=2verwendet - 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.extdirekt abgespielt werden, ohne zuerst ein Video zu erstellen - Audio- und Videospuren werden mit
-map 0:v:0und-map 0:a:0getrennt - Audio- und Videospuren werden mit
-map 0:v -map 1:a -c copyzusammengefü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.mpgerzeugt; dafür istdvdauthorerforderlich - CSV für die YDIF-basierte Szenenerkennung gibt mit
ffprobeund dem Wertlavfi.signalstats.YDIFaussignalstatsaus - 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=nameanzeigen- Beispiele sind
encoder=libx264,decoder=mp3,muxer=matroska,demuxer=mov,filter=crop
- Beispiele sind
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,cdda2wavundcdparanoia -vsQerfolgen - 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.wavverwendet-Bist 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
- Der Homebrew-Installationsbefehl lautet
- 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 -Jodercdparanoia -Qgeprüft - Um die Korrektur beim Rippen mit Cdda2wav anzuwenden, wird das Flag
-Thinzugefügt
- Das Vorhandensein wird mit
- ImageMagick ist eine freie Open-Source-Softwaresammlung zum Anzeigen, Konvertieren und Bearbeiten von Raster- und Vektorbilddateien
- Befehle werden als einzelne Kommandos wie
convert,montageundmogrifyaufgerufen - 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 *.jpgverwendet - Ein Bildraster wird mit
montage @list.txt -tile 6x12 -geometry +0+0 output_grid.jpgerstellt - EXIF wird mit
mogrify -path ./stripped/ -strip *.jpgentfernt
- Befehle werden als einzelne Kommandos wie
- Das Tool
flacist 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.wavverwendet - Um das ursprüngliche BWF aus FLAC wiederherzustellen, wird statt
--best--decodeverwendet
1 Kommentare
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.
https://ffmpeg.org/donations.html
Er hat auch QEMU, TCC, QuickJS usw. entwickelt.
Im Ernst: Die Zahl der Geräte, auf denen zu jedem beliebigen Zeitpunkt Code von ihm läuft, ist wirklich absurd.
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
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.
Aus unbekannten Gründen verhält sich ffmpeg unterschiedlich, je nachdem, ob man die Flags
-ssund-t/-tovor oder nach-isetzt; bei mir funktionierte es besser, sie davor zu setzen.Im Originaltext gibt es dasselbe Problem.
Es ist seltsam, einen nichtlinearen Graphen gewaltsam in eine flache, lineare Kommandozeile zu pressen.
Schon eine ausführlichere JSON-Konfiguration wäre viel besser.
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.
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.
Außerdem ist es für die Nutzung mit Plex ohne Transcoding auch in meinem Homelab einfacher.
Dieser Guide empfiehlt
yadifals 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.
Wenn man ohnehin neu encodiert, sollte man gleich bis zu QTGMC gehen.
w3fdif kann Flimmern erzeugen, yadif dagegen nicht; bwdif verhält sich daher wie yadif, nutzt aber das bessere Field Matching von w3fdif.
bwdifist ein Hybrid ausyadifundw3fdif.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.
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?
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.
Es war immer mühsam, sich OpenSSL-Optionen und -Argumente zu merken; inzwischen nutze ich dafür einfach GPT.
Allerdings bleiben subtile Unterschiede zwischen Betriebssystemen ein kleines Problem.