Fügen Sie der Mitte des Videos einen Keyframe hinzu, ohne das gesamte Video neu zu kodieren

Fügen Sie der Mitte des Videos einen Keyframe hinzu, ohne das gesamte Video neu zu kodieren

Ich muss in der Mitte von MP4s bei Werbeunterbrechungen I-Frames hinzufügen, damit ich in HLS segmentieren und I-Frames haben kann, wenn das Video wieder einsetzt. Ich weiß, wie man das macht, während man das gesamte Video neu kodiert und Keyframes an bestimmten Stellen erzwingt, aber ich würde viel lieber die Stelle (vielleicht 1 Sekunde Video) ausschneiden, an der der Keyframe benötigt wird, den Keyframe hinzufügen und dann das Video wieder zusammenfügen. Dies sollte die Kodierungszeit erheblich verkürzen, da ich die Codecs größtenteils 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 das I-Frame hinzufüge, und ich beim Zusammenfügen keine saubere Naht bekomme. Ich verstehe, dass ich mit dem eine Neucodierung durchführen kann concat, aber ich versuche, diese Verarbeitungszeit zu vermeiden.

Einige einfache Beispiele dessen, was ich mit ffmpeg zu tun versuche:

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 nicht standardmäßig irgendwelche zufälligen Sachen verwendet werden, aber ich bekomme es immer noch nicht richtig zum Laufen.

Hat das schon jemand geschafft? Dies wird speziell für die serverseitige Anzeigeneinblendung gemacht.

Antwort1

Ich kopierediese Antwort:

Mit ffmpeg können Sie mithilfe dieser Option Keyframes an den gewünschten Stellen einfügen -force_key_frames.

z.B:

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

setzt einen Keyframe so nah wie möglich an die 5- und 10-Sekunden-Marke. Die Zeitwerte können im Format hh:mm:ss oder nur in Sekunden (einzelne Werte, keine Doppelpunkte) angegeben werden.

Mit diesem Befehl können Sie prüfen, ob an den gewünschten Stellen Frames eingefügt wurden:

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

verwandte Informationen