Fügen Sie der Video-Mitte einen Keyframe hinzu, ohne das gesamte Video neu zu codieren

446
pgm

Ich muss der Mitte von mp4s bei Werbeunterbrechungen I-Frames hinzufügen, damit ich nach HLS segmentieren und I-Frames haben kann, wenn das Video wieder in den Hintergrund tritt. Ich weiß, wie das gemacht wird, während das gesamte Video neu codiert und Keyframes besonders erzwungen werden Stellen, aber ich würde lieber die Stelle ausschneiden (vielleicht 1 Sekunde des Videos), an der der Keyframe benötigt wird. Fügen Sie den Keyframe hinzu und nähen Sie das Video dann wieder zusammen. Dies sollte die Codierzeit erheblich reduzieren, da ich Codecs hauptsächlich kopieren kann, mit Ausnahme der einen Sekunde Video, in der der I-Frame hinzugefügt wird.

Das einzige Problem ist, dass sich das Videoprofil und die Einstellungen dort ändern, wo ich den I-Frame hinzufüge, und ich keinen sauberen Stich bekomme, wenn ich alles wieder zusammenstelle. Ich kann verstehen, dass ich einen Reencode mit dem erstellen kann concat, aber ich versuche, diese Bearbeitungszeit zu vermeiden.

Einige einfache Beispiele für das, was ich mit ffmpeg versuchen möchte:

ffmpeg -i input.mp4 -ss 30 -t 1 -c:a copy -y -copyts clipped2.mp4  ffmpeg -i input.mp4 -t 30 -c copy -y -copyts clipped1.mp4  ffmpeg -i "concat:clipped1.mp4|clipped2.mp4" -c copy -y newOutput.mp4 

Ich muss möglicherweise ffprobeBitrate, Profil und andere Einstellungen für den 1-Sekunden-Clip verwenden und angeben, damit er nicht standardmäßig auf zufälliges Material verweist, aber ich kann immer noch nicht, dass dies richtig funktioniert.

Hat jemand das geschafft? Dies wird speziell für das Einfügen von Anzeigen auf dem Server vorgenommen.

1
Siehe [diese Frage] (https://stackoverflow.com/q/51995276/2903532) reynoldsnlp vor 5 Jahren 0

1 Antwort auf die Frage

0
reynoldsnlp

Ich kopiere diese Antwort :

Sie können ffmpeg verwenden, um Keyframes an der gewünschten Stelle mit der -force_key_framesOption einzufügen .

z.B:

./ffmpeg -i input.mp4 -c:a copy -c:v copy -force_key_frames 0:05:00,0:10:00 out.mp4 

wird ein Keyframe so nah wie möglich an die 5 und 10-Marke setzen. Die Zeitwerte können im Format hh: mm: ss oder nur Sekunden (Einzelwerte, keine Doppelpunkte) sein.

Sie können mit Hilfe von:

./ffprobe -select_streams v:0 -skip_frame nokey -show_entries frame=pkt_pts_time out.mp4