Ausschnitt aus der Videodatei von der Startposition zur Endposition mit FFmpeg [duplizieren]

143

Diese Frage hat hier bereits eine Antwort:

Ich habe eine 30-minütige Videodatei, möchte jedoch ein Video von 00:09:23 bis 00:25:33 extrahieren.

Ich kann die Startposition mit definieren -ss, aber ich konnte keine für die Endposition finden. Irgendeine Hilfe bitte?

x74x61
quelle

Antworten:

244

Installieren Sie ffmpeg

Stellen Sie sicher, dass Sie eine aktuelle Version von herunterladenffmpeg , und verwenden Sie nicht die mit Ihrer Distribution gelieferte (z. B. Ubuntu). Paketversionen von verschiedenen Distributionen sind häufig veraltet und verhalten sich nicht wie erwartet.

Oder kompilieren Sie es selbst .

So schneiden Sie ein Video, ohne es neu zu codieren

Verwenden Sie dies, um Videos zu schneiden von [start]für [duration]:

ffmpeg -ss [start] -i in.mp4 -t [duration] -c copy out.mp4

Hier bedeuten die Optionen Folgendes:

  • -ssgibt die Startzeit an, zB 00:01:23.000oder 83(in Sekunden)
  • -t Legt die Dauer des Clips fest (gleiches Format).
  • Recent ffmpeghat auch ein Flag, mit dem die Endzeit angegeben werden kann -to.
  • -c copykopiert den ersten Video-, Audio- und Untertitel-Bitstream von der Eingabe in die Ausgabedatei, ohne sie neu zu codieren. Die Qualität wird dadurch nicht beeinträchtigt, und der Befehl wird innerhalb von Sekunden ausgeführt.

So schneiden Sie ein Video mit Neukodierung

Wenn Sie diese -c copyOption weglassen, ffmpegwerden das ausgegebene Video und Audio automatisch entsprechend dem von Ihnen gewählten Format neu codiert. Lesen Sie für qualitativ hochwertiges Video und Audio die x264-Codierungsanleitung bzw. die AAC-Codierungsanleitung .

Zum Beispiel:

ffmpeg -ss [start] -i in.mp4 -t [duration] -c:v libx264 -c:a aac -strict experimental -b:a 128k out.mp4
slhck
quelle
1
Am Ubuntu 12:10 funktionierten -c: v und -c: a nicht. Ich musste stattdessen "-acodec copy und -vcodec copy" verwenden.
Samuel Lampa
1
@Samuel Dann benutzt du eine veraltete Version, die nicht mal echtes FFmpeg ist, sondern die Libav-Fork. Siehe: stackoverflow.com/a/9477756/1109017
slhck
Danke dafür! Wenn Sie keine Dauer angeben, endet diese dann?
Jeff
@ Jeff Ja! (Zeichen Minimum)
Slhck
3
@Prateek Wenn Sie den Video-Bitstream kopieren (anstatt neu zu codieren), können Sie nur bei Keyframes schneiden . Wenn Keyframes in den Sekunden 1, 2 und 3 vorhanden sind, Sie jedoch in der Sekunde 1,5 schneiden möchten, wartet ffmpeg bis zur Sekunde 2, bevor der Schnitt gestartet werden kann. Das macht es ungenau.
Slhck
26

Ich denke, Sie können jetzt den folgenden Befehl verwenden.

ffmpeg -i inputFile -vcodec copy -acodec copy -ss 00:09:23 -to 00:25:33 outputFile

Schauen Sie sich auch ffmpeg Doc oder diese Wiki-Seite an .

sflee
quelle
6
ffmpeg -i inputFile -c copy -ss 00:09:23 -to 00:25:33 outputFileeinfachere Version
nwgat
3
Ich musste ffmpeg -ss 00:01:00 -i video.mp4 -to 00:02:00 -c copy -copyts cut.mp4Version (mit -copyts) verwenden, sonst schnitt es falsch (mit schwarzem Bildschirm am Anfang). Vielen Dank für den 2. Link.
Necronomicron
Das ist großartig, das letzte, was ich wollte, war die Berechnung der Dauer von Endpunkten.
Tomasz Gandor
Die Option -to beantwortet die tatsächlich gestellte Frage. Die restlichen Antworten sind entweder unverschämt oder veraltet.
James Bowery
12

