Wie der Videocodec funktioniert. Teil 2. Was, warum, wie

Teil I: Video- und Bildgrundlagen




Kodeks Geschichte

Was denn Ein Video-Codec ist eine Software / Hardware, die digitales Video komprimiert und / oder dekomprimiert.

Wofür? Trotz einiger Einschränkungen in Bezug auf die Bandbreite,
Und was den Speicherplatz angeht, verlangt der Markt immer mehr qualitativ hochwertige Videos. Erinnern Sie sich, wie wir im letzten Beitrag das erforderliche Minimum für 30 Bilder pro Sekunde, 24 Bit pro Pixel, mit einer Auflösung von 480 x 240 berechnet haben? Empfing 82.944 Mbit / s ohne Komprimierung. Die Komprimierung ist die einzige Möglichkeit, HD / FullHD / 4K auf Fernsehbildschirme und das Internet zu übertragen. Wie wird das erreicht? Jetzt werden wir kurz die Hauptmethoden betrachten.
EDISON Software - Webentwicklung
Die Übersetzung wurde mit Unterstützung von EDISON Software erstellt.

Wir beschäftigen uns mit der Integration von Videoüberwachungssystemen und der Entwicklung eines Mikrotomographen .

Codec gegen Container


Ein häufiger Anfängerfehler besteht darin, einen digitalen Videocodec und einen digitalen Videocontainer zu verwechseln. Ein Container hat ein bestimmtes Format. Ein Wrapper mit Video-Metadaten (und möglicherweise Audio). Komprimiertes Video kann als Container-Nutzlast betrachtet werden.

In der Regel gibt eine Videodateierweiterung einen Containertyp an. Beispielsweise ist die Datei video.mp4 höchstwahrscheinlich ein MPEG-4 Part 14- Container, und die Datei video.mkv ist höchstwahrscheinlich eine russische Puppe . Sie können FFmpeg oder MediaInfo verwenden, um sich im Codec- und Container-Format voll und ganz sicher zu fühlen .

Ein bisschen Geschichte


Bevor wir zu Wie kommen? Tauchen wir ein bisschen in die Geschichte ein, um ein bisschen mehr über einige alte Codecs zu erfahren.

Der H.261 -Videocodec erschien 1990 (technisch gesehen 1988) und wurde für eine Datenübertragungsrate von 64 Kbit / s entwickelt. Es wurden bereits Ideen wie Farbunterabtastung, Makroblöcke usw. verwendet. 1995 wurde der Video-Codec-Standard H.263 veröffentlicht, der sich bis 2001 entwickelte.

Im Jahr 2003 wurde die erste Version von H.264 / AVC fertiggestellt. Im selben Jahr veröffentlichte TrueMotion seinen kostenlosen Video-Codec, der verlustbehaftetes Video mit dem Namen VP3 komprimiert. 2008 kaufte Google diese Firma und brachte im selben Jahr VP8 heraus . Im Dezember 2012 veröffentlichte Google VP9 und es wird in etwa ¾ des Browsermarktes (einschließlich mobiler Geräte) unterstützt.

AV1 ist ein neuer kostenloser Open-Source-Videocodec, der von der Open Media Alliance ( AOMedia ) entwickelt wurde und zu dem bekannte Unternehmen wie Google, Mozilla, Microsoft, Amazon, Netflix, AMD, ARM, NVidia, Intel und Cisco gehören . Die erste Version des Codec 0.1.0 wurde am 7. April 2016 veröffentlicht.

Geburt von AV1


Anfang 2015 arbeitete Google an VP10 , Xiph (das zu Mozilla gehört) arbeitete an Daala und Cisco erstellte seinen kostenlosen Video-Codec namens Thor .

Dann kündigte MPEG LA zunächst jährliche Grenzwerte für HEVC ( H.265 ) und eine 8-fach höhere Gebühr als für H.264 an, änderte jedoch bald die Regeln erneut:

kein Jahreslimit,
Inhaltsgebühr (0,5% des Umsatzes) und
Die Stückkosten sind etwa zehnmal höher als bei H.264.

