Transformation und Codierung

In diesem Kapitel beschäftigen wir uns mit den Teilen der Kompression, die nichts mit der zeitlichen Abhängigkeit zwischen mehreren Bildern zu tun haben. Der Videocodec tut hier das, was ein JPEG-Encoder mit einem einzelnen digitalen Foto macht. Tatsächlich gibt es eine Familie von Videoformaten namens Motion-JPEG, die einen Film als rasante Diashow von JPEG-Bildern speichern.

Farbräume

RGB

Das menschliche Auge besitzt Rezeptoren für drei Primärfarben: Rot, Grün und Blau (RGB). Das gesamte Farbspektrum, das wir wahrnehmen können, besteht aus Kombinationen dieser drei Farbtöne. Digitale Fernseher, Computermonitore und im Wesentlichen auch Digitalkameras orientieren sich an den Vorgaben der Natur. Entsprechend ist der RGB-Farbraum überall zu finden. Auch Videos beginnen ihr Leben in RGB oder zumindest einer sehr nah verwandten Form.

RGB ist additiv, d.h. reines Rot kombiniert mit reinem Grün kombiniert mit reinem Blau ergibt reines Weiß.

Um genügend Farbabstufungen für glatte Übergänge abbilden zu können, wird jede Komponente in einem Byte gespeichert, sodass ein Pixel 3 Byte = 24 Bit Platz benötigt. Sehen wir uns ein verkleinertes Beispielbild aus dem Film Big Buck Bunny an.

normales RGB: ca. 45 KByte

Die Dateigröße im PNG-Format werden wir als groben Anhaltspunkt für die Komprimierbarkeit verschiedener Farbräume benutzen. Das dient rein zur Veranschaulichung der Ideen hinter den Farbräumen. Interpretiert in die Größen bitte nicht mehr als ein generelles größer/kleiner hinein.

Die drei Farbkanäle, aus denen sich das Bild zusammensetzt, sehen folgendermaßen aus:

getrennte RGB-Kanäle: ca. 55 KByte

Die Trennung sehen wir am besten am knallroten Apfel. Der R-Kanal ist extrem hell und die G- und B-Kanäle deutlich dunkler. Da wir nach wie vor drei Farbkomponenten haben, braucht jedes unkomprimierte Pixel immer noch 24 Bit Speicherplatz: 8 Bit für jeden Kanal.

Das Bild zeigt auch, dass alle drei Kanäle eine ähnliche Komplexität (Detailreichtum) aufweisen. Entsprechend wenig aufregend ist die Dateigröße. Die Primärfarben zu trennen, bringt uns dem besser komprimierbaren Bild nicht näher.

Eigentlich müssten die drei Kanäle entsprechend ihrer Primärfarbe rot, grün und blau eingefärbt sein. In Graustufen kommen aber die Unterschiede und Gemeinsamkeiten zwischen den Kanälen viel besser zur Geltung.

YUV und YCbCr

Kommen wir zurück zum menschlichen Auge. Neben den Rezeptoren für Farben (Zapfen) gibt es Rezeptoren für die Helligkeit (Stäbchen). Genauso sind die Farbräume aus der klassischen analogen Fernsehtechnik (YUV) und ihre digitalen Pendants (YCbCr) aufgebaut: Jedes Pixel wird in einen Helligkeitskanal (Luma) und drei Farbdifferenzkanäle (Chroma) zerlegt. »Differenz« heißt, dass jedes Pixel eines Farbkanals die gewichtete Differenz zum entsprechenden Wert im Helligkeitskanal speichert.

RGB lässt sich nahezu verlustlos (bis auf Rundungsfehler) zu YCbCr konvertieren. Tun wir das für unser Beispielbild, erhalten wir folgendes Ergebnis:

Kanäle des YCbCr-Farbraums: ca. 35 KByte

Y steht für den Lumakanal (die Helligkeit), Cb und Cr für den blauen und roten Chromakanal. Implizit gibt es auch einen Grünkanal (Cg). Doch wenn wir die Werte für Luma und zwei Chromas kennen, lässt sich der Wert für den dritten Chromakanal berechnen. Deswegen werden nur Cb und Cr gespeichert.

Alle Kanäle haben die volle Auflösung, was als 4:4:4-Sampling bezeichnet wird. Deswegen beträgt der nötige Speicherplatz pro unkomprimiertem Pixel weiterhin 24 Bit. Wir speichern lediglich anstatt drei Primärfarben einen Wert für die Helligkeit und zwei Farbdifferenzen. Die komprimierte Dateigröße ist dagen schon deutlich kleiner als das ursprüngliche RGB-Bild. Das liegt daran, dass ein Großteil der harten Kontraste im Lumakanal konzentriert ist. Die Chromakanäle zeichnen sich dagegen durch große, gleichmäßige Flächen aus: ein Vorteil für die Komprimierung.

YCbCr erlaubt es uns, eine Besonderheit des menschlichen Auges auszunutzen. Für Kontraste sind wir nämlich weit empfindlicher als für Farben. Deshalb werden die weniger wichtigen Chromakanäle mit geringerer Genauigkeit gespeichert und dadurch Platz gespart. Das zeigt die folgende Abbildung.

