Videoschnitt mit ffmpeg

In diesem Tutorial wird gezeigt, wie man aus einer Multimediadatei Ausschnitte speichert. Es werden die Parameter tss und map von ffmpeg anhand eines Praxisbeispiels erklärt.

Soll eine Videodatei an der Kommandozeile mit ffmpeg geschnitten werden, braucht man die Datei nicht erneut zu transcodieren, sondern kopiert die Streams ganz einfach.

Zum Schneiden benutzt man die Parameter t (Dauer) und ss (Offset). Mit dem Parameter map teilt man ffmpeg mit, welche Streams verwendet werden sollen.

t

Der Parameter t steuert die Dauer der zu verarbeitenden Datei. Wird dieser Parameter weggelassen, wird die Datei bis zum Ende verarbeitet.

  • -t 120
    Ausgabedatei wird 120 Sekunden lang
  • -t 3:14
    Ausgabe wird 3 Minuten und 14 Sekunden lang
  • -t 1:10:05.125
    Ausgabe wird 1 Stunde 10 Minuten 5 Sekunden und 125 Millisekunden lang

ss

Der Offset, also ab wann mit der Verarbeitung begonnen werden soll. Das Format von ss ist das selbe wie von t. Wird dieser Parameter weggelassen, wird die komplette Datei verarbeitet.

  • -ss 56
    Beginne ab der 56. Sekunde und verfahre bis zum Ende
  • -ss 1:30 -t 2:00
    Beginne ab 1 Minute 30 Sekunden mit einer Länge von 2 Minuten

map

Jede Videodatei kann mehrere Streams haben, nämlich Video, Audio, Untertitel (Subtitles) und Attachments. Um welche Streams es sich handelt, zeigt der Aufruf von

ffmpeg -i input.mkv -hide_banner

Der Parameter map nummeriert die einzelnen Streams der Videodatei. Damit teilt man ffmpeg mit, was mit welchem Stream geschehen soll. In dieser Anleitung geht es nur um Videoschnitt, also ist copy der Vorgang, den ffmpeg ausführen soll. Genausogut könnte man anstatt zu kopieren auch in ein anderes Format umwandeln oder eine beliebige Filterkette anwenden.

c:v

Die Videospur der Datei

c:a

Der (die) Audiospur(en)

c:s

Der (die) Untertitelspur(en)

Praxisbeispiel

Es liegt eine Videodatei vor, von der die ersten 56 Sekunden weggeschnitten werden sollen.

Zunächst feststellen, welche Spuren in der Datei vorliegen

ffmpeg -i input.mkv -hide_banner

Die Ausgabe zeigt 5 Streams an:

Stream #0:0: Video: h264 (High), yuv420p(progressive), 1920x1080,...
Stream #0:1(ger): Audio: ac3, 48000 Hz, 5.1(side), fltp, 640 kb/s (default)
Stream #0:2(eng): Audio: ac3, 48000 Hz, 5.1(side), fltp, 640 kb/s
Stream #0:3(ger): Subtitle: subrip (default) (forced)
Stream #0:4(eng): Subtitle: subrip

Also 1 Videostream, 2 Audiostreams und 2x Untertitel

Der Aufruf von ffmpeg lautet daher wie folgt:

ffmpeg -i input.mkv -ss 56\
-map 0:0 -map 0:1 -map 0:2 -map 0:3 -map 0:4\
-c:v copy -c:a:0 copy -c:a:1 copy -c:s:0 copy -c:s:1 copy\
-y -hide_banner output.mkv

Obiges Beispiel demonstriert die Verwendung von map mit ffmpeg. Möchte man die erste Audiospur zu mp3 umwandeln, würde statt -c:a:0 copy der Befehl zur Konvertierung stehen, ähnlich wie -c:a:0 libmp3lame -b:a 640k.

Da in diesem Tutorial nur geschnitten werden soll, werden alle Streams verwendet die in der Videodatei vorkommen, sodaß die Befehlskette von ffmpeg endlich lautet:

ffmpeg -i input.mkv -ss 56 -map 0 -c copy -y -hide_banner output.mkv