Einen Zeitabschnitt ausschneiden

Einen Zeitabschnitt ausschneiden

Ich habe über das Schneiden und Spleißen gelesen mitVerkettungaber das ist mir nicht genug.

Ich möchte markierte Videoteile ausschneiden und ohne erneute Kodierung zu einer einzigen Videodatei zusammenfügen. Ist das Ausschneiden und Zusammenfügen (im Speicher) in einem Schritt möglich?

Es sollte keine theoretische Begrenzung für die Anzahl der zu schneidenden oder zusammenzufügenden Videoteile geben. Der Ton sollte synchron sein.

Video: H.264+AAC

Bearbeiten:

Aus den Antworten habe ich erfahren, dass eine erneute Videokodierung noch immer erforderlich ist.

Ich möchte klarstellen, dass das Ausschneiden von Videoclips aus der Mitte einer Videodatei in mehreren Schritten erfolgen kann. Ich dachte, dass die Verarbeitung des Videos in einem Durchgang leistungsmäßig besser wäre, da dadurch einige E/A-Aktivitäten eingespart würden. Dies ist jedoch kein eigenständiges Ziel.

Antwort1

Ihre Frage besteht, wenn ich sie richtig verstanden habe, aus vier Hauptteilen:

  • So schneiden Sie ein Zeitsegment aus einem Film
  • So führen Sie mehrere Segmente zusammen
  • So führen Sie die oben genannten Schritte aus, ohne den Film zu transkodieren und somit an Qualität zu verlieren
  • Wie Sie das oben genannte schnell und effizient erledigen können

Einen Zeitabschnitt ausschneiden

Sie können ein Segment ausschneiden, indem Sie mit der Option zu seinem Startpunkt springen -ssund dann entweder die Dauer des Segments mit -toder den Endpunkt mit festlegen -to:

# skip 30 seconds, then copy the next 60 seconds
ffmpeg -ss 30 -t 60 full-movie.mp4 segment.mp4

In der ffmpeg-Dokumentation finden Sie den Abschnitt5.4 Hauptoptionenbezüglich des Unterschieds zwischen der Platzierung der Optionen -ssund -tvor der Eingabedatei oder vor der Ausgabedatei. Wenn Sie damit experimentieren, werden Sie möglicherweise feststellen, dass dieser Unterschied in Ihrem Fall relevant ist.

Wichtiger Hinweis: Im obigen Beispiel wird das Video transkodiert. Weiter unten besprechen wir die Möglichkeit, dies ohne Transkodierung zu tun.

Mehrere Segmente zusammenführen

Es gibt drei grundlegende Methoden zum Zusammenführen von Filmen. Zwei davon werden in diesem Artikel am besten erklärt.ffmpeg-Wiki-Artikelund das dritte ist dasConcat-Demuxer. Wenn alle Ihre Segmente hinsichtlich der A/V-Kodierungsspezifikation und des Containerformats identisch sind, ist das folgende concat:Protokoll wahrscheinlich die einfachste Methode:

# merge the segments
ffmpeg -i "concat:seg1.mp4|seg2.mp4|seg3.mp4" final.mp4

Es ist wichtig zu beachten, dass diese Zusammenführung, wie auch das Schneiden, den Film erneut transkodiert, sodass wir hier eine Transkodierung einer Transkodierung haben, was möglicherweise die Videoqualität verschlechtert.Wirklichmöchten diese Transkodierung so weit wie möglich vermeiden!

Schneiden und Zusammenfügen ohne Transkodierung

Der Grund, warum die Beispiele in den vorherigen Abschnitten eine Transkodierung erfordern, liegt darin, dass jede Datei und jedes resultierende Segment ein eigenständiger Film ist, der so gepackt wurde, dass er alle Dinge enthält, die Sie erwarten, wenn Sie einen ganzen Film öffnen, wie etwa die Dauer des Films und andere Metadaten. Aber hey, Sie möchten diese nicht als eigenständige Filme abspielen, sondern diese Segmente sollen Teil eines größeren Videostreams werden. Anstatt also ffmpeg mit verpackten Filmen zu versorgen, sollten Sie die Eingabedateien besser neu verpacken – remuxen – und in einen Echtzeit-Streaming-Container umwandeln und Header-Sachen vergessen, die Sie an dieser Stelle nicht wirklich brauchen. Im Fall von H.264 heißt das Streaming-Mux-Format MPEG-TS, und so remuxen Sie Ihren Stream, ohne ihn zu transkodieren:

# re-muxing the whole movie (see a better option in next example)
ffmpeg -i full-movie.mp4 -c:v copy -c:a copy -bsf:v h264_mp4toannexb full-movies-as-ts.ts