Kanäle des YV12-Farbraums: ca. 25 KByte

Beide Chromakanäle haben nur noch ein Viertel der Auflösung. Dadurch enthalten sie auch weniger Details. Wir haben also verlustbehaftet gearbeitet, weil einige Informationen unwiederbringlich verloren gegangen sind. Der Verlust macht sich allerdings nur manchmal bei Rot-Tönen bemerkbar. Die Farbunempfindlichkeit des Auges gilt offenbar für Rot weniger als für Grün und Blau. Deshalb neigen alle MPEG-Codecs bei Szenen mit hohem Rotanteil und starken Kontrasten schon früh zur Bildung von Artefakten. Paradebeispiel ist der Abspann von Blade mit rotem Text auf schwarzem Hintergrund. Zum Ausgleich benötigt jedes unkomprimierte Pixel im Durchschnitt nur noch 12 Bit Speicherplatz, und auch die komprimierte Größe ist noch einmal ein gutes Stück gesunken.

Wie die kleinere Farbauflösung entsteht, ist für alle verbreiteten Videoformate genau festgelegt. Seit MPEG-2 gilt das Verfahren aus der folgenden Abbildung, die einen 4×4 Pixel großen Bildausschnitt darstellt.

Links sehen wir das 4:4:4-Sampling. Jedes Pixel hat ein Luma-Sample und ein Chroma-Sample (bestehend aus Cb und Cr). Rechts daneben ist der Farbraum YV12 mit 4:2:0-Sampling dargestellt, der sowohl auf der DVD und Blu-ray als auch im fertigen Encoding verwendet wird. Jedes Pixel hat weiterhin sein eigenes Luma-Sample. Dagegen teilen sich jeweils die Pixel eines 2×2-Blocks dasselbe Chroma-Sample. Dieses wird als Mittel aus dem Chroma der beiden linken Pixel errechnet.

Die Konvertierung von RGB zu YV12 geschieht noch außerhalb des Video-Encoders. Für Blu-ray- und DVD-Backups hat das Quellmaterial schon den richtigen Farbraum. Ansonsten erledigen wir die Umwandlung mit VapourSynth oder AviSynth.

Pixelblocks und Transformation

Nach dem Wechsel des Farbraums können wir uns nun mit dem Inhalt des Bildes beschäftigen. Alle gängigen Codecs zerlegen ein Bild nicht in einzelne Pixel, sondern in Pixelblocks, die für MPEG-4 ASP (Xvid, DivX) 8×8 Pixel und für die moderneren Formate H.264 und HEVC (x264, x265) 4×4 oder 2×2 Pixel groß sind.

Je mehr Bitrate (Speicherplatz) wir unserem Film gönnen, desto mehr bleibt pro Block übrig und desto mehr Details können erhalten bleiben. Sinkt die Bitrate zu weit, besteht ein Block im Extremfall nur noch aus einer einzelnen Farbe. Spätestens dann werden im Bild die »Riesenpixel« sichtbar, die man von schlechten Encodings kennt.

Unglücklicherweise enthält ein Block Daten in der räumliche Dimension, d.h. er gibt Auskunft über die Helligkeits- und Farbverteilung innerhalb einer rechteckigen Fläche. Daraus lässt sich kaum eine brauchbare Aussage über wichtige und unwichtige Bilddetails ableiten. Genau das benötigen wir aber, um nur die Details zu entfernen, die nicht wahrnehmbar sind. Deshalb müssen wir den Makroblock in eine andere, passende, Dimension transformieren. MPEG-4 ASP nutzt dafür die diskrete Kosinustransformation (DCT). H.264 und HEVC verwenden eine Annäherung an die DCT, die nur mit ganzen Zahlen arbeitet und dadurch Rundungsfehler vermeidet.

Wer tiefer in die Mathematik der DCT einsteigen will, sollte einen Blick auf den Artikel von Ethanolix und Videostation werfen, der sich im Anhang von Selurs Wissenswertes rund um Xvid findet. Genauso gut eignet sich die englische Artikelserie Transforms for Video Compression von Mike Perkins.

Alle Blockgrößen funktionieren nach demselben Prinzip. Der Einfachheit halber konzentrieren wir uns auf 8×8-Blocks.

Die DCT rechnet den Block in die Frequenzdimension um. Er behält dabei seine 8×8-Matrixstruktur, nur dass die 64 Einträge nach der Transformation keine räumlichen Informationen mehr beinhalten, sondern Frequenzkoeffizienten. Links oben stehen die niedrigsten und rechts unten die höchsten Frequenzen.

Damit sind wir am Ziel, denn jetzt können wir Aussagen über die Wichtigkeit einzelner Einträge im Block treffen. Die niedrigsten Frequenzen repräsentieren die extrem wichtigen groben Strukturen im Bild (z.B. die rechteckige Form einer Tischplatte). Wenn die nicht zum größten Teil unverfälscht bleiben, wird die Bildqualität schnell zu schlecht. Die höchsten Frequenzen dagegen stehen für feine Strukturen (z.B. die Details der Holzmaserung der Platte), die vergleichsweise wenig zur Qualität beitragen. Die Bedeutung der Koeffizienten für die Bildqualität nimmt also von links oben nach rechts unten kontinuierlich ab. Diese Eigenschaft macht sich die Quantisierung zunutze.