Die Open Media Alliance wurde von Unternehmen aus verschiedenen Bereichen gegründet: Geräteherstellern (Intel, AMD, ARM, Nvidia, Cisco), Inhaltsanbietern (Google, Netflix, Amazon), Browsern (Google, Mozilla) und anderen.

Die Unternehmen hatten ein gemeinsames Ziel - einen Videocodec ohne Lizenzgebühren. Dann kommt AV1 mit einer wesentlich einfacheren Patentlizenz. Timothy B. Terriberry hielt eine beeindruckende Präsentation ab, aus der das aktuelle Konzept von AV1 und seines Lizenzmodells hervorging.

Sie werden überrascht sein zu erfahren, dass Sie den AV1-Codec über einen Browser analysieren können (Interessenten können zu aomanalyzer.org gehen).

Bild

Universeller Codec


Analysieren wir die grundlegenden Mechanismen, die dem universellen Videocodec zugrunde liegen. Die meisten dieser Konzepte sind nützlich und werden in modernen Codecs wie VP9 , AV1 und HEVC verwendet . Ich warne Sie, dass vieles, was erklärt wird, vereinfacht wird. Gelegentlich werden reale Beispiele verwendet (wie dies bei H.264 der Fall ist), um Technologie zu demonstrieren.

1. Schritt - Aufteilen des Bildes


Der erste Schritt besteht darin, den Frame in mehrere Abschnitte, Unterabschnitte und mehr zu unterteilen.

Bild

Wofür? Gründe gibt es viele. Wenn wir das Bild teilen, können wir den Bewegungsvektor mit kleinen Abschnitten für kleine bewegliche Teile genauer vorhersagen. Bei einem statischen Hintergrund können Sie sich auf größere Abschnitte beschränken.

In der Regel organisieren Codecs diese Abschnitte in Abschnitte (oder Fragmente), Makroblöcke (oder Blöcke eines Codierungsbaums) und viele Unterabschnitte. Die maximale Größe dieser Partitionen variiert, HEVC legt 64 x 64 fest, während AVC 16 x 16 verwendet und Unterabschnitte bis zu 4x4 aufgeteilt werden können.

Erinnern Sie sich an die Rahmenvarianten aus dem letzten Artikel ?! Dasselbe kann auf Blöcke angewendet werden, also können wir ein I-Fragment, einen B-Block, einen P-Makroblock usw. haben.

Sehen Sie für diejenigen, die üben möchten, wie das Bild in Abschnitte und Unterabschnitte unterteilt wird. Zu diesem Zweck können Sie den Intel Video Pro Analyzer verwenden, der bereits in einem früheren Artikel erwähnt wurde (der kostenpflichtig ist, aber eine kostenlose Testversion enthält, die auf die ersten 10 Bilder beschränkt ist). Die Abschnitte von VP9 werden hier analysiert:

Bild

2. Schritt - Prognose


Sobald wir Abschnitte haben, können wir astrologische Vorhersagen darüber machen. Für die INTER-Vorhersage ist es notwendig, Bewegungsvektoren und den Rest zu übertragen, und für die INTRA-Vorhersage werden die Richtung der Vorhersage und der Rest übertragen.

3. Schritt - Konvertierung


Nachdem wir den Restblock erhalten haben (den vorhergesagten Abschnitt → den realen Abschnitt), ist es möglich, ihn so zu transformieren, dass wir wissen, welche Pixel verworfen werden können, während die Gesamtqualität erhalten bleibt. Es gibt einige Transformationen, die genaues Verhalten liefern.

Obwohl es andere Methoden gibt, wollen wir die diskrete Cosinustransformation ( DCT - from discrete cosine transform ) genauer betrachten. Hauptmerkmale von DCT:

  • Konvertiert Pixelblöcke in gleich große Frequenzkoeffizientenblöcke.
  • Versiegelt die Stromversorgung und hilft, räumliche Redundanzen zu beseitigen.
  • Bietet Reversibilität.

