Videoschnitt mit ffmpeg
In diesem Tutorial wird gezeigt, wie man aus einer Multimediadatei Ausschnitte speichert. Es werden die Parameter t
, ss
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