Wie füge ich mit ffmpeg zusätzliche Keyframes zu Videos hinzu?

600
jjulianf

Ich möchte meinem Video Keyframes basierend auf einem bestimmten Intervall (20 Frames) hinzufügen.

Deshalb habe ich den folgenden Befehl verwendet in ffmpeg:

ffmpeg -i <input> -vcodec libx264 -x264-params keyint=20:scenecut=0 -acodec copy out.mp4 

Als Ausgabe bekomme ich alle 20 Frames Keyframes.

Aber das Originalvideo hatte zB einen Keyframe frame 1, 12, 89....

Jetzt habe ich Keyframes am Frame 1, 21, 41....

Ich möchte nicht die bereits vorhandenen Keyframes ersetzen. Ich möchte zusätzliche Keyframes hinzufügen, so dass es so aussieht:

frame 1, 12, 21, 41, 89.... 

Wie kann ich das machen?

0

2 Antworten auf die Frage

2
Eugen Rieck

Kurze Antwort: Das geht nicht

Lange Antwort: Wenn Sie FFMpeg mit einer erneuten Codierung (dh einem anderen Codec als copy) verwenden, wird jedes einzelne Bild im Eingabestrom dekomprimiert und steht als vollständige Bitmap zur Verfügung. Dies bedeutet, dass die Frames 1, 12 und 89 zu diesem Zeitpunkt in der Pipeline nicht mehr "speziell" sind - sie sind Bilder wie jedes andere.

Wenn Sie jetzt über komprimieren libx264, erstellen Sie ein Video mit Keyframes. Diese werden an den von Ihnen konfigurierten Stellen abgelegt, in jedem Fall alle 20 Frames.

Das scheint sinnvoll zu sein, danke für Ihre Antwort! Was passiert aber, wenn ich einen kompletten Szenenwechsel zwischen Frame 11 und 12 vorgenommen habe und nur bei Frame 1, 21, ... Keyframes erhalte? Benötige ich in diesem Fall in Frame 12 ein Keyframe? jjulianf vor 6 Jahren 0
Aber ich könnte die vorherigen Keyframes später manuell hinzufügen, indem Sie `force_key_frame` verwenden, oder? jjulianf vor 6 Jahren 0
Warum dann `scencut = 0` verwenden? Lassen Sie sich von Scencut zaubern! Eugen Rieck vor 6 Jahren 2
@jjulianf Es scheint, dass Sie Ihre Frage umschreiben müssen, um nach dem * tatsächlichen * Problem zu fragen, das Sie haben, und nicht nach der Lösung, die Sie der Meinung sind. (Siehe http://xyproblem.info/) Benötigen Sie regelmäßige Streamintervalle? slhck vor 6 Jahren 0
Hinweis: Der Scenecut-Wert steht nicht für die Delta-Messung zwischen benachbarten Frames. Bei "scenecut" wird auch die Entfernung vom letzten Keyframe berücksichtigt. Bei einem niedrigen Keyint-Wert kann "scenecut" niemals ausgelöst werden, es sei denn, der letztere ist sehr hoch eingestellt. Gyan vor 6 Jahren 1
Ich dachte, ich brauche immer noch die ursprünglichen Keyframes. Ich dachte, dass das Video stottert oder so ähnlich läuft, wenn sich eine Szene vollständig ändert und die ursprünglichen Keyframes nicht mehr vorhanden sind. Aber es stellte sich heraus, dass es irgendwie immer noch sehr gut spielt .. :-) jjulianf vor 6 Jahren 0
1
Gyan

force_key_frames hat eine Option zum Spiegeln der Keyframe-Kadenz des Quell-Streams (bisher undokumentiert - auf meinem ToDo), dies kann jedoch nicht mit anderen Ausdrücken in f_k_f kombiniert werden.

Was Sie jedoch verwenden können, ist

-force_key_frames source -x264-params keyint=20:scenecut=0

Dadurch wird ein Keyframe festgelegt, wenn der Quellframe ein Keyframe war. Keyint wird jedoch immer vom letzten Keyframe-Satz aus gemessen. Wenn Ihre Quelle KFs zu diesem n=0,34,55,64Zeitpunkt hatte, werden KFs n=0,20,34,54,55,64,84angezeigt 40,60,80. Beachten Sie das Fehlen von KFs an . Beachten Sie auch die aufeinanderfolgenden KFs unter 54,55, daher sollten Sie die Quell-KFs ignorieren und Scenecut funktionieren lassen.

Danke, es ist gut über diese Option Bescheid zu wissen! Aber es ist nicht genau das, was ich wollte, da ich die Keyframes genau bei den Frames brauche. Aber immer noch eine interessante Option! jjulianf vor 6 Jahren 0
"-force_key_frames source" setzt *, wie es heißt, * die Key-Frames auf die exakten Frames. * Gyan vor 6 Jahren 0
Ja, aber ich meine "n = 0, 20, 34, 40, 55, 60, 64, 80 ...". Aber wie ich im oberen Kommentar gesagt habe, spielt das Video immer noch gut mit meiner ursprünglichen Lösung. jjulianf vor 6 Jahren 0
Das liegt an Ihrem Keyint = 20. Wenn Sie einen sehr großen Wert (9999) festlegen, werden die Quell-KFs exakt repliziert. Gyan vor 6 Jahren 0