2. Februar 2017 Sintra R.J. (Cintra, RJ) und Bayer F.M. (Bayer FM) veröffentlichte einen Artikel zur DCT-ähnlichen Konvertierung für die Bildkomprimierung, der nur 14 Zusätze erfordert.

Machen Sie sich keine Sorgen, wenn Sie die Vorteile der einzelnen Artikel nicht verstehen. Anhand konkreter Beispiele werden wir nun ihren wahren Wert überprüfen.

Nehmen wir einen 8x8 Pixel Block wie folgt:

Bild

Dieser Block wird 8 mal 8 Pixel in das folgende Bild gerendert:

Bild

Wenden Sie DCT auf diesen Pixelblock an und erhalten Sie einen Koeffizientenblock der Größe 8x8:

Bild

Und wenn wir diesen Koeffizientenblock rendern, erhalten wir das folgende Bild:

Bild

Wie Sie sehen können, entspricht dies nicht dem Originalbild. Möglicherweise stellen Sie fest, dass sich der erste Koeffizient von allen anderen stark unterscheidet. Dieser erste Koeffizient ist als DC-Koeffizient bekannt, der alle Abtastwerte in der Eingabematrix darstellt, ähnlich wie der Durchschnittswert.

Dieser Koeffizientenblock hat eine interessante Eigenschaft: Er trennt hochfrequente von niederfrequenten Komponenten.

Bild

Im Bild ist der größte Teil der Leistung auf niedrigere Frequenzen konzentriert. Wenn Sie daher das Bild in seine Frequenzkomponenten umwandeln und die höheren Frequenzkoeffizienten verwerfen, können Sie die zur Beschreibung des Bildes erforderliche Datenmenge reduzieren, ohne die Bildqualität zu stark zu beeinträchtigen.
Frequenz bedeutet, wie schnell sich das Signal ändert.
Versuchen wir, die im Testbeispiel gewonnenen Erkenntnisse anzuwenden, indem wir das Originalbild mit DCT in seine Frequenz (Koeffizientenblock) umwandeln und dann einige der unwichtigsten Koeffizienten verwerfen.

Konvertieren Sie es zunächst in den Frequenzbereich.

Bild

Als nächstes verwerfen wir einen Teil (67%) der Koeffizienten, hauptsächlich die untere rechte Seite.

Bild

Schließlich stellen wir das Bild aus diesem verworfenen Koeffizientenblock wieder her (denken Sie daran, es muss umkehrbar sein) und vergleichen es mit dem Original.

Bild

Wir sehen, dass es dem Originalbild ähnelt, aber es gibt viele Unterschiede zum Original. Wir haben 67,1875% und haben immer noch etwas, das der ursprünglichen Quelle ähnelt. Sie können die Koeffizienten bewusster verwerfen, um ein noch besseres Bild zu erhalten. Dies ist jedoch das nächste Thema.

Jeder Koeffizient wird mit allen Pixeln erzeugt.



Wichtig: Jeder Koeffizient wird nicht direkt auf einem Pixel angezeigt, sondern ist eine gewichtete Summe aller Pixel. Diese erstaunliche Grafik zeigt, wie der erste und der zweite Koeffizient unter Verwendung von Gewichten berechnet werden, die für jeden Index eindeutig sind.

Bild

Sie können auch versuchen, DCT zu visualisieren, indem Sie eine einfache darauf basierende Bildgebung betrachten. Zum Beispiel ist hier das Symbol A, das mit jedem Koeffizientengewicht erzeugt wird:

Bild


4. Schritt - Quantisierung


Nachdem wir im vorherigen Schritt einige Koeffizienten weggeworfen haben, erstellen wir im letzten Schritt (Transformation) eine spezielle Quantisierungsform. Zu diesem Zeitpunkt ist es zulässig, Informationen zu verlieren. Oder einfacher gesagt, wir werden die Koeffizienten quantisieren, um eine Komprimierung zu erreichen.

Wie kann ein Koeffizientenblock quantisiert werden? Eine der einfachsten Methoden wird die einheitliche Quantisierung sein, wenn wir einen Block nehmen, durch einen Wert (durch 10) teilen und abrunden, was passiert ist.

