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-keyint
und 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-frames
dass ich das nicht einmal verstehe, vielleicht gehen meine Bedürfnisse viel weiter als das?
Die Frames in Ihrem H.264-Video sind in Einheiten gruppiert, die als GOP
s (Group Of Pictures) bezeichnet werden. Im Inneren werden diese GOP
Rahmen in drei Typen eingeteilt:
I-frame
: Rahmen, der das gesamte Bild speichertP-frame
: Rahmen, der nur die Änderungen zwischen dem aktuellen Bild und den vorherigen speichertB-frame
: Rahmen, der Unterschiede zu vorherigen oder zukünftigen Bildern speichertAußerdem können I-Frames als IDR
Frames und non-IDR
Frames klassifiziert werden. Der Unterschied besteht darin, dass Frames, die auf einen Frame folgen IDR
, keinen Frame referenzieren können, der vor dem IDR
Frame kommt, während es im Fall eines non-IDR
Frames keine Einschränkungen gibt.
Jeder GOP
beginnt mit einem I-Frame, auch genannt keyframe
, kann aber mehr als einen enthalten . Um weitere Verwirrung zu stiften, GOP
kann a mit einem IDR
Rahmen oder mit einem non-IDR
Rahmen beginnen. Das bedeutet, dass Frames in GOP
manchmal auf vorherige GOP
s verweisen (in diesem Fall GOP
soll es "offen" sein) und manchmal nicht (in diesem Fall ist es geschlossen).
Es ist üblich, die Struktur von a GOP
wie in diesem Beispiel dargestellt zu sehen: IBBBPBBBPBBBI
. Hier beträgt die Länge des GOP
Bildes 12 Frames, mit 3 B-Frames zwischen jedem P-Frame.
Nun deine Fragen:
keyint
gibt 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önnenmin-keyint
gibt die Mindestlänge der GOP
. Dies liegt daran, dass der Encoder möglicherweise entscheidet, dass es sinnvoll ist, vor dem keyint
Wert einen Keyframe hinzuzufügen, damit Sie eine Grenze setzen könnenno-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:
bframes
gibt die Anzahl aufeinanderfolgender B-Frames anref
gibt die Anzahl der Referenzframes an, die beim Codieren verwendet werden. Dies bedeutet, dass beim Codieren eines Bildes ref
vorherige Frames zum Codieren des aktuellen Frames betrachtet werdenDie 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=24
weist x264 an, 24 Frames nach dem letzten Keyframe zwangsweise einen Keyframe zu generieren.
min-keyint=24
legt 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-keyint
weist 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-scenecut
weist den Encoder an, diese Auswertung zu überspringen.
no-scenecut
when keyint
= min-keyint
? Sind sie nicht gleichwertig?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.
h->param.i_keyint_min = x264_clip3( h->param.i_keyint_min, 1, h->param.i_keyint_max/2+1 );
Gyan
James Okpe George
James Okpe George
Jemanden