Kann ich Kopieren und Kodieren in einem Vorgang kombinieren, um einen präzisen und schnellen Schnitt zu erhalten?

Kann ich Kopieren und Kodieren in einem Vorgang kombinieren, um einen präzisen und schnellen Schnitt zu erhalten?

Ich habe viele Video-Cutter mit ffmpeg ausprobiert und sie haben alle das gleiche Problem: Schnelles Anpassen ist ohne Neucodierung nicht genau. Ich habe viele Lösungen in meiner eigenen App ausprobiert, aber nichts funktioniert so, wie ich es brauche. Ich habe also diese Idee, um dieses Problem zu beheben: Angenommen, ich möchte ein neues Video generieren, das die Chuck-Starts bei t1 bis t2 nicht enthält. Ich möchte, dass ffmpeg dies tut, um das Segment (t1, t2) in 3 Teile zu unterteilen:

  1. ein Teil (t1-x, t1+y), der ein vollständig codierter Block ist, der neu codiert werden sollte, um den Teil (t1, y) exakt kopieren zu können.
  2. ein Teil (t2-z, t3+w), der ein vollständig codierter Block ist, der neu codiert werden sollte, um den Teil (z, t2) exakt kopieren zu können.
  3. einen Mittelteil (y, z), der komplette codierte Blöcke enthält und unverändert kopiert werden kann.

Fügen Sie dann die 3 Teile zusammen, die sich aus den obigen Schritten ergeben. Beachten Sie, dass die ersten beiden Teile voraussichtlich klein sein werden (und einer oder beide können die Länge Null haben), sodass der Neucodierungsprozess schnell sein wird. Dadurch können wir mit etwas langsamerem Betrieb exakte Schnitte erzielen, die aber immer noch viel schneller sind als die Neucodierung des gesamten Videos. Es kann sogar noch schneller sein, wenn wir mit einem Befehl mehrere Schnitte durchführen können, sodass wir die Frames einmal durchlaufen.

Kann ich das also heute mit ffmpeg machen? Oder kann ffmpeg das bald unterstützen? Ich hoffe, dass jemand das anwenden und uns sagen kann, wie, oder jemanden aus dem ffmpeg-Team erwähnen oder es ihnen auf jeden Fall übermitteln kann.

Antwort1

Ffmpeg unterstützt das Schneiden von Keyframes mithilfe des ssParameters, aber seine Position ist von entscheidender Bedeutung.

Beispiel für die Keyframe-Suche:

ffmpeg -ss 30 -i input_vid.mp4 -t 60 -c copy output_clip.mp4

Beispiel für die Suche nach allen Frames:

ffmpeg -i input_vid.mp4 -ss 30 -t 60 -c copy output_clip.mp4

Der -copyParameter ist hier wichtig, da er bewirkt Streamkopie. In einigen Fällen müssen Sie den Parameter hinzufügen -noaccurate_seek.

Weitere Informationen finden Sie unter:


Die meisten Videos verwenden Codecs, die eine zeitliche Komprimierung durchführen. Daher kann ein angegebener Schnittpunkt von den Frames vor (und nach) diesem Schnittpunkt abhängen, um korrekt dekodiert zu werden. Wenn Sie also ffmpeg verwenden, um Videos mit diesem copyModus zu trimmen, muss ffmpeg alle Frames vor und nach dem getrimmten Segment einschließen, die zum korrekten Dekodieren des Segments erforderlich sind. Dies kann zu einem schwarzen Anfangssegment führen.

Um den Kopiermodus weiterhin zu verwenden, aber das schwarze Segment zu vermeiden, müssen Sie den Schalter einstellen -avoid_negative_ts.

verwandte Informationen