Bild

Können wir diesen Koeffizientenblock umkehren? Ja, wir können, indem wir mit demselben Wert multiplizieren, durch den wir dividiert haben.

Bild

Dieser Ansatz ist nicht der beste, da er nicht die Bedeutung jedes Koeffizienten berücksichtigt. Man könnte die Quantisierermatrix anstelle eines einzelnen Werts verwenden, und diese Matrix könnte die DCT-Eigenschaft verwenden, um die Mehrheit der unteren rechten und die Minderheit der oberen linken zu quantisieren.

5-Stufen-Entropie-Codierung


Nachdem wir die Daten (Bildblöcke, Fragmente, Rahmen) quantisiert haben, können wir sie immer noch ohne Verlust komprimieren. Es gibt viele algorithmische Möglichkeiten, Daten zu komprimieren. Wir werden einige von ihnen kurz kennenlernen. Zum besseren Verständnis lesen Sie das Buch „ Komprimierung verstehen: Datenkomprimierung für moderne Entwickler “ („ Komprimierung verstehen: Datenkomprimierung für moderne Entwickler “).

Videokodierung mit VLC


Angenommen, wir haben einen Zeichenstrom: a , e , r und t . Die Wahrscheinlichkeit (im Bereich von 0 bis 1), wie oft jedes Symbol im Stream vorkommt, ist in dieser Tabelle dargestellt.
aert
Wahrscheinlichkeit0,30,30,20,2
Wir können eindeutige Binärcodes (vorzugsweise kleine) den wahrscheinlichsten und größere Codes den unwahrscheinlichsten zuordnen.
aert
Wahrscheinlichkeit0,30,30,20,2
Binärcode0101101110
Wir komprimieren den Stream unter der Annahme, dass wir am Ende 8 Bits für jedes Zeichen ausgeben. Ohne Komprimierung eines Zeichens wären 24 Bits erforderlich. Wenn jedes Zeichen durch seinen Code ersetzt wird, erhalten wir Einsparungen!

Der erste Schritt ist das Codieren des Zeichens e , das 10 ist, und des zweiten Zeichens a , das (nicht mathematisch) hinzugefügt wird: [10] [0] und schließlich des dritten Zeichens t , das unseren endgültigen komprimierten Bitstrom gleich macht [10] [0] [1110] oder 1001110 , für die nur 7 Bits erforderlich sind (3,4-mal weniger Speicherplatz als im Original).

Bitte beachten Sie, dass jeder Code ein eindeutiger Code mit einem Präfix sein muss. Der Huffman-Algorithmus hilft beim Auffinden dieser Zahlen. Obwohl diese Methode nicht fehlerfrei ist, gibt es Videocodecs, die diese algorithmische Methode zur Komprimierung anbieten.

Sowohl der Codierer als auch der Decodierer müssen Zugriff auf die Symboltabelle mit ihren Binärcodes haben. Daher ist es auch notwendig, eine Tabelle in der Eingabe zu senden.

Arithmetische Codierung


Angenommen, wir haben einen Strom von Zeichen: a , e , r , s und t , und ihre Wahrscheinlichkeit wird durch diese Tabelle dargestellt.
aerst
Wahrscheinlichkeit0,30,30,150,050,2
Mit dieser Tabelle erstellen wir Bereiche, die alle möglichen Zeichen enthalten, sortiert nach der größten Zahl.

Bild

Codieren wir nun einen Stream mit drei Zeichen: eat .

Wählen Sie zunächst das erste Zeichen e aus , das sich im Unterbereich von 0,3 bis 0,6 (ohne) befindet. Wir nehmen diesen Unterbereich und teilen ihn wieder in die gleichen Proportionen wie zuvor, jedoch bereits für diesen neuen Bereich.

Bild

