Ich habe versucht, das Video mithilfe der Start- und Endzeit des Videos mit dem folgenden Befehl 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 schneiden 00:00:08
. Es wird jedoch nicht zwischen diesen Zeiten das Video geschnitten, sondern das Video mit den ersten 11 Sekunden. Kann mir jemand helfen, wie man das löst?
Bearbeiten 1:
Ich habe versucht, mit dem folgenden Befehl zu schneiden, der von mark4o vorgeschlagen wird
ffmpeg -i movie.mp4 -ss 00:00:03 -t 00:00:08 -async 1 cut.mp4
Es wurde jedoch der folgende Fehler angezeigt.
Der Encoder 'aac' ist experimentell, aber experimentelle Codecs sind nicht aktiviert
-strict -2
Also habe ich das in den Befehl eingefügt, dh
ffmpeg -i movie.mp4 -ss 00:00:03 -t 00:00:08 -async 1 -strict -2 cut.mp4
Jetzt funktioniert es gut.
linux
video
ffmpeg
video-editing
Kalai
quelle
quelle
Antworten:
Sie haben wahrscheinlich keinen Keyframe an der 3-Sekunden-Marke. Da Nicht-Keyframes Unterschiede zu anderen Frames codieren, benötigen sie alle Daten, beginnend mit dem vorherigen Keyframe.
Mit dem mp4-Container ist es möglich, einen Nicht-Keyframe zu schneiden, ohne ihn mithilfe einer Bearbeitungsliste neu zu codieren. Mit anderen Worten, wenn der nächste Keyframe vor 3s bei 0s liegt, wird das Video ab 0s kopiert und der Player mithilfe einer Bearbeitungsliste angewiesen, 3 Sekunden später mit dem Spielen zu beginnen.
Wenn Sie das neueste ffmpeg von git master verwenden, wird dies mithilfe einer Bearbeitungsliste durchgeführt, wenn Sie mit dem von Ihnen angegebenen Befehl aufgerufen werden. Wenn dies bei Ihnen nicht funktioniert, verwenden Sie wahrscheinlich entweder eine ältere Version von ffmpeg oder Ihr Player unterstützt keine Bearbeitungslisten. Einige Player ignorieren die Bearbeitungsliste und spielen immer alle Medien in der Datei von Anfang bis Ende ab.
Wenn Sie genau ab einem Nicht-Keyframe schneiden möchten und es ab dem gewünschten Punkt auf einem Player abspielen möchten, der keine Bearbeitungslisten unterstützt, oder sicherstellen möchten, dass sich der ausgeschnittene Teil nicht tatsächlich in der Ausgabedatei befindet (z. B.) Wenn es vertrauliche Informationen enthält, können Sie dies tun, indem Sie neu codieren, sodass genau zum gewünschten Startzeitpunkt ein Keyframe vorhanden ist. Die Neucodierung ist die Standardeinstellung, wenn Sie nichts angeben
copy
. Zum Beispiel:Bei der Neucodierung möchten Sie möglicherweise auch zusätzliche qualitätsbezogene Optionen oder einen bestimmten AAC-Encoder hinzufügen. Weitere Informationen finden Sie im x264-Codierungshandbuch von ffmpeg für Video und im AAC-Codierungshandbuch für Audio.
Außerdem gibt die
-t
Option eine Dauer und keine Endzeit an. Der obige Befehl codiert 8 Sekunden Video ab 3 Sekunden. Um bei 3s zu beginnen und bei 8s zu enden, verwenden Sie-t 5
. Wenn Sie eine aktuelle Version von ffmpeg verwenden Sie auch ersetzen können-t
mit-to
in dem obigen Befehl zu Ende zu der angegebenen Zeit.quelle
-t
/-to
und sein Argument weg , um bis zum Ende fortzufahren.-ss
VOR der Eingabedatei (vorher-i
) zu liefern , da ffmpeg auf diese Weise direkt zum Speicherort springt. Dadurch wird jedoch auch die Zeit "Null" für diesen Ort festgelegt, was bedeutet, dass-to
auf die falsche Zeit verwiesen wird. Quelle: trac.ffmpeg.org/wiki/Seekingffmpeg -i movie.mp4 -ss 00:00:03 -t 00:00:08 -async 1 cut.mp4
, tritt ein Problem mit der Audio- und Videosynchronisierung auf , obwohl die Originaldatei kein solches Problem aufweist.-async 1
.Versuchen Sie dies zu verwenden. Es ist der schnellste und beste ffmpeg-Weg, den ich herausgefunden habe:
Dieser Befehl schneidet Ihr Video in Sekunden!
Ich habe es in meinem Blog hier erklärt :
Das Timing-Format lautet: hh: mm: ss
Bitte beachten Sie, dass die derzeit hoch bewertete Antwort veraltet ist und das Trimmen extrem langsam wäre. Weitere Informationen finden Sie in diesem offiziellen ffmpeg- Artikel .
quelle
ffmpeg -ss 00:01:00 -to 00:02:00 -i input.mp4 -ss 00:01:00 -to 00:02:00 -c copy output.mp4
. Jetzt ist das Überspringen jedoch unterbrochen und die Endzeit ist nicht korrekt (in meinem Fall).Verwenden Sie -c copy, um sofort zu erstellen. In diesem Fall wird ffmpeg das Video nicht neu codieren, sondern nur auf die entsprechende Größe zuschneiden.
quelle
ffmpeg -i movie.mkv -vcodec copy -acodec copy converted_movie.mp4
und umgekehrtLass alles außer von Sekunde 3 bis Sekunde 8 fallen.
quelle
setpts=PTS-STARTPTS
Filters nach dem Trimmfilter behoben.-strict -2
vorcut.mp4
(im Gegensatz zu dem Ende der Befehlszeile im Gegensatz)?Geben Sie die Endzeit als Eingabeoption und die Startzeit als Ausgabeoption an, um basierend auf der Start- und Endzeit des Quellvideos zu schneiden und keine Berechnungen durchführen zu müssen .
Dies ergibt einen 15-Sekunden-Schnitt von 0:45 bis 1:00.
Dies liegt daran
-ss
, dass die verworfene Zeit, wenn sie als Ausgabeoption angegeben wird, immer noch in der Gesamtzeit enthalten ist, die von der Eingabe gelesen wird, um-t
zu wissen, wann zu stoppen ist. Wenn-ss
als Eingabemöglichkeit angegeben wird , wird die Startzeit gesucht und nicht gezählt , weshalb die Verwirrung entsteht.Es ist langsamer als das Suchen, da das ausgelassene Segment noch verarbeitet wird, bevor es verworfen wird, aber dies ist meines Wissens die einzige Möglichkeit, dies zu tun. Wenn Sie aus einer großen Datei herausschneiden, ist es vorsichtiger, nur zu rechnen und
-ss
für die Eingabe zu verwenden.quelle
Folgendes verwende ich:
Generierte
mp4
Dateien können auch in verwendet werdeniMovie
.Referenz: https://www.arj.no/2018/05/18/trimvideo
Wenn Sie mehrere Schnittszenen verketten möchten, können Sie das folgende Skript verwenden:
quelle
Verwenden Sie -to anstelle von -t: -to gibt die Endzeit an, -t gibt die Dauer an
quelle
Obwohl ich 6 Jahre zu spät bin, denke ich, dass alle obigen Antworten die Frage, die @kalai stellt, nicht richtig beantwortet haben . Das folgende Bash-Skript verarbeitet eine Textdatei im folgenden Format:
zum Beispiel
und durchlaufen Sie die Datei, laden Sie die
youtube-dl
unterstützte Datei herunter , berechnen Sie die Dauer zwischenstart_time
undend_time
und übergeben Sie sie anffmpeg
, da-t
es sich tatsächlich um die Dauer handelt , nicht um die tatsächlicheend_time
Schlagen Sie mich, wenn Sie Fragen haben.
quelle