FFmpeg
FFmpeg ist ein Kommandozeilen-Tool zur Verarbeitung von Video- und Audiodateien. Out of the Box enthält es bereits zahlreiche Codecs und unterstützt 4K, High Refresh Rate und HDR-Inhalte. Nicht im Standard dabei sind Codecs für Stereoskopische 3D-Inhalte, wie z.B. die 3D-Erweiterung MVC für H.264.
Offizielle Website: https://www.ffmpeg.org/
Download für Windows (da eigentlich Linux-Tool): https://ffmpeg.zeranoe.com/builds/
Verständnis: Codecs und Container
Siehe: Codecs und Container
Existierendes Audio/Video konvertieren/transkodieren
Um ein bestehendes Video zu verarbeiten wird immer eine Eingangs- und Ausgangsdatei angegeben. Für die meisten Vorgänge muss das Video neu codiert (transcodiert) werden, was je nach Rechnerleistung und Länge/Qualität des Videos eine Weile dauern kann (einige Grafikkarten unterstützen Hardware-Encoding für den ein oder anderen Codec). Wenn ein Video nur geschnitten wird, muss es in der Regel nicht neu codiert werden.
Achtung: Je nach Auflösung, FPS und Anzahl der Audio-Kanälen des resultierenden Videos sollte die Video und Audio-Bitrate entsprechend darauf angepasst werden (Parameter "-b:v" für Video, "-b:a" für Audio). Sonst verschwendet man unnötig Speicherplatz oder andersherum - wertvolles Bildmaterial geht verloren und das Video wird sehr "matschig". Siehe dazu Optimale Bitraten.
Beispiel 1: Anderer Codec, gleiche Auflösung
ffmpeg.exe -i "input_file.mp4" -c:v libx264 -b:v 8000K -c:a aac -b:a 256K "output_file.mp4"
Dies konvertiert den Video ("-c:v") und Audio-Codec ("-c:a") einer existierenden MP4-Datei in H.264 und AAC. Hier sollte immer die Bitrate ("-b:v" und "-b:a") mit angegeben werden. Siehe auch Optimale Bitraten.
Mit Hardware Encoding (sofern unterstützt).
ffmpeg.exe -i "input_file.mp4" -c:v h264_nvenc -b:v 8000K -c:a aac -b:a 256K "output_file.mp4"
In diesem Beispiel mit dem NVIDIA Encoder.
Beispiel 2: Anderer Codec, andere Auflösung und FPS
ffmpeg.exe -i "input_file.mp4" -s 1920x1080 -c:v libx264 -b:v 8000K -c:a aac -b:a 256K -r 30 "output_file.mp4"
Hier ist nur der Parameter "-s 1920x1080" und "-r 30" hinzugekommen.
Achtung: Optimale Bitraten sind zu beachten!
Beispiel 3: Nur schneiden
ffmpeg.exe -i "input_file.mp4" -ss 00:00:10.000 -t 00:01:40.000 -c copy "output_file.mp4"
Dieses Beispiel schneidet ein Video ohne es neu codieren zu müssen (die Eigenschaften der Quelldatei werden 1:1 übernommen).
Achtung: Der Parameter "-ss" bestimmt den Startzeitpunkt als zeitliche Position aus der Quelldatei, während der Parameter "-t" die Dauer des resultierenden Videos angibt. In diesem Beispiel ist das fertige Video also 1 Minute und 40 Sekunden lang.
Beispiel 4: Audiodateien konvertieren / transcodieren
ffmpeg.exe -i "input_file.flac" -c:v copy -c:a aac -b:a 256K "output_file.m4a"
Parameter "-c:v copy" wird verwendet um Video-Streams einfach aus der Quelldatei zu übernehmen (da Cover-Bilder oft als eigener Stream eingebettet werden, dient es hierbei zur Übernahme der Metadaten).
M4A-Dateien sind eigentlich MP4-Dateien ohne Video-Stream. M4A-Dateien können verschiedene Audio-Codecs zusätzlich mit Metadaten (Cover-Bild, Titel, Interpreten, etc.) enthalten.
Beispiel 5: Downmixing Audiokanäle
ffmpeg.exe -i "input_file.mp4" -c:v copy -ac 2 -c:a aac -b:a 256K "output_file.mp4"
FFmpeg kann auch mit dem Parameter "-ac" Audiokanäle zusammenfassen (man spricht hierbei von Downmixing), z.B. um 5.1 nach Stereo umzuwandeln.
Downmix-Beispiel von 5.1 nach Stereo, LFE (Subwoofer) Signale werden verworfen.
Achtung: Je nach Anzahl der Audiokanäle sind auch hier wieder Optimale Bitraten zu beachten!
Beispiel 6: Transcodieren, Audio einfügen, Schneiden & Fade-Out Effekt
Viel Spaß damit ;)
ffmpeg -i DJI_0087.MP4 -i Blink.flac -map 0:v -map 1:a -c:v libvpx-vp9 -b:v 5M -vf "fade=t=out:st=190:d=4" -c:a libopus -b:a 192K -t 00:03:14.000 49.180950_9.257964_music.webm
Es werden zwei Input Dateien angegeben. DJI_0087.MP4 ist ein reines Video (komplett ohne Audio Track) und Blink.flac ist Audio. Beide werden mittels den -map
Optionen zusammengefügt.
Das Resultierende Video ist nicht länger als 3 Minuten und 14 Sekunden (-t 00:03:14.000
).
Mittels -vf "fade=t=out:st=190:d=4"
wird ein Fade-Out Effekt zum Schluss des Videos (bei Sekunde 190) für 4 Sekunden angewendet.
Constant Rate Factor
Mithilfe des Constant Rate Factor Parameters lässt sich auf einfachere Art und Weise die resultierende Videoqualität bestimmen, als mit dem Bitraten-Parameter ("-v:b").
Grundsätzlich gilt: Ein geringer Wert erzeugt qualitativ bessere Videos (und somit auch größere Dateien), jedoch kommt es auch auf den verwendeten Videocodec an.
Parameter "-crf XX"
x264: Kleinstmöglicher Wert: 0; Größtmöglicher Wert: 51
The range of the quantizer scale is 0 - 51. Where 0 is lossless, 23 is default, and 51 is worst possible. A lower value is a higher quality and a subjectively sane range is 18-28. Consider 18 to be visually lossless or nearly so. It should look the same or nearly the same as the input but it isn't technically lossless.
vpx: Kleinstmöglicher Wert: 4; Größtmöglicher Wert: 63
By default the CRF value can be from 4 - 63 and 10 is a good starting point. Lower values mean better quality.
Beispiel H.264
ffmpeg -i input.mp4 -c:v libx264 -crf 28 -c:a aac -b:a 192k output.mp4
H.264 Preset
Der Preset-Parameter für den H.264 Codec gibt an, wie stark ein Video komprimiert werden soll. Stärkere Komprimierungen benötigen mehr Zeit beim Codiervorgang.
Wenn eine bestimmte Dateigröße erreicht werden soll (konstante Bitrate), wird mit einer langsameren Voreinstellung eine bessere Qualität erzielt.
Ähnlich verhält es sich bei der Codierung mit konstanter Qualität: Es wird Bitrate eingespart, wenn eine langsamere Voreinstellung gewählt wird.
Bessere Komprimierung, kleinere Datei (-preset veryslow)
ffmpeg -i input.mp4 -c:v libx264 -crf 28 -preset veryslow -c:a aac -b:a 192k output.mp4
Schnellere Kodierung, größere Datei (-preset ultrafast)
ffmpeg -i input.mp4 -c:v libx264 -crf 28 -preset ultrafast -c:a aac -b:a 192k output.mp4
Two Pass Video Encoding
Two Pass Video Encoding wird verwendet, um eine bestimmte Dateigröße möglichst genau zu erreichen.
Beim 2 Pass Video Encoding muss FFmpeg zwei mal hintereinander ausgeführt werden. Der Erste Durchlauf erzeugt eine Log-Datei, welche Informationen über die benötigte Bitrate eines Videoabschnitts enthält. Im zweiten Durchlauf werden diese Informationen genutzt um für die angepeilte Bitrate die bestmögliche Videoqualität zu erziehlen.
Beispiel VP9 (libvpx-vp9)
Two-Pass ist die empfohlene Codierungsmethode für libvpx-vp9, da einige qualitätsverbessernde Codierungsfunktionen nur im 2-Pass-Modus verfügbar sind.
Pass 1
ffmpeg.exe -y -i input.mp4 -c:v libvpx-vp9 -b:v 0 -crf 38 -pass 1 -an -f null dummy
Pass 2
ffmpeg.exe -i input.mp4 -c:v libvpx-vp9 -b:v 0 -crf 38 -pass 2 -c:a libopus -b:a 192K output.webm
Beispiel H.264 (libx264)
Beim x264 Encoder ist CRF in Kombination mit 2 Pass Encoding nicht kompatibel.
Pass 1
ffmpeg -y -i input.mp4 -c:v libx264 -b:v 2600K -pass 1 -an -f null dummy
Pass 2
ffmpeg -i input.mp4 -c:v libx264 -b:v 2600K -pass 2 -c:a aac -b:a 192k output.mp4
No Comments