C++ H.264 Encoding

lackylax

Cadet 2nd Year
Registriert
Apr. 2010
Beiträge
24
Hallo Community!

Ich bin beim Entwickeln mit dem H.264 Codec aus der FFMpeg Library auf Testergebnisse gestoßen, die mir nicht so ganz klar sind. Vielleicht gibt es unter Euch ja einen H.264-Experten, der eine Idee hat, warum meine Ergebnisse so sind, wie sie sind. ;-)

Also, ich habe zwei verschiedene Szenen mit einer Kamera aufgenommen und diese Bilder jeweils einmal mit H.264 und zum Vergleich mit MPEG1 komprimiert. In der einen Szenen gibt es so gut wie keine Bewegung, in der anderen Szene sehr viel Bewegung.

Erwartungsgemäß generiert MPEG1 ein größeres File bei der Szene mit viel Bewegung. Bei H.264 ist das jedoch genau umgekehrt, was ich einfach nicht verstehe. Denn es können ja eine Menge Makroblöcke geskipt werden, wenn keine Veränderung im Bild vorliegt (was auch passiert). Aber scheinbar werden die I-Frames bei der "ruhigen" Szene in deutlich mehr kleine Makroblöcke der Größe 4x4 unterteilt, als bei der "unruhigen" Szene. Dadurch werden die i-Frames größer und somit aus das komplette File. Ich frage mich nur, warum bei der ruhige Szene so viele Blöcke in 4x4 aufgeteilt werden. Vielleicht jemand von Euch eine Idee dazu.

Hier ein paar Daten die der Codec ausspuckt, Profil war High und Level war 3.0:

Szene mit viel Bewegung, Filegröße etwa 2034 Kb:
[libx264 @ 0x7f99841ce540] frame I:103 Avg QP:32.64 size: 10292
[libx264 @ 0x7f99841ce540] frame P:522 Avg QP:36.86 size: 1467
[libx264 @ 0x7f99841ce540] frame B:400 Avg QP:40.37 size: 642
[libx264 @ 0x7f99841ce540] consecutive B-frames: 22.0% 78.0%
[libx264 @ 0x7f99841ce540] mb I I16..4: 28.9% 51.6% 19.6%
[libx264 @ 0x7f99841ce540] mb P I16..4: 3.5% 6.4% 0.6% P16..4: 21.0% 3.0% 1.3% 0.0% 0.0% skip:64.2%
[libx264 @ 0x7f99841ce540] mb B I16..4: 0.7% 1.6% 0.0% B16..8: 17.8% 1.6% 0.2% direct: 0.5% skip:77.6% L0:34.6% L1:63.6% BI: 1.8%
[libx264 @ 0x7f99841ce540] final ratefactor: 31.53
[libx264 @ 0x7f99841ce540] 8x8 transform intra:55.5% inter:88.1%
[libx264 @ 0x7f99841ce540] coded y,uvDC,uvAC intra: 43.6% 45.9% 6.7% inter: 3.3% 4.9% 0.0%
[libx264 @ 0x7f99841ce540] i16 v,h,dc,p: 20% 37% 4% 39%
[libx264 @ 0x7f99841ce540] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 21% 19% 14% 8% 7% 7% 8% 8% 8%
[libx264 @ 0x7f99841ce540] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 28% 32% 10% 5% 5% 5% 6% 5% 5%
[libx264 @ 0x7f99841ce540] i8c dc,h,v,p: 70% 16% 12% 3%
[libx264 @ 0x7f99841ce540] Weighted P-Frames: Y:12.5% UV:0.6%
[libx264 @ 0x7f99841ce540] ref P L0: 70.4% 13.6% 11.4% 4.2% 0.4%
[libx264 @ 0x7f99841ce540] ref B L0: 88.9% 11.1%
[libx264 @ 0x7f99841ce540] kb/s:406.32