Nun, da Sie schon dabei sind, können Sie die Gelegenheit auch gleich nutzen, um nur das Segment auszuschneiden, das Sie benötigen:

# skip 30 seconds and re-mux a 60 seconds segment
ffmpeg -ss 30 -t 60 -i full-movie.mp4 -c:v copy -c:a copy -bsf:v h264_mp4toannexb segment.ts

Wenn Sie die TS-Segmente zusammenführen, können Sie sie auch wieder in einen MP4-Container zurückmultiplizieren:

# merge the segments and re-mux them as mp4
ffmpeg -i "concat:seg1.ts|seg2.ts|seg3.ts" -c:v copy -c:a copy -movflags empty_moov -flags global_header -bsf:v dump_extra edited-final.mp4

Jetzt haben wir also das Ganze erledigt, ohne den Film jemals zu transkodieren, und die Originalqualität bleibt erhalten. Aber wie immer gibt es einen Vorbehalt ...

VORBEHALT: Das Schneiden kann nur an einer Keyframe-Grenze erfolgen. Erklärung: H.264 organisiert die komprimierten Frames in Paketen, wobei jedes mit einem vollständigen, aber komprimierten Bild des ersten Frames beginnt, gefolgt von den Deltas der folgenden Frames, wodurch der für jedes Paket erforderliche Speicherplatz verringert wird. Für unseren Zweck ist jedes Paket wie ein versiegelter Zip aller Frames für diese Dauer – es ist entweder alles oder nichts. Wenn Sie nur einen Teil des Pakets möchten, müssen Sie es entpacken und wieder zippen, mit anderen Worten – es transkodieren. Die obige Methode ist also nur relevant, wenn Sie an jeder Position, an der Sie den Film schneiden möchten, ein Keyframe haben. Wenn Sie beispielsweise alle 5 Sekunden ein Keyframe haben, können Sie es nur alle 5 Sekunden schneiden.

Die Frage ist nun, ob Sie die Einschränkungen bei den Schnittpunkten akzeptieren können, insbesondere da Sie wahrscheinlich keine Ahnung haben, wo in Ihrem Film Keyframes vorhanden sind. Und das ist der Grund, warum ich oben vorgeschlagen habe,5.4 Hauptoptionenüber die Angabe von -sund -tvor der Eingabe oder vor der Ausgabe. Wenn Sie vor der Eingabe angeben, findet ffmpeg ein nahegelegenes Keyframe, um Ihre Anforderung auszuführen, das „mehr oder weniger“ dort sein wird, wo Sie den Schnitt durchführen wollten. Wenn Ihnen die Genauigkeit des Schnitts egal ist, dann gut, machen Sie es.

Wenn der Schnitt aber genau an dieser Stelle sein muss, bleibt Ihnen keine andere Wahl: Sie müssen den Film dekodieren, um das gesuchte Bild zu finden. Zumindest haben wirmanchegute Neuigkeiten: Anstatt Transkodierung und erneute Transkodierung können Sie mit einer einzigen Transkodierung auskommen, was die Situation etwas verbessert:

# skip PRECISELY 30 seconds and transcode a 60 seconds TS segment
ffmpeg -i full-movie.mp4 -ss 30 -t 60 -bsf:v h264_mp4toannexb segment.ts

Da die resultierenden Segmente in TS vorliegen, ist beim Zusammenführen der Segmente keine weitere Transkodierung erforderlich.

Geschwindigkeit

Imffmpeg-Wiki-Artikel zum ZusammenführenEs gibt eine Erklärung, wie der gesamte Prozess durch Pipes ausgeführt wird, wodurch die Notwendigkeit von Zwischendateien entfällt und der gesamte Prozess beschleunigt wird.NICHT.Es wird Sie nehmenlänger. Der Grund dafür, dass es länger dauert, alles im Speicher zu erledigen, ist nicht, dass es länger dauert, sondern dass Sie keine Zwischenergebnisse haben, während Sie herausfinden, wie Sie das Ganze erledigen, und Sie den gesamten Prozess immer wieder ausführen müssen. Die Pipe-Theorie ist also gut, aber in Ihrem Fall sollten Sie damit beginnen, jeden Schritt auszuarbeiten und zu perfektionieren. Sie werden feststellen, dass es noch etwas Feinabstimmung und Feintuning erfordert, damit alles funktioniert und ein anständiges Ergebnis erzielt wird. Sobald Sie den gesamten Prozess beherrschen und einige Skripte für die automatisierte Massenbearbeitung erstellen möchten, können Sie sich erneut mit dem Pipe-Konzept befassen.

Hoffe, das oben Gesagte hilft.

verwandte Informationen