Smart Trimmen Sie eine H.264 .MP4-Videodatei in ffmpeg

1948
HGBells

Ich möchte ein live aufgenommenes h.264-Video als Eingang nehmen und es abschneiden, um mit einer Überblendung von Schwarz zu beginnen und mit einer Überblendung nach Schwarz mit möglichst wenig Kodierung zu enden. Diese Ein- / Ausblendpunkte können zwischen I-Frames liegen. Es ist nicht möglich, bei Nicht-I-Bildern ohne erneute Kodierung zu trimmen.

Ich habe ein Diagramm erstellt:

Smart Trimmen Sie eine H.264 .MP4-Videodatei in ffmpeg

Ich möchte die Eingabedatei in drei Teile aufteilen. Teil A würde am I-Frame vor Punkt 1 beginnen und an Punkt 1 enden. Teil C würde am I-Frame an Punkt 2 beginnen und beim nächsten I-Frame nach dem Einblenden in Schwarz enden. Sie würden in ein All-I-Frame-Format umcodiert. Diese zwei Segmente wären relativ kurze 10 bis 30 Sekunden. Teil B (der Großteil des Videos) könnte nur mit Codec: Kopieren transcodiert werden.

Die Teile A und C werden zugeschnitten (entweder automatisch mit schwarzer Erkennung oder manuell), und dann wird das gesamte Video mithilfe von ffmpeg verkettet.

Ich möchte ffmpeg gerne verwenden, weil ich damit am besten vertraut bin und der Rest meines Workflows es ausschließlich verwendet. Welche Befehlszeilen würden das erreichen?

Für Neugierige ist hier meine Arbeitsbefehlszeile, um Live-Videos in verschlüsselte Segmente aufzunehmen. Ab diesem Zeitpunkt ist es einfach, unnötiges Video zu verwerfen und Segmente neu zu codieren, wenn dies zum Trimmen erforderlich ist. Der letzte Schritt ist das Verketten der Segmente.

ffmpeg -f dshow -rtbufsize 702000k -video_size 1920x1080 -framerate 29.97 -pixel_format uyvy422 -i video="Decklink Video Capture":audio="Decklink Audio Capture" -threads 0 -c:v libx264 -s 1280x720 -crf 18 -profile:v main -level 3.1 -pix_fmt yuv420p -c:a libvo_aacenc -b:a 128k -ac 1 -f segment -segment_time 0.01 -reset_timestamps 1 seg%02d.mp4 
1
Sie können "29.97" durch genau "30000/1001" ersetzen. Gyan vor 8 Jahren 0

1 Antwort auf die Frage

0
Gyan

Dies kann mit dem Segment Multiplexer und Concat Demuxer erreicht werden.

Schritt 1 Segmentieren Sie die Eingabe

Angenommen, Sie extrahieren möchten, 00:50um 02:20aus dem aufgenommenen Quelle. Nehmen wir an, die GOP-Größe beträgt 3 Sekunden. Da Ihr In-Point möglicherweise der letzte Frame einer GOP ist, müssen Sie eine GOP-Länge früher beginnen. Also reinschneiden ist 00:47und extrahieren dauert 01:33. So,

ffmpeg -ss 0:57 -t 01:33 -i input.mp4 -c copy -f segment -segment_time 0.01 -reset_timestamps 1 seg%02d.mp4 

Dadurch werden Segmente mit jeweils einer GOP erstellt. Also nicht für intracodierte Streams verwenden :)

Schritt 2 Trimmen Sie die Kopf- und Schwanzsegmente

Alle überflüssigen Segmente am Kopf und am Schwanz löschen - möglich, wenn die GOP-Länge klein ist. Trimmen Sie dann die korrekten oberen und hinteren Segmente:

ffmpeg -ss 2 -i seg00.mp4 -crf 18 -map [v] -map [a] seg00a.mp4  ffmpeg -t 2 -i seg46.mp4 -crf 18 -map [v] -map [a] seg46a.mp4 

Schritt 3 Concat

a) Bereiten Sie die concat-Datei vorsegments.txt

file 's00a.mp4' file 's01.mp4' file 's02.mp4' ... file 's44.mp4' file 's45.mp4' file 's46a.mp4' 

b)

ffmpeg -f concat -i segments.txt -c copy -fflags +genpts trimmed.mp4 

Da Sie an einem Live-Capture arbeiten, können Sie die Ausgabe an den TS statt an MP4 vornehmen, außer an der endgültigen Ausgabe.

Erstmal vielen Dank für die schnelle Antwort! Bitte korrigieren Sie mich, wenn ich das nicht verstehe, aber ich bin mir nicht sicher, ob dies das tut, was ich versuche. Ich versuche nicht, Fade-In und Fade-Outs anzuwenden, die ich auf bereits vorhandene trimmen möchte. Die Ins und Outs in meinem Quellvideo können sehr eng sein. Die Segmentierung kann mir immer noch helfen, und ich lese gerade darüber nach. Vielen Dank! HGBells vor 8 Jahren 0
Überspringen Sie dann die Überblendfilter in Schritt 2. Siehe den bearbeiteten Befehl. Gyan vor 8 Jahren 0
EDIT: Nevermind, ich verstehe. Ich denke das wird funktionieren! HGBells vor 8 Jahren 0