Was ist KeyInt und Min-Keyint und No-Scenecut?

Ich bin absolut neu in der Videoverarbeitung, ich baue eine Video-Streaming-Site auf und habe mit ffmpeg gearbeitet, um die Formate zu generieren, die ich für ShakaPackager benötige.

Leider verstehe ich einige der angebotenen Optionen nicht, insbesondere keyInt, min-keyintund no-scenecut.

Nachfolgend finden Sie den Code, den ich verwende, um die erforderlichen Formate für meine Videos zu generieren.

ffmpeg -y -i ${1} -c:a aac -ac 2 -ab 256k -ar 48000 -c:v libx264 -x264opts "keyint=24:min-keyint=24:no-scenecut" -b:v 1500k -maxrate 1500k -bufsize 1000k -vf "scale=-2:720" "${2}/${3}720.mp4"

Ich habe ein bisschen recherchiert und sie sprachen darüber, IDR-framesdass ich das nicht einmal verstehe, vielleicht gehen meine Bedürfnisse viel weiter als das?

Antworten (3)

Die Frames in Ihrem H.264-Video sind in Einheiten gruppiert, die als GOPs (Group Of Pictures) bezeichnet werden. Im Inneren werden diese GOPRahmen in drei Typen eingeteilt:

  • I-frame: Rahmen, der das gesamte Bild speichert
  • P-frame: Rahmen, der nur die Änderungen zwischen dem aktuellen Bild und den vorherigen speichert
  • B-frame: Rahmen, der Unterschiede zu vorherigen oder zukünftigen Bildern speichert

Außerdem können I-Frames als IDRFrames und non-IDRFrames klassifiziert werden. Der Unterschied besteht darin, dass Frames, die auf einen Frame folgen IDR, keinen Frame referenzieren können, der vor dem IDRFrame kommt, während es im Fall eines non-IDRFrames keine Einschränkungen gibt.

Jeder GOPbeginnt mit einem I-Frame, auch genannt keyframe, kann aber mehr als einen enthalten . Um weitere Verwirrung zu stiften, GOPkann a mit einem IDRRahmen oder mit einem non-IDRRahmen beginnen. Das bedeutet, dass Frames in GOPmanchmal auf vorherige GOPs verweisen (in diesem Fall GOPsoll es "offen" sein) und manchmal nicht (in diesem Fall ist es geschlossen).

Es ist üblich, die Struktur von a GOPwie in diesem Beispiel dargestellt zu sehen: IBBBPBBBPBBBI. Hier beträgt die Länge des GOPBildes 12 Frames, mit 3 B-Frames zwischen jedem P-Frame.

Nun deine Fragen:

  • keyintgibt die maximale Länge des an GOP, also das maximale Intervall zwischen den einzelnen Keyframes, die daran erinnern, dass es sich entweder um einen IDR-Frame oder um einen Nicht-IDR-Frame handeln kann. Ich bin mir nicht ganz sicher, aber ich denke, dass ffmpeg standardmäßig erfordert, dass jeder IDR-Frame ein IDR-Frame ist, sodass Sie in der Praxis die Begriffe IDR-Frame und I-Frame austauschbar verwenden können
  • min-keyintgibt die Mindestlänge der GOP. Dies liegt daran, dass der Encoder möglicherweise entscheidet, dass es sinnvoll ist, vor dem keyintWert einen Keyframe hinzuzufügen, damit Sie eine Grenze setzen können
  • no-scenecut. Wenn der Encoder feststellt, dass es einen Szenenschnitt gegeben hat, kann er entscheiden, einen zusätzlichen I-Frame einzufügen. Das Problem ist, dass I-Frames im Vergleich zu anderen Frame-Typen sehr teuer sind. Wenn Sie also für das Streaming codieren, sollten Sie sie deaktivieren.

Ein paar andere verwandte Parameter:

  • bframesgibt die Anzahl aufeinanderfolgender B-Frames an
  • refgibt die Anzahl der Referenzframes an, die beim Codieren verwendet werden. Dies bedeutet, dass beim Codieren eines Bildes refvorherige Frames zum Codieren des aktuellen Frames betrachtet werden
Im Befehl des OP sind dies x264-Optionen, also beziehen sich keyint und min-keyint auf die IDR-Platzierung, nicht auf Nicht-RAP-I-Frames.
Danke für die erstaunliche Antwort ... Ich habe so viel gelernt.
Meine Frage ist nun, wie hast du das alles gelernt, wie lerne ich auch?
Ich wünschte, ich könnte diesem mehr Stimmen geben. Erstaunliche Antwort und sehr informativ. Danke dir.

Die meisten Video-Encoder wenden eine zeitliche Komprimierung an, dh die meisten Frames speichern nur den Unterschied im Bildinhalt relativ zu anderen Frames, wodurch Speicherplatz gespart wird, während einige Frames das gesamte Bild speichern. Die Frames mit ganzen Bildern werden Keyframes genannt, da sie benötigt werden, um das Gesamtbild von Frames zu rekonstruieren, die nur Unterschiede speichern. IDR-Frame im H264-Stream bezeichnet einen Keyframe.

Ihr Code weist ffmpeg an, einen H264-Videostream mit dem x264-Encoder zu generieren, und die folgenden Optionen werden vom Encoder verwendet, um die Keyframe-Platzierung zu bestimmen.

-x264opts "keyint=24:min-keyint=24:no-scenecut"

keyint=24weist x264 an, 24 Frames nach dem letzten Keyframe zwangsweise einen Keyframe zu generieren.

min-keyint=24legt den minimalen Keyframe-Abstand fest. Der Encoder kann beschließen, selbst einen Keyframe zu platzieren, selbst wenn keyint# Frames noch nicht verstrichen sind, wenn er auf ein Bild stößt, das effizienter als vollständiges Bild und nicht als Satz von Unterschieden gespeichert werden kann. min-keyintweist den Encoder an, dies niemals zu tun, wenn die Entfernung nicht mindestens beträgt 24. Da in diesem Fall keyint derselbe Wert wie min-keyint ist, liegen alle KFs 24 Frames auseinander.

no-scenecut- scenecut ist der Wert, der vom Encoder verwendet wird, um zu berechnen, ob er einen Keyframe erzwingen soll, wenn min-keyint dies zulässt. Er kann von 0-100 reichen. no-scenecutweist den Encoder an, diese Auswertung zu überspringen.

Was ist der Sinn von no-scenecutwhen keyint= min-keyint? Sind sie nicht gleichwertig?
Soweit ich mich erinnere, spart es den Aufwand für die Rahmenvergleichsanalyse.
In meinem Fall kehrt der obige Befehl sofort zurück. Irgendeine Idee?

Was bringt es, keinen Szenenschnitt zu haben, wenn keyint = min-keyint

Es gibt den Code in x264 (Funktion validate_parameters):

if( h->param.i_keyint_min == X264_KEYINT_MIN_AUTO )
    h->param.i_keyint_min = X264_MIN( h->param.i_keyint_max / 10, (int)fps );

Es wird die Gleichheit von keyint und keyint_min verbieten.

Das ist richtig, aber das Stück Code, das Sie kopiert haben, ist nicht das relevante. Die Zeile, die das Clipping durchführt, ist diese :h->param.i_keyint_min = x264_clip3( h->param.i_keyint_min, 1, h->param.i_keyint_max/2+1 );