ffmpeg/x265: Fixed-GOP, nur IDR-Keyframes, sich wiederholende Header

Ich muss ein Video in ein anderes mit den folgenden Eigenschaften transcodieren:

  • Die GOP-Größe ist immer auf einen bestimmten Wert festgelegt
  • Als Keyframes werden nur IDR-Frames verwendet (keine I-Slices)
  • SPS/PPS/VPS-Frames werden jedes Mal vor dem IDR-Frame wiederholt.

Gibt es eine Möglichkeit, dies mit ffmpeg zu tun?

Außerdem wäre es großartig, wenn Sie mir auch eine einfache Möglichkeit nennen könnten, all dies zu überprüfen (vielleicht mit ffprobe?).

Welches Ausgabeformat?
H.265-Ausgabeformat.
Wie in einem rohen Bitstream?
Ehrlich gesagt ist es egal. Bei Bedarf kann ich den Container später reparieren. Aber der Raw-Stream ist das, was mir wichtig ist.

Antworten (1)

Minimale Befehlszeile für eine GOP-Größe von 2 Sekunden:

ffmpeg -i input -force_key_frames expr:gte(t,n_forced*2) -c:v libx265 -x265-params open-gop=0:scenecut=0:repeat-headers=1 output.hevc

Überprüfung:

ffmpeg -i output.hevc -c copy -bsf:v trace_headers -f null -

Nach jeder Zeile, die Schlüsselbilder enthält, z. B.

Packet: 18115 bytes, key frame, no pts, dts 2319977, duration 40000.

Sie sollten VPS/SPS/PPS sehen. Die erste Slice Segment Header, die folgt, sollte einen NAL-Einheitentyp haben, 20der IDR_N_LP ist.

ffprobe kann keine Bitstromfilter aufrufen.

Die scheint zu funktionieren. Danke. Der Überprüfungsbefehl funktioniert bei mir jedoch nicht ("Unknown bitstream filter trace_headers"). Auch nicht, dass es ein Problem wäre, aber es gibt eine "ergänzende Erweiterungsinformation" NAL nach VPS, SPS und PPS, die vorher nicht da war. Können Sie mir sagen, warum dieser spezielle Befehl dazu führt, dass das angezeigt wird?
Oh, und außerdem expr:gte(t,n_forced*2)muss der Teil des ersten ffmpeg-Befehls in Anführungszeichen gesetzt werden. Ich hatte vorgeschlagen, dass Sie das im Interesse der zukünftigen Copy-Paster bearbeiten!
Also lag ich vielleicht falsch. Ich habe dies mit einem anderen Video versucht und es sieht so aus, als ob es nicht immer funktioniert. Keyframes treten häufig auf, bevor die von mir eingestellten 250 Frames (10 Sekunden) abgelaufen sind (ich gehe davon aus, dass die n_forced*2GOP-Größe bestimmt wird, und ich habe sie in geändert n_forced*10). Ich habe versucht, min-keyint=250:keyint=250die x2675-Parameter hinzuzufügen. Kein Effekt. Ich habe auch die -gOption von ffmpeg ausprobiert. Es passiert immer noch das Gleiche.
Wenn Ihre Quelle ein Container mit VFR-Stream und/oder fps < 25 ist, gibt es möglicherweise keine 250 Frames in einem 10-Sekunden-Intervall. Sie können t in n und den Wert in einen Rahmenabstand ändern
Ich bin mir sicher, dass die FPS 25 sind (oder so sagt ffprobe). Bei VFR bin ich mir nicht sicher (das ist eine variable Bildrate, oder?), Aber ich denke, es ist unwahrscheinlich. Ich denke, das Problem ist, dass was auch immer wir tun, libx265 scheint min-keyint nicht zu berücksichtigen. Ihre Option force_key_frames funktioniert und behebt mein Hauptproblem, aber x265 sagt das gleich am Anfang, Keyframe min / max / scenecut : 126 / 250 / 0obwohl ich sowohl min-keyintals auch keyintauf 250 gesetzt habe.
Wenn Scenecut 0 ist, kann x265 Nicht-IDR-I-Slices einfügen - das sind keine Keyframes.