Das ist seltsam, dass niemand den trim Filter vorgeschlagen hat .

Lasse alles außer der zweiten Minute der Eingabe fallen:

ffmpeg -i INPUT -vf trim=60:120

Behalte nur die erste Sekunde:

ffmpeg -i INPUT -vf trim=duration=1

Lasse alles außer von Sekunde 13 auf Sekunde 58 fallen:

ffmpeg -i INPUT -vf trim=13:58 OUTPUT
malat
quelle
8
Ja, gut zu erwähnen trimund atrim. Ich verwende diese normalerweise beim Filtern, aber Benutzer sollten beachten, dass beim Filtern eine Neukodierung erforderlich ist .
Logan
Sie sind mein Held. Ich brauchte dringend einen Filter, der dies tat.
Fahadash
5

Sie können diese beiden Methoden verwenden, die für Windows und Linux funktionieren.

Es gibt zwei Möglichkeiten, wie Sie Videodateien mit ffmpeg aufteilen können. Der erste ist an sich gut, mehr als das - er ist schneller, erzeugt aber manchmal Ausgabedateien mit bestimmten Fehlern. In diesen Fällen gibt es also die zweite Möglichkeit, Videodateien zu teilen: Es ist erheblich langsamer, die Ausgabedateien sind größer, aber anscheinend haben sie immer die gleiche Qualität wie die verwendeten Eingabedateien.

Weg 1:

ffmpeg -ss <start> -i in1.avi -t <duration> -c copy out1.avi

Weg 2:

ffmpeg -ss <start> -i in1.avi -t <duration> out1.avi
  • <start>- der anfang des teils eines videofmpegs ist das ausschneiden. Format:, 00:00:00.0000dh Stunden: Minuten: Sekunden: Millisekunden.

  • <duration>- Die Dauer des Teils eines Videofmpegs ist auszuschneiden. Gleiches Format wie oben.

Beispiele:

ffmpeg -ss 01:19:00 -i in1.avi -t 00:05:00 -c copy out1.avi
ffmpeg -ss 01:19:00 -i in1.avi -t 00:05:00 out1.avi

ffmpeg schneidet einen Teil der Videodatei ab 1 Stunde 19 Minuten 0 Sekunden aus. Die Dauer der ausgeschnittenen Videosequenz beträgt 5 Minuten 0 Sekunden.

Christian Wörz
quelle
Ok, danke. Werde morgen die Dokumente durchsehen und es versuchen.
juGGaKNot
3
-sameqbedeutet nicht "gleiche Qualität" und wurde aus ffmpeg entfernt. Verwenden Sie -codec copystattdessen. Vergessen Sie auch nicht die -toOption.
Logan
Ich habe die Befehle in Ihrem Zitat korrigiert, da sie ziemlich veraltet waren. Bitte kopieren und fügen Sie keine Informationen ein, ohne sie richtig zu zitieren.
Slhck
-1

Sie können dies verwenden

ffmpeg -sameq -ss clip_start -t duration  -i  original.ogg  clip.ogg

Hier muss die Dauer des Videos angegeben werden. dh 00: 25: 33-00: 09: 23

daya
quelle
1
Wie ich in der anderen Antwort erwähnt habe: Mit Ihrem Befehl codieren Sie die Datei neu, was absolut nicht erforderlich ist und zu einer verminderten Qualität und einer längeren Verarbeitungszeit führt.
Slhck
-2

Ich benutze die folgende Syntax, um Videos mit ffmpef zu schneiden:

ffmpeg -sameq -ss [start_seconds] -t [duration_seconds] -i [input_file] [outputfile]

-t wird verwendet, um die Dauer in Sekunden festzulegen. Sie können die Endzeit nicht angeben, dies sollte jedoch für Sie funktionieren.

Michael Banzon
quelle
1
Warum stellen Sie FFmpeg so ein, dass die Datei neu codiert wird? Beachten Sie, dass dies -sameqüberhaupt nicht "gleiche Qualität" bedeutet.
Slhck