953 Stimmen

Das Zuschneiden der Videos basierend auf der Start- und Endzeit unter Verwendung von ffmpeg

Ich habe versucht, das Video mit dem Start- und Endzeitpunkt des Videos mithilfe des folgenden Befehls zu schneiden

ffmpeg -ss 00:00:03 -t 00:00:08 -i movie.mp4 -acodec copy -vcodec copy -async 1 cut.mp4

Mit dem obigen Befehl möchte ich das Video von 00:00:03 bis 00:00:08 schneiden. Aber es schneidet das Video nicht zwischen diesen Zeiten, sondern schneidet stattdessen das Video mit den ersten 11 Sekunden. Kann mir jemand helfen, wie ich das lösen kann?

Bearbeiten 1:

Ich habe versucht, den folgenden Befehl zu verwenden, der von mark4o vorgeschlagen wurde

ffmpeg -i movie.mp4 -ss 00:00:03 -t 00:00:08 -async 1 cut.mp4

Aber es wurde der folgende Fehler angezeigt.

Der Encoder 'aac' ist experimentell, aber experimentelle Codecs sind nicht aktiviert.

Daher habe ich das -strict -2 in den Befehl hinzugefügt, d.h.

ffmpeg -i movie.mp4 -ss 00:00:03 -t 00:00:08 -async 1 -strict -2 cut.mp4

Jetzt funktioniert es gut.

30voto

y o Punkte 1113

Neue Antwort (schnell)

Sie können Bash für Sie rechnen lassen, und es funktioniert mit Millisekunden.

toSeconds() {
    awk -F: 'NF==3 { print ($1 * 3600) + ($2 * 60) + $3 } NF==2 { print ($1 * 60) + $2 } NF==1 { print 0 + $1 }' <<< $1
}

StartSeconds=$(toSeconds "45.5")
EndSeconds=$(toSeconds "1:00.5")
Dauer=$(bc <<< "(${EndSeconds} + 0.01) - ${StartSeconds}" | awk '{ printf "%.4f", $0 }')
ffmpeg -ss $StartSeconds -i input.mpg -t $Duration output.mpg

Dies wird, wie die alte Antwort, einen 15-Sekunden-Clip erzeugen. Diese Methode ist auch ideal, wenn Sie tief innerhalb einer großen Datei schneiden, da das Suchen nicht deaktiviert ist, im Gegensatz zur alten Antwort. Und ja, ich habe verifiziert, dass es framegenau ist.

HINWEIS: Die Startzeit ist INKLUSIVE und die Endzeit ist normalerweise EXKLUSIVE, daher das +0.01, um es inklusiv zu machen.

Wenn Sie mpv verwenden, können Sie millisekundengenaue Zeitcodes im OSD mit --osd-fractions aktivieren


alte Antwort mit Erklärung (langsam)

Um basierend auf Start- und Endzeit aus dem Quellvideo zu schneiden und nicht rechnen zu müssen, geben Sie die Endzeit als Eingabemöglichkeit und die Startzeit als Ausgabemöglichkeit an.

ffmpeg -t 1:00 -i input.mpg -ss 45 output.mpg

Dies wird einen 15-sekündigen Schnitt von 0:45 bis 1:00 erzeugen.

Dies liegt daran, dass, wenn -ss als Ausgabemöglichkeit angegeben wird, die verworfene Zeit immer noch in die Gesamtzeit einbezogen wird, die aus der Eingabe gelesen wird, die -t verwendet, um zu wissen, wann aufzuhören. Während wenn -ss als Eingabe Option angegeben ist, wird die Startzeit gesucht und nicht gezählt, daher kommt die Verwirrung.

Es ist langsamer als das Suchen, da das ausgelassene Segment noch verarbeitet wird, bevor es verworfen wird, aber dies ist meines Wissens nach der einzige Weg, es zu tun. Wenn Sie tief innerhalb einer großen Datei schneiden, ist es sinnvoller, einfach zu rechnen und -ss für die Eingabe zu verwenden.

7voto

dynamichael Punkte 669

Verwenden Sie -to anstelle von -t: -to gibt die Endzeit an, -t gibt die Dauer an

3voto

kakyo Punkte 8734

Meine Konfiguration:

$ ffmpeg
ffmpeg version 4.4 Copyright (c) 2000-2021 die FFmpeg-Entwickler
  erstellt mit Apple clang version 12.0.5 (clang-1205.0.22.9)

Ich habe festgestellt, dass die Reihenfolge der Schalter wichtig ist. Wenn -i nicht zwischen -ss und -t steht, habe ich etwa 3 Sekunden Führung in der Ausgabe.

Also, egal welche zusätzlichen Schalter du verwendest, stelle sicher, dass du diese drei Schalter in der richtigen Reihenfolge hast, wie hier:

ffmpeg -ss 00:00:03 -i film.mp4 -t 00:00:08 ausschnitt.mp4

3voto

user2023370 Punkte 9967

Ich war an Schnittzeiten basierend auf Millisekunden interessiert und stellte fest, dass Sekunden (und Bruchteile von ihnen) für den Schnitt wie folgt festgelegt werden können:

ffmpeg -i input.mp4 -ss 17.5 -to 20.5 output.mp4

Für eine Dauer anstelle einer Endzeit verwenden Sie -t anstelle von -to:

ffmpeg -i input.mp4 -ss 17.5 -t 3 output.mp4

1voto

Stan Punkte 62

Fühlen Sie sich frei, dieses Tool https://github.com/rooty0/ffmpeg_video_cutter zu verwenden, das ich vor einiger Zeit geschrieben habe. Im Grunde genommen handelt es sich um eine Befehlszeilenschnittstelle für ffmpeg... Sie müssen lediglich ein YAML erstellen, was Sie ausschneiden möchten... so ähnlich wie das hier

cut_method: löschen  # wir werden die folgenden Videofragmente aus einem Video löschen
Zeitrahmen:
  - von: start   # Warten auf Teilnehmer, die an der Konferenz teilnehmen
    bis: 4m
  - von: 10m11s  # Peinliche Stille
    bis: 15m50s
  - von: 30m5s   # Diskussion Off-Topic
    bis: Ende

und dann einfach das Tool ausführen, um das Ergebnis zu erhalten

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X