Schneiden mit ffmpeg führt zu wenigen Sekunden schwarzen Bildschirms. Wie behebe ich das?

8

Ich benutze diesen Befehl, um ein Segment aus einem Video von der Kommandozeile auszuschneiden

ffmpeg -i %1 -vcodec copy -acodec copy -ss %2 -t %3 %~n1_cut%~x1

und ich nenne es wie

cut.bat video.mp4 001:23:45:678 10

und wie erwartet bekomme ich eine video_cut.mp4 mit 10 Sekunden des Originalvideos. Das Problem ist, dass einige Sekunden der resultierenden Datei ein schwarzer Bildschirm mit Audio sind. Warum passiert das und wie behebe ich das?

irgendein Typ
quelle
% ~ n1_cut% ~ x1 Was bedeutet dieser Teil des Befehls?
ScipioAfricanus
@ScipioAfricanus %~n1erweitert% 1 zu einem Dateinamen oder, wenn nur ein Pfad vorhanden ist (ohne nachgestellten Backslash) - der letzte Ordner in diesem Pfad und %~x1erweitert% 1 nur zu einer Dateierweiterung - .txt source: superuser.com/questions/ 224416 /…
Shayan

Antworten:

8

Die meisten Videos verwenden Codecs, die eine zeitliche Komprimierung durchführen. Daher kann ein bestimmter Schnittpunkt davon abhängen, dass Frames vor (und nach) diesem Schnittpunkt korrekt decodiert werden. Wenn Sie also ffmpeg zum Trimmen von Videos und zum Verwenden des copyModus verwenden, muss ffmpeg alle Frames vor und nach dem zugeschnittenen Segment einschließen, die zum korrekten Dekodieren des Segments erforderlich sind.

Sie haben also zwei Möglichkeiten: Verwenden Sie den Kopiermodus, stellen Sie jedoch einen Schalter ein, mit dem alle Player diese Dateien korrekt abspielen können

ffmpeg -ss %2 -t %3 -i %1 -vcodec copy -acodec copy -avoid_negative_ts make_zero %~n1_cut%~x1

(Dies führt wahrscheinlich zu einer Ausgabe, die vor Ihrem Schnittpunkt beginnt.)

oder codieren Sie die Streams neu

ffmpeg -ss %2 -t %3 -i %1 %~n1_cut%~x1
Gyan
quelle
Obwohl die Neucodierung langsamer ist, werden bessere Ergebnisse erzielt, da das Video bei der anderen Lösung möglicherweise länger ist als in der -tOption angegeben.
Totymedli
@ Gyan Was macht %das? Ich habe versucht, ffmpeg.org/ffmpeg.html zu durchsuchen, aber ich kann die Verwendung nicht finden.
Shayan
Wie Ihre Antwort andeutete, habe ich beide -ssund -tvorher verwendet -iund es hat funktioniert, vorher habe ich nur -ssvorher -iund -tdanach gesetzt, also hat es nicht funktioniert.
Shayan
1

https://github.com/mifi/lossless-cut/pull/13

Wenn ich ffmpeg mit den Argumenten in dieser Reihenfolge -i ... -ss ... -t ... ausführe, wird eine Videodatei erstellt, die einige Sekunden lang kein Video enthält. (Soweit ich das verstehen kann, liegt das daran, dass kein Keyframe gesucht wird?)

Wenn ich die Reihenfolge in -ss ... -i ... -t ... ändere, werden die resultierenden geschnittenen Videos ordnungsgemäß abgespielt.

Meine ffmpeg -version

Gerard Wensink
quelle
Ich habe versucht , -ssvor , -iaber es hat nicht auf meine mp4 - Datei zu arbeiten.
Shayan
Hat für mich gearbeitet, danke. Nur die Reihenfolge der Parameter geändert. ffmpeg Version 3.2.12-1 ~ deb9u1
shukshin.ivan
Eigentlich verschiebt dies nur die leere Dauer zum Ende des Videos
Honghao Zhang