Szene mit wenig Bewegung, Filesize etwa 2152 Kb:
[libx264 @ 0x7f0ffc1ce540] frame I:103 Avg QP:24.79 size: 19355
[libx264 @ 0x7f0ffc1ce540] frame P:512 Avg QP:28.03 size: 316
[libx264 @ 0x7f0ffc1ce540] frame B:410 Avg QP:33.10 size: 116
[libx264 @ 0x7f0ffc1ce540] consecutive B-frames: 20.0% 80.0%
[libx264 @ 0x7f0ffc1ce540] mb I I16..4: 29.4% 41.7% 28.9%
[libx264 @ 0x7f0ffc1ce540] mb P I16..4: 0.3% 0.1% 0.0% P16..4: 7.5% 0.3% 0.3% 0.0% 0.0% skip:91.5%
[libx264 @ 0x7f0ffc1ce540] mb B I16..4: 0.0% 0.0% 0.0% B16..8: 4.7% 0.0% 0.0% direct: 0.1% skip:95.1% L0:12.4% L1:87.1% BI: 0.4%
[libx264 @ 0x7f0ffc1ce540] final ratefactor: 23.93
[libx264 @ 0x7f0ffc1ce540] 8x8 transform intra:41.3% inter:75.7%
[libx264 @ 0x7f0ffc1ce540] coded y,uvDC,uvAC intra: 58.9% 72.7% 38.2% inter: 0.1% 3.3% 1.0%
[libx264 @ 0x7f0ffc1ce540] i16 v,h,dc,p: 6% 40% 1% 53%
[libx264 @ 0x7f0ffc1ce540] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 30% 29% 7% 5% 4% 4% 6% 5% 10%
[libx264 @ 0x7f0ffc1ce540] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 28% 43% 6% 3% 3% 4% 5% 4% 5%
[libx264 @ 0x7f0ffc1ce540] i8c dc,h,v,p: 50% 28% 16% 5%
[libx264 @ 0x7f0ffc1ce540] Weighted P-Frames: Y:0.0% UV:0.0%
[libx264 @ 0x7f0ffc1ce540] ref P L0: 82.2% 2.7% 11.0% 4.1%
[libx264 @ 0x7f0ffc1ce540] ref B L0: 75.7% 24.3%
[libx264 @ 0x7f0ffc1ce540] kb/s:429.87

Viele Grüße,
lackylax
 
Ich verstehe deine Verwirrung. Einzige halbswegs logische Erklärung welche mir einfällt: Vielleicht weil man in "ruhigen" Szenen mehr "Präzision" wahrnehmen als in einer hektischen Bewegung ?!

Ist aber nur halbes Halbwissen. Ich glaube mit dieser Frage bist du in einem speziellerem Forum zum Thema besser aufgehoben...
 
Ich denke auch, dass das mit den PSY-Optimierungen zusammenhängt. Bei schnellen Bewegungen fallen fehlende Details viel weniger auf als bei ruhigen Szenen. Du könntest ja mal testweise die no-psy Option benutzen und dann vergleichen.
 
Wenn du keine weiteren Parameter übergibst, arbeitet x264 (darum geht's ja hier) im CRF-Modus. Und wie Fidikus schreibt, ist der Algorithmus wohl der Meinung, dass man bei wenig Bewegung (!= keine Bewegung) mehr Kompressionsartefakte wahrnimmt als bei schnelleren Szenen, bei denen aber die scheinbar niedrige Bitrate trotzdem ein gewisses Qualitätsniveau halten kann. Da liegt wohl irgendwo der Break-Even.

Das sollte man auch daran sehen, dass richtige Standbilder (oder synthetische Videos mit wenig Spielraum bei den Farben) sehr stark komprimiert werden.
 
ich weiß es zwar auch nicht, aber mein erster gedanke war genau das was Fidikus auch schon geschrieben hat. I ruihgeren szenen fallen kleine bewegungen/veränderungen viel stärker auf.
 
Ok, das klingt schon mal einleuchtend. Auf jeden Fall schon Mal Danke für das schnelle und zahlreiche Feedback! :-)
 
Zurück
Oben