Lassen Sie uns unseren Eat- Stream weiter codieren. Nun nehmen wir das zweite Zeichen a , das sich in dem neuen Unterbereich von 0,3 bis 0,39 befindet, und dann nehmen wir unser letztes Zeichen t und wiederholen denselben Vorgang erneut, um das letzte Unterband von 0,354 bis 0,372 zu erhalten.

Bild

Wir müssen nur eine Zahl im letzten Unterbereich von 0,354 bis 0,372 auswählen. Lassen Sie uns 0,36 wählen (aber Sie können jede andere Zahl in diesem Unterbereich wählen). Nur mit dieser Nummer können wir unseren ursprünglichen Fluss wiederherstellen. Es ist, als würden wir eine Linie innerhalb von Bereichen zeichnen, um unseren Stream zu kodieren.

Bild

Der umgekehrte Vorgang (also das Dekodieren ) ist genauso einfach: Mit unserer Zahl 0.36 und unserem Anfangsbereich können wir den gleichen Vorgang starten. Aber jetzt zeigen wir unter Verwendung dieser Nummer den Stream, der unter Verwendung dieser Nummer codiert wurde.

Beim ersten Bereich stellen wir fest, dass unsere Nummer einem Slice entspricht, daher ist dies unser erstes Zeichen. Jetzt teilen wir uns wieder dieses Teilband und führen den gleichen Vorgang wie zuvor durch. Hier sehen Sie, dass 0,36 dem Zeichen a entspricht , und nach Wiederholung des Vorgangs gelangen wir zum letzten Zeichen t (das unseren ursprünglich codierten Stream eat bildet ).

Sowohl der Codierer als auch der Decodierer müssen eine Tabelle mit Symbolwahrscheinlichkeiten haben, daher ist es erforderlich, diese in den Eingabedaten zu senden.

Ziemlich elegant, nicht wahr? Jemand, der sich diese Lösung ausgedacht hat, war verdammt schlau. Einige Video-Codecs verwenden diese Technik (oder bieten sie auf jeden Fall als Option an).

Die Idee ist, einen verlustfreien quantisierten Bitstrom zu komprimieren. Sicherlich gibt es in diesem Artikel nicht jede Menge Details, Gründe, Kompromisse usw. Wenn Sie jedoch Entwickler sind, sollten Sie mehr wissen. Neue Codecs versuchen, andere Entropiecodierungsalgorithmen wie ANS zu verwenden .

6-stufiges Bitstream-Format


Nach alledem müssen die komprimierten Frames im Rahmen der durchgeführten Schritte entpackt werden. Der Decoder muss ausdrücklich über die vom Encoder getroffenen Entscheidungen informiert werden. Dem Decoder sollten alle erforderlichen Informationen zur Verfügung gestellt werden: Bittiefe, Farbraum, Auflösung, Vorhersageinformationen (Bewegungsvektoren, Richtungs-INTER-Vorhersage), Profil, Pegel, Bildrate, Bildtyp, Bildnummer und vieles mehr.

Wir werden uns den H.264- Bitstream ansehen. Unser erster Schritt besteht darin, einen minimalen H.264-Bitstream zu erstellen (FFmpeg fügt standardmäßig alle Codierungsparameter wie SEI NAL hinzu - etwas weiter werden wir herausfinden, was es ist). Wir können dies mit unserem eigenen Repository und FFmpeg tun.

./s/ffmpeg -i /files/i/minimal.png -pix_fmt yuv420p /files/v/minimal_yuv420.h264

Dieser Befehl generiert einen unformatierten H.264- Bitstream mit einem Frame und einer Auflösung von 64 x 64 mit dem Farbraum YUV420 . Das folgende Bild wird als Rahmen verwendet.

Bild

H.264-Bitstream


Der AVC-Standard ( H.264 ) definiert, dass Informationen in Makrorahmen (im Verständnis des Netzwerks) gesendet werden, die als NAL bezeichnet werden (dies ist eine solche Ebene der Netzwerkabstraktion). Das Hauptziel von NAL ist die Bereitstellung einer "netzwerkfreundlichen" Videopräsentation. Dieser Standard sollte auf Fernsehgeräten (basierend auf Streams) und im Internet (basierend auf Paketen) funktionieren.