Quantisierung

Allgemein bildet eine Quantisierung einen Quell-Wertebereich auf einen kleineren Ziel-Wertebereich ab. Da das Ergebnis weniger verschiedene Werte enthält, lässt es sich besser komprimieren. Beim Videoencoding setzt die Quantisierung am DCT-transformierten Block an. Hinter den Kulissen ist einiges an Mathematik versteckt, für die praktische Encoderkonfiguration begegnet uns die Quantisierung in zwei Formen.

  • Der Quantizer dient als eine Art Kompressionsfaktor. Jeder Wert des transformierten Blocks wird durch den Quantizer geteilt. Dadurch entstehen Richtung unten rechts im Block zunehmend längere Ketten an Nullen. Je größer der Quantizer, desto mehr wird genullt und desto höher ist der Informationsverlust aber auch die Kompression.
  • Quantisierungsmatrizen sind v.a. für MPEG-4 ASP wichtig. In den moderneren Formaten gibt es sie zwar auch, dort spielen sie aber keine entscheidende Rolle mehr. Eine Quantisierungsmatrix besteht, dem Makroblock entsprechend, aus 64 Werten, angeordnet in 8 Zeilen zu je 8 Spalten. Je höher die enthaltenen Werte, desto mehr Details werden an dieser Stelle des Blocks vernichtet. Nahezu alle Matrizen sind entsprechend der Bedeutung der Frequenzen im Block aufgebaut. Sie enthalten von links oben nach rechts unten immer größere Werte und komprimieren damit die weniger wichtigen Frequenzen unten rechts stärker als die wichtigen oben links.

Quantizer und Matrix werden gemeinsam angewendet. Der Quantizer dient dabei als Multiplikator für jeden Wert in der Matrix. Er ist also die grobe Stellschraube für die Stärke des Informationsverlusts, während die Matrix zur Feinabstimmung dient.

Unser Einzelbild besteht nun aus einer Menge an DCT-transformierten und quantisierten Makroblocks, aus denen mal mehr, mal weniger Details entfernt wurden. Um das Bild später wieder anzeigen zu können, müssen sowohl die Quantisierung als auch die Transformation rückgängig gemacht werden, wofür die inverse diskrete Kosinustransformation (iDCT) zuständig ist. Da wir verlustbehaftet arbeiten, entspricht der wiederhergestellte Makroblock nicht exakt dem Original. Ob der Unterschied sichtbar ist – d.h. wie gut sich das Ergebnis ans Original annähert – hängt im Wesentlichen von der Stärke der Quantisierung ab.

Betrachten wir das Ergebnis einer DCT-Codierung und Quantisierung, durchgeführt vom Xvid-Encoder.

Ganz links sehen wir stark vergrößert den ursprünglichen 8×8 Pixel großen Block, rechts daneben die komprimierte Version. Besonders in der linken unteren Ecke sind deutlich die Unterschiede zum Original zu erkennen, allerdings nur in der Vergrößerung. Die Blocks in Originalgröße (rechts) sehen sich schon zum Verwechseln ähnlich.

Entropiecodierung

Soviel wir bisher auch verändert und umgerechnet haben, der Makroblock besteht trotzdem noch aus 8 × 8 = 64 Werten, d.h. wir haben noch nicht ein einziges Byte an Größe gespart. Die eigentliche Kompression geschieht erst jetzt bei der Entropiecodierung. Das ist das, was Rar, Zip und alle anderen Dateipacker tun; das, was wir weiter vorne als verlustlose Kompression kennen gelernt haben. So bedeutend der Unterschied zwischen verlustlos und verlustbehaftet also ist, so bedienen sich doch beide Verfahren derselben Werkzeuge. Die Arbeitsschritte der reinen verlustlosen Kompression sehen so aus:

Originaldaten ⇒ Kompression.

Die verlustbehaftete Kompression tut im Prinzip genau das gleiche, nur füttert sie den Kompressor nicht mit den Originaldaten, sondern mit einer vor-verarbeiteten Version davon, deren Informationsdichte deutlich geringer ist:

Originaldaten ⇒ Informationsentfernung ⇒ Kompression.

Je geringer die Informationsdichte, desto kleiner werden die komprimierten Daten. Kommen wir zurück zu unserem Makroblock. In seinem Ursprungszustand besteht der aus 64 recht verschiedenen, vergleichsweise schlecht komprimierbaren Werten. Nach Transformation und Quantisierung enthält der Block lange Ketten von Nullen, und die lassen sich hervorragend schrumpfen.

Wir können jetzt also einzelne Bilder komprimieren und wiederherstellen, was für ein Video prinzipiell schon ausreicht. Allerdings bieten die Zusammenhänge zwischen verschiedenen Bildern ein gewaltiges Potenzial, um die Dateigröße weiter zu schrumpfen.

zuletzt aktualisiert: 29.05.2016

Kommentare