Skip to main content

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/

Zum Verständnis

MP4 ist ein weit verbreitetes Dateiformat für Videodateien, dabei handelt es sich lediglich um ein Container-Format. Das heißt, es kann mehrere Video und Audio-Streams mit unterschiedlichen Codecs beinhalten, jedoch wird nicht jeder beliebige Codec unterstützt. Ein anderes beliebtes Container-Format ist zum Beispiel WebM, welches hauptsächlich für Streaming-Inhalte verwendet wird und daher eher mit Streaming-Optimierten Codecs kompatibel ist.

Siehe auch Weit verbreitete Codecs.

Existierendes Audio/Video konvertieren/transcodieren

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 andersrum - 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.

36306965.png

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.

68845694.png

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

Siehe auch

FFmpeg - VP9 Encoding Guide

FFmpeg - H.264 Encoding Guide