Bild

Es gibt eine Synchronisationsmarke zum Definieren der Grenzen von NAL-Elementen. Jeder Synchronisationsmarker enthält den Wert 0x00 0x00 0x01 mit Ausnahme des allerersten, nämlich 0x00 0x00 0x00 0x01. Wenn wir Hexdump für den generierten H.264-Bitstream ausführen, identifizieren wir mindestens drei NAL-Muster am Anfang der Datei.

Bild

Wie bereits erwähnt, muss der Decoder nicht nur die Bilddaten kennen, sondern auch die Details des Videos, des Rahmens, der Farbe, der verwendeten Parameter und vieles mehr. Das erste Byte jeder NAL definiert ihre Kategorie und ihren Typ.
NAL-TypenkennungBeschreibung
0Unbekannter Typ
1Codiertes Bildfragment ohne IDR
2Coded Slice Ein Datenabschnitt
3Coded Slice Data Abschnitt B
4C- codierter Schnittdatenabschnitt
5Codiertes IDR-Fragment eines IDR-Bildes
6Zusätzliche Informationen zur SEI-Erweiterung
7SPS-Sequenzparametersatz
8PPS-Bildparametersatz
9Zugriffsbegrenzer
10Ende der Sequenz
11Ende des Streams
......
Normalerweise ist der erste NAL-Bitstrom SPS . Diese Art von NAL ist für das Melden allgemeiner Codierungsvariablen wie Profil, Ebene, Auflösung und mehr verantwortlich.

Wenn wir das erste Synchronisationstoken überspringen, können wir das erste Byte dekodieren, um herauszufinden, welcher NAL-Typ der erste ist.

Das erste Byte nach der Synchronisationsmarke ist beispielsweise 01100111 , wobei sich das erste Bit ( 0 ) im Feld f orbidden_zero_bit befindet. Die nächsten 2 Bits ( 11 ) teilen uns das Feld nal_ref_idc mit, das angibt, ob dieses NAL ein Referenzfeld ist oder nicht. Die verbleibenden 5 Bits ( 00111 ) teilen uns das Feld nal_unit_type mit. In diesem Fall handelt es sich um einen SPS ( 7 ) -NAL-Block.

Das zweite Byte ( binär = 01100100 , hex = 0x64 , dez = 100 ) in der SPS-NAL ist das Feld profile_idc, das das vom Encoder verwendete Profil anzeigt. In diesem Fall wurde ein begrenztes hohes Profil verwendet (d. H. Ein hohes Profil ohne Unterstützung für ein bidirektionales B-Segment).

Bild

Wenn wir uns mit der Spezifikation des H.264- Bitstroms für SPS NAL vertraut machen, finden wir viele Werte für den Parameternamen, die Kategorie und die Beschreibung. Schauen wir uns beispielsweise die Felder pic_width_in_mbs_minus_1 und pic_height_in_map_units_minus_1 an .
ParameternameKategorieBeschreibung
pic_width_in_mbs_minus_10ue (v)
pic_height_in_map_units_minus_10ue (v)
Wenn wir mit den Werten dieser Felder einige mathematische Operationen durchführen, erhalten wir die Erlaubnis. Sie können sich 1920 x 1080 vorstellen, wenn Sie pic_width_in_mbs_minus_1 mit einem Wert von 119 ((119 + 1) * macroblock_size = 120 * 16 = 1920) verwenden . Auch hier wurde Platz gespart, anstatt 1920 mit 119 zu programmieren.

Wenn Sie unser erstelltes Video weiterhin in binärer Form überprüfen (zum Beispiel: xxd -b -c 11 v / minimal_yuv420.h264 ), können Sie zur letzten NAL gehen, die das Frame selbst ist.

Bild

Hier sehen wir die ersten 6-Byte-Werte: 01100101 10001000 10000100 00000000 00100001 11111111 . Da bekannt ist, dass das erste Byte den Typ der NAL angibt, handelt es sich in diesem Fall ( 00101 ) um ein IDR-Fragment (5), das dann weiter untersucht werden kann:

Bild

Unter Verwendung der Spezifikationsinformationen ist es möglich, den Fragmenttyp ( slice_type ) und die Bildnummer ( frame_num ) unter anderen wichtigen Feldern zu decodieren.

Um die Werte einiger Felder ( ue ( v ), me ( v ), se ( v ) oder te ( v )) zu erhalten, müssen wir das Fragment mit einem speziellen Decoder decodieren, der auf dem Golomb-Exponentialcode basiert. Diese Methode ist sehr effektiv für die Codierung variabler Werte, insbesondere wenn viele Standardwerte vorhanden sind.

Die Werte für slice_type und frame_num in diesem Video sind 7 (I-Fragment) und 0 (erstes Bild).

Bitstream kann als Protokoll betrachtet werden. Wenn Sie mehr über den Bitstream erfahren möchten, lesen Sie die ITU H.264- Spezifikation. Hier ist ein Makro, das zeigt, wo sich die Bilddaten befinden ( YUV in komprimierter Form).

Bild

Sie können andere Bitstreams wie VP9 , H.265 ( HEVC ) oder sogar unseren neuen besten AV1- Bitstream erkunden. Sind sie alle gleich? Nein, aber es ist viel einfacher, den Rest zu verstehen, wenn man sich mit mindestens einem befasst hat.

Willst du üben? Entdecken Sie den H.264-Bitstream


Sie können Einzelbildvideos generieren und mithilfe von MediaInfo den H.264- Bitstream untersuchen. Tatsächlich hindert Sie nichts daran, sich den Quellcode anzusehen, der den H.264 ( AVC ) -Bitstream analysiert.

Bild

Zum Üben können Sie Intel Video Pro Analyzer verwenden (ich habe bereits gesagt, dass das Programm kostenpflichtig ist, aber gibt es eine kostenlose Testversion mit einem Limit von 10 Bildern?).

Bild

Rückblick


Beachten Sie, dass viele moderne Codecs dasselbe Modell verwenden, das sie gerade gelernt haben. Schauen wir uns hier das Blockdiagramm des Thor- Video-Codecs an. Es enthält alle Schritte, die wir unternommen haben. In diesem Beitrag geht es darum, die Neuerungen und Dokumentationen in diesem Bereich zumindest besser zu verstehen.

Bild

Bisher wurde geschätzt, dass 139 GB Festplattenspeicher erforderlich sind, um eine einstündige Videodatei mit 720p und 30 fps Qualität zu speichern. Wenn Sie die in diesem Artikel beschriebenen Methoden verwenden (Inter-Frame- und interne Vorhersagen, Konvertierung, Quantisierung, Entropie-Codierung usw.), können Sie erreichen (vorausgesetzt, wir geben 0,031 Bit pro Pixel aus), dass das Video eine recht zufriedenstellende Qualität aufweist, die es in Anspruch nimmt Nur 367,82 MB, nicht 139 GB Arbeitsspeicher.

Wie erreicht H.265 ein besseres Kompressionsverhältnis als H.264?


Da Sie nun mehr über die Funktionsweise von Codecs wissen, ist es einfacher zu verstehen, wie neue Codecs mit weniger Bits eine höhere Auflösung bieten können.

Wenn Sie AVC und HEVC vergleichen , sollten Sie nicht vergessen, dass dies fast immer eine Wahl zwischen einer höheren CPU-Last und einem höheren Komprimierungsverhältnis ist.

HEVC bietet mehr Optionen für Abschnitte (und Unterabschnitte) als AVC , mehr Anweisungen für interne Vorhersagen, verbesserte Entropiecodierung und vieles mehr. All diese Verbesserungen machten H.265 in der Lage, 50% mehr als H.264 zu komprimieren.

Bild



Teil I: Video- und Bildgrundlagen






Lesen Sie auch den Blog
EDISON Unternehmen:


20 Bibliotheken für
spektakuläre iOS-Anwendung

Source: https://habr.com/ru/post/de480430/


All Articles