wake-up-neo.net

So ändern Sie das Keyframe-Intervall in ffmpeg

Ich wollte das Keyframe-Intervall eines Eingangsvideos auf 5 Sekunden einstellen. Nur dann kann ich mit FFmpeg eine konstante HLS-Segmentierung von 5 Sekunden erreichen. Wie stelle ich das Keyframe-Intervall mit FFmpeg auf 5 Sekunden ein? (FFmpeg Prompt Line Code geschätzt)

19
Samarth Misra

Sie müssen neu codieren. Setzen Sie den Keyint-Parameter von x264 auf 5 * fps und deaktivieren Sie Scenecut. Wenn dein fps zum Beispiel 24 ist:

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

Dies ist natürlich nicht optimal für die Qualität, entspricht aber Ihren Anforderungen.

Bearbeitet, um no-scenecut In scenecut=0 Zu ändern, wie vom Seufzerjungen vorgeschlagen.

28
Ely

Seufzer.

Die Fehlinformationen bezüglich der Option no-scenecut Sind schon länger gültig, als ich mich erinnern kann. Geben Sie niemals einen Wert für no-scenecut Ein.

Einen Link zur Dokumentation finden Sie hier .

Für FFmpeg müssen Sie die folgenden zwei Schalter verwenden:

-g 120 Definiert eine GOP von 120 Frames, um eine fünf Sekunden lange GOP für 23.976fps-Inhalte zu erstellen. Dies funktioniert in Verbindung mit der Option no-scenecut.

-x264opts no-scenecut Erzwingt die Erstellung von Keyframes gemäß dem von FFmpeg verwendeten GOP-Wert. Standardmäßig wird für libx264 Ein Keyframe erstellt, wenn ein Szenenwechsel erkannt wird. Wenn Sie eine Ausgabedatei mit MediInfo ohne diese Option überprüfen, wird scenecut=40 Angezeigt. Bei richtiger Ausführung ist das scenecut=0. Wenn diese Option nicht verwendet wird, werden Keyframes für ABR-Inhalte falsch ausgerichtet und die Segmentgrößen sind nicht vorhersehbar.

Nehmen Sie nicht mein Wort dafür, bitte führen Sie das Folgende unter einer Bash-Shell aus, wobei $ inputfile der Name der Datei ist, die Sie analysieren möchten. Wenn Sie die beiden oben gezeigten Schalter verwenden, wird eine sehr gleichmäßige Kadenz des Keyframe-Dumps für die Eingabeaufforderung angezeigt.

ffprobe -select_streams v -show_frames -show_entries \
  frame=pict_type -of csv $inputfile | grep -n I | cut -d ':' -f 1

Sie können auch auf einen Artikel verweisen, den ich geschrieben habe, in dem es darum geht, richtigen ABR-Frame-ausgerichteten Inhalt zu erstellen hier .

15
Navilor