Zwangs-IDR-I-Frames

  • Hallo,

    ich verwende für meine x264-Encodings u.a. folgende Parameter:
    [FONT=TimesNewRoman, serif]--min-keyint 120 --keyint 300[/FONT]
    Das bedeutet, daß bis zu 120 Frames nach einem IDR-I-Frame ein non-IDR-I-Frame gesetzt werden kann. Non-IDR-I-Frames haben den Vorteil, daß über sie hinweg referenziert werden kann. Das ist aber auch ihr Nachteil, denn an ihnen kann man nicht schneiden.

    Wird im Bereich von 120-300 Frames nach einem IDR-I-Frame ein neuer I-Frame gesetzt, so ist dies ein IDR-I-Frame. x264 sucht nach Szenenwechseln (beinflussbar durch den Parameter --scenecut), um die IDR-I-Frames sinnvoll zu setzen, immerhin benötigen diese relativ viel Platz. Wurde 300 Frames nach einem IDR-I-Frame kein weiteres IDR-I-Frame gesetzt, wird zwangsweise ein IDR-I-Frame gesetzt. Zwangsweise, weil es nicht an sinnvoller Stelle (Szenenwechsel) gesetzt wurde, sondern weil die 300 "um" sind.

    In einem Testfilm gibt es 515 IDR-I-Frames. 219/515=43% sind „Zwangs“-IDR-I-Frames, 57% hingegen nicht. Das sind mir zu viele "Zwangs"-IDR-I-Frames. Nun könnte man meinen, daß der verwendete Parameter „--min-keyint 120“ daran „schuld“ ist, denn ein I-Frame ist wahrscheinlich erst 120 Frames nach einem IDR-I-Frame ein IDR-I-Frame, vorher wäre es wahrscheinlich ein non-IDR-I-Frame. Das ist aber nicht so. In meinem Beispielfilm kommen 166 von 219=76% aller Zwangs-IDR-I-Frames direkt nach einem IDR-I-Frame, demzufolge kommen nur (219-166)/219=53/219=24% Zwangs-IDR-I-Frames nach einem non-IDR-I-Frame.

    Als "Lösung" schwebt mir nun vor, den Parameter "--keyint" von 300 kräftig hochzusetzen. Das es dann nur wenig Stellen gibt, an denen man den fertigen Film schneiden kann, ist mir egal. Zum Schneiden ist die Quelle eh viel besser geeignet. Mit zu großen --keyint-Werten wird allerdings auch das Springen im Film problematischer. Gibt es hier Erfahrungen, wie groß der --keyint-Parameter werden darf, so daß Springen im Film noch akzeptabel möglich ist? Wäre 500 noch gut?


    Wenn ich mir was wünschen dürfte...
    Nein, ich meine hier nicht das Lied von Friedrich Holländer, sondern einen neuen x264-Parameter, etwa wie folgt:


    --min-keyint 120 --reduced-scenecut 250,10 --keyint 350
    Bis 120 werden non-IDR-I-Frames gesetzt.
    Von 120-250 werden IDR-I-Frames gesetzt.
    Von 250-350 werden ebenfalls IDR-I-Frames gesetzt, allerdings wird der --scenecut-Wert um 10 reduziert, so daß IDR-I-Frames eher gesetzt werden.
    Bei 350 wird ein Zwangs-I-Frame gesetzt.

    Oder so:
    --min-keyint 120 --reduced-scenecut 250 --keyint 350
    Bis 120 werden non-IDR-I-Frames gesetzt.
    Von 120-250 werden IDR-I-Frames gesetzt.
    Von 250-350 werden ebenfalls IDR-I-Frames gesetzt, allerdings wird der --scenecut-Wert vom aktuellen Wert (Standard: 40) kontinuierlich bis zum Frame 350 auf 0 gesenkt, so daß IDR-I-Frames immer eher gesetzt werden.
    Da der scenecut-Wert bei 350 dann 0 ist, wäre ein Zwangs-I-Frame (außer bei Standbild) nicht nötig.

    Wäre das eine Idee?

    Gruß

    akapuma

    Wer weiß, wovon er redet, kann es sich leisten, sich verständlich auszudrücken.
    Besucht auch meine Homepage: http://akapuma.info

  • Das mit den IDR-Frames bei x264 definitiv noch nicht ausgereift bzw. soweit ich weiß gibt's da noch keinen 'guten' Code für und es läuft momentan so:

    Nur wenn ein Szenenwechsel früher erscheint als min-keyint wird ein I-Frame gesetzt, sonst werden immer IDR Frames gesetzt.

    Das ist definitiv nicht optimal:

    Zitat

    but the metric that would really optimize
    for compression ratio isn't possible to measure in 1 pass, and I haven't
    written a 2 pass scenecut/IDR algorithm yet.

    --Loren Merritt


    Quelle: http://www.via.ecp.fr/via/ml/x264-de…1/msg00051.html

    zu deiner Idee mit dem --reduce-scenecut:
    Prinzipiell ist sowas sicher machbar, aber wie sinnig es ist ist sicher auch so ne Sache. Cleverer wäre eventuell etwas adaptives, was schon die Szenenwechsel irgendwie anders festlegt (nicht nur am Prozentuellenunterschied von 2 benachbarten Bildern, eventuell sollte man je nach Luma oder Chroma unterscheiden oder weiß ich was).

    Bei deiner Idee ist halt auch das Problem, dass man nicht wirkliche Erfahrungswerte/Statistiken hat wann was für Intervalle bei was für Filmen am sinnigsten wären. Denke da müsste im 1st pass noch irgendeine clevere Analyse laufen um im 2ten pass möglichst ideal zu entscheiden.

    Zitat

    Gibt es hier Erfahrungen, wie groß der --keyint-Parameter werden darf, so dass Springen im Film noch akzeptabel möglich ist? Wäre 500 noch gut?


    Soweit ich weiß gibt's da keine großen Erfahrungswerte, vor allem weil in den meisten Clips/Filmen ein erzwingen eines IDR Frames aufgrund von keyint ziemlich selten sein sollte. (zumindest so wie ich mir das vorstelle)

    Cu Selur

  • vor allem weil in den meisten Clips/Filmen ein erzwingen eines IDR Frames aufgrund von keyint ziemlich selten sein sollte. (zumindest so wie ich mir das vorstelle)

    Nein, bei meinem Testfilm fast die Hälfte (43%).

    Denke da müsste im 1st pass noch irgendeine clevere Analyse laufen um im 2ten pass möglichst ideal zu entscheiden.

    Wenn man dann 2 passes hat. Bei CRF muß es auch in einem Pass gehen.

    Ich schaue mal, ob man die im englischen doom9-Forum gut verständlich vorschlagen kann -- wenn du das nicht selbst vorhast, akapuma.

    Das wäre nett von Dir. Englisch und verständich wäre ein echtes Problem für mich.

    Gruß

    akapuma

    Wer weiß, wovon er redet, kann es sich leisten, sich verständlich auszudrücken.
    Besucht auch meine Homepage: http://akapuma.info

  • Zitat

    Nein, bei meinem Testfilm fast die Hälfte (43%).

    ist dein Sample ein Spezialfall oder denkst Du schon, dass es ein 'allgemein gültigeres' Szenario beschreibt?

    Zitat

    Wenn man dann 2 passes hat. Bei CRF muß es auch in einem Pass gehen.

    Stimmt für 1st pass sicher interessant, wobei natürlich die Frage ist wie viel qualitativen unterschied so etwas bringen kann.

    Gibt es eigentlich irgendwelche Studien bezogen auf Mpeg2 auf das Placement von I-Frames? Einige Ergebnisse wären vielleicht übertragbar.

    Cu Selur

    Ps.: kleine Anmerkung:
    - Das IDR-Frame intervall nicht zu groß sein darf da nur an IDR-Frames der Buffer geleert werden kann/darf. Profile@Level Kombinationen mit Buffer Beschränkungen könnten ein Probleme werden. Bei zu wenig Playbackperformance und dem Überspringne von Frames sind IDR Frames immer der nächste Anspringpunkt.
    - Bei Material was gestreamt werden soll sind IDR Frames wie bei Spulen Einsprungspunkte und dürfen auch nicht zu weit auseinander sein.

    Okay, ist am PC nicht soo dramtisch, aber sollte im Hinterkopf behalten werden.

    Pss.: vielleicht interessant wären:
    "A Novel Approach to Key-frame Detection in Video" from W. Ren and S. Singh (UK)
    "Fast dynamic adaptive keyframe setting in video coding" from YU YUAN (1) ; DAVID FENG (2) ; YUZHUO ZHONG (1) ; Yeung Minerva M. ; Lienhart Rainer W. ; Chung-Shen Li ;
    (leider hab ich keine kostenlose Quelle für die Paper gefunden)

  • ist dein Sample ein Spezialfall oder denkst Du schon, dass es ein 'allgemein gültigeres' Szenario beschreibt?

    Besonders alte Heimatfilme scheinen betroffen zu sein:

    Heimatfilm, 1h21, 672x480, 364908kB => 43%
    Heimatfilm, 1h24, 688x496, 484664kB => 52%
    neuer Spielfilm, 2h01, 528x432, 489464kB => 21%
    Sat1-Vierteiler, 5h50, 704x416, 1051450kB => 11%
    dunkler Gruselfilm, 1h30, 704x400, 379020kB => 20%
    alter sw-Film, 1h00, 704x560, 312617kB => 31%

    Alle Dateigrößen inkl. Audio. Zu beachten ist, daß alle Filme mit den gleichen Einstellungen erzeugt wurden:

    Code
    %CLI% --crf 25 -I 300 -i 120 -r 6 --mixed-refs --no-fast-pskip -b 4 --b-pyramid --me umh --merange 32 --b-rdo --bime -w -f 1,1 -m %subme% -A all -8 --qpstep 8 --aq-strength 0.5 --direct auto --b-bias 30 %agkpzones% %threads% --progress --no-psnr --no-ssim -o %4 %5

    Andere Einstellungen können natürlich zu anderen Ergebnissen führen.

    Gruß

    akapuma

    Wer weiß, wovon er redet, kann es sich leisten, sich verständlich auszudrücken.
    Besucht auch meine Homepage: http://akapuma.info

  • Deine Prozentzahlen geben jetzt den Anteil der Zwangs-IDR-Frames (automatisch 300frames nach dem IDR Frame davor eingefügt) an der Anzahl der insgesamt im Film vorkommenden IDR-Frames an?

    Genau, z.B. erster Film: 219 IDR-Frames kommen 300 Frames nach dem letzten, 515 gibt's insgesamt, 219/515=43%.

    Gruß

    akapuma

    Wer weiß, wovon er redet, kann es sich leisten, sich verständlich auszudrücken.
    Besucht auch meine Homepage: http://akapuma.info

  • Okay. Wollte nur sicher gehen das ich die Ergebnisse richtig verstehe.
    Weißt Du zufällig auch wie weit so im Mittel die IDR Frames auseinander sind?
    (vergiss das, wäre nur interessant gewesen, wenn das min keyframe nicht so groß gewesen wäre ;))

    Cu Selur

  • (vergiss das, wäre nur interessant gewesen, wenn das min keyframe nicht so groß gewesen wäre ;))

    Etwa 75% aller Zwangs-IDR-I-Frames kommen direkt nach einem IDR-I-Frame, und nicht nach einem non-IDR-I-Frame. --min-keyint kann also nix dafür.

    Alle Abstände stehen in der pdf, die im Anhang dieses Posts steht.

    Gruß

    akapuma

    Wer weiß, wovon er redet, kann es sich leisten, sich verständlich auszudrücken.
    Besucht auch meine Homepage: http://akapuma.info

  • Hmm, das wirft die Frage auf wann x264 immer IDR-Frames setzt oder in deinem Sample sind halt einfach viele Szenen in denen sich öfters mehr als 10Sek. nicht viel tut. :)

    Der min-keyframe Abstand kann immer noch ein Problem sein, da er ja verhindert, dass ein IDR Frame gesetzt wird. Es werden also I-Frames gesetzt, der Scenechange-Threshold bezieht sich aber soweit ich es im Kopf habe immer auf den Unterschied zum nächsten I oder IDR Frame.

    wenn man also 600 Frames mit max keyint 300 kann es sein, dass eine ideale Aufteilung folgende IDR-Positionen liefern würde:

    1, 50, 119, 250, 350, 600

    auf Grund des min-keyints passiert aber folgendes:

    1, 250, 550 da er an den Stellen 119 und 350 keine IDR sondern I-Frames erzeugt. ;)


    ----------------------
    gerade mal einen kleinen Vergleich gemacht:

    250_25:

    Code
    x264 [info]: slice I:112   Avg QP:29.85  size: 18660  PSNR Mean Y:37.00 U:40.35 V:40.20 Avg:37.82 Global:37.20x264 [info]: slice P:5753  Avg QP:32.76  size:  5777  PSNR Mean Y:34.23 U:37.81 V:37.34 Avg:35.06 Global:34.58x264 [info]: slice B:8236  Avg QP:33.58  size:  1705  PSNR Mean Y:34.14 U:38.05 V:37.46 Avg:35.02 Global:34.47x264 [info]: mb I  I16..4: 22.3% 58.6% 19.0%x264 [info]: mb P  I16..4:  5.0%  8.5%  2.0%  P16..4: 42.5% 15.0%  5.2%  0.5%  0.2%    skip:21.1%x264 [info]: mb B  I16..4:  0.2%  0.6%  0.2%  B16..8: 30.8%  1.8%  3.7%  direct: 1.2%  skip:61.5%x264 [info]: 8x8 transform  intra:55.4%  inter:63.9%x264 [info]: direct mvs  spatial:75.6%  temporal:24.4%x264 [info]: ref P  76.1% 14.5%  9.4%x264 [info]: ref B  83.3% 11.0%  5.6%x264 [info]: SSIM Mean Y:0.9270078x264 [info]: PSNR Mean Y:34.200 U:37.968 V:37.434 Avg:35.062 Global:34.531 kb/s:700.26

    250_1:

    Code
    x264 [info]: slice I:112   Avg QP:29.82  size: 18711  PSNR Mean Y:37.02 U:40.36 V:40.21 Avg:37.84 Global:37.22x264 [info]: slice P:5753  Avg QP:32.76  size:  5777  PSNR Mean Y:34.23 U:37.81 V:37.34 Avg:35.06 Global:34.58x264 [info]: slice B:8236  Avg QP:33.58  size:  1705  PSNR Mean Y:34.14 U:38.05 V:37.46 Avg:35.02 Global:34.47x264 [info]: mb I  I16..4: 22.3% 58.6% 19.1%x264 [info]: mb P  I16..4:  5.0%  8.5%  2.0%  P16..4: 42.5% 15.0%  5.2%  0.5%  0.2%    skip:21.1%x264 [info]: mb B  I16..4:  0.2%  0.6%  0.2%  B16..8: 30.8%  1.8%  3.7%  direct: 1.2%  skip:61.5%x264 [info]: 8x8 transform  intra:55.4%  inter:64.0%x264 [info]: direct mvs  spatial:75.6%  temporal:24.4%x264 [info]: ref P  76.1% 14.5%  9.4%x264 [info]: ref B  83.3% 11.1%  5.6%x264 [info]: SSIM Mean Y:0.9270083x264 [info]: PSNR Mean Y:34.200 U:37.970 V:37.434 Avg:35.062 Global:34.531 kb/s:700.26

    mit 250_120:


    Cu Selur

  • Hallo Selur,

    ich sehe in Deinem letzten Test nur 2 I-Frames mehr. Ich denke, es ist anders:

    In Szenen, in denen viele Szenenänderungen kommen, werden zwar auch viele non-IDR-I-Frames gesetzt, allerdings ist das nicht schlimm, denn durch die vielen Wechsel werden die IDR-I-Frames auch ohne Begrenzung gesetzt. In Szenen ohne Szenenänderungen werden keine non-IDR-I-Frames gesetzt (weil nämlich gar keine I-Frames gesetzt werden), und es kommt zu der Zwangsbegrenzung.

    Was für meine Theorie spricht (am Beispielfilm):
    - 75% aller Zwangs-IDR-I-Frame folgen auf einen IDR-I-Frame und nicht auf einen non-IDR-I-Frame.
    - Es kommt trotz --min-keyint 120 oft vor, daß zwischen 2 IDR-I-Frames garkeine non-IDR-I-Frames gesetzt werden (genau genommen in 64% aller Fälle):

    Anzahl non-IDR-I-Frames zwischen 2 IDR-I-Frames:
    0=330 1=149 2=35 3=1

    Gruß

    akapuma

    Wer weiß, wovon er redet, kann es sich leisten, sich verständlich auszudrücken.
    Besucht auch meine Homepage: http://akapuma.info

  • mit: 999_1:

    Code
    x264 [info]: slice I:81    Avg QP:29.72  size: 18119  PSNR Mean Y:37.19 U:40.49 V:40.39 Avg:38.00 Global:37.27x264 [info]: slice P:5767  Avg QP:32.71  size:  5845  PSNR Mean Y:34.25 U:37.80 V:37.35 Avg:35.08 Global:34.60x264 [info]: slice B:8253  Avg QP:33.53  size:  1720  PSNR Mean Y:34.15 U:38.01 V:37.44 Avg:35.03 Global:34.48x264 [info]: mb I  I16..4: 22.9% 59.1% 18.0%x264 [info]: mb P  I16..4:  5.1%  8.6%  2.1%  P16..4: 42.5% 15.0%  5.3%  0.5%  0.2%    skip:20.9%x264 [info]: mb B  I16..4:  0.2%  0.6%  0.2%  B16..8: 30.9%  1.8%  3.7%  direct: 1.2%  skip:61.4%x264 [info]: 8x8 transform  intra:55.3%  inter:63.9%x264 [info]: direct mvs  spatial:75.5%  temporal:24.5%x264 [info]: ref P  76.1% 14.5%  9.5%x264 [info]: ref B  83.3% 11.1%  5.6%x264 [info]: SSIM Mean Y:0.9270383x264 [info]: PSNR Mean Y:34.213 U:37.941 V:37.421 Avg:35.069 Global:34.542 kb/s:700.28
    Zitat

    In Szenen, in denen viele Szenenänderungen kommen, werden zwar auch viele non-IDR-I-Frames gesetzt, allerdings ist das nicht schlimm, denn durch die vielen Wechsel werden die IDR-I-Frames auch ohne Begrenzung gesetzt. In Szenen ohne Szenenänderungen werden keine non-IDR-I-Frames gesetzt (weil nämlich gar keine I-Frames gesetzt werden), und es kommt zu der Zwangsbegrenzung.

    Ja, dem stimme ich zu die Frage die bei mir noch offen ist, kann vorkommen, dass ein IDR Frame ideal ist aber ein I-Frame verwendet wird? ;)

    Das --min-keyint 120 stört mich vor allem weil ich keinen Nutzen darin sehe es so hoch zu setzen und eher mit einer negativen Auswirkung rechne. :)

    Cu Selur

    Ps.: das Sample was ich hier anteste ist übrigens nur 9min lang. ;)
    kannst unter http://selur.movie2digital.com/Filmworks/Sample.html mal angucken

    Pss.: bei den minimalen Auswirkungen welche die unterschiedlichen Settings haben lohnt sich Aufwand vermutlich nicht. ;)
    (mache mal nen 10_10er Encode)


    Da ist mal was passiert :)

  • Das --min-keyint 120 stört mich vor allem weil ich keinen Nutzen darin sehe es so hoch zu setzen und eher mit einer negativen Auswirkung rechne. :)

    Den Vorteil von non-IDR-Frames sehe ich darin, daß darüber hinweg referenziert werden kann, und so Teile übernommen werden können, und sei es nur das Senderlogo. Da ein I-Frame standardmäßig schon bei 40% Bildänderung verwendet wird, könnte ja schonmal was zu gebrauchen sein.

    Den Vorteil von 120 gegenüber dem Standard 25 sehe ich nicht darin, daß vielleicht weiter referenziert werden kann, sondern darin, daß in Passagen mit schneller I-Frame-Folge einfach mehr non-IDR-I-Frames gesetzt werden.

    Als keyint habe ich 300 genommen, die 120 ergeben sich aus der Empfehlung 0,4x300. Bei Pal würde man zwar eher 250 statt 300 nehmen, 50 mehr dürften aber nicht schaden.

    Gruß

    akapuma

    Wer weiß, wovon er redet, kann es sich leisten, sich verständlich auszudrücken.
    Besucht auch meine Homepage: http://akapuma.info

  • Zu der Frage: "Wie schaut's mit mehr als 250 aus?" kann ich sagen, daß ich standardmäßig als max. KFI immer 300 nehme, und noch keine beeinträchtigung , was das Spulen und Springen angeht, feststellen konnte. (XP 2400+ bei cropped PAL, 720*432) Auch bei einem Test mit einer 60sekündigen Nachrichtensprecherszene in Endlosschleife und einem Wert von 500 konnte ich noch keinen nennenswerten Unterschied feststellen.

  • Ich dachte eigentlich gerade umgekehrt, weil es kein wirkliches Hindernis darstellt, kann man ruhig das max. Intervall etwas heraufsetzen, um nicht unnötig Platz für große Frames zu vergeuden, die nicht wirklich gebraucht werden. Die I-Frames sind ja doch um einiges größer.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!