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 ffprobe
Bitrate, 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