Cum funcționează un codec video. Partea 1. Noțiuni de bază

Partea a doua: Principiile de funcționare ale codec-ului video

Orice imagine raster poate fi reprezentată sub forma unei matrice bidimensionale . Când vine vorba de culori, ideea poate fi extinsă, considerând imaginea ca pe omatrice tridimensională , în care dimensiunile suplimentare sunt utilizate pentru a stoca date despre fiecare dintre culori.Dacă luăm în considerare culoarea finală ca o combinație a așa-numitelor culori de bază (roșu, verde și albastru), în matricea noastră tridimensională definim trei plane: primul pentru culoarea roșie, al doilea pentru verde și ultimul pentru albastru.

Vom numi fiecare punct din această matrice pixel (element al imaginii). Fiecare pixel conține informații despre intensitatea (de obicei sub formă de valoare numerică) fiecărei culori. De exemplu,
Cum funcționează un codec video. Partea 1. Noțiuni de bază
un pixel roșu înseamnă că are 0 verde, 0 albastru și maxim roșu. Un pixel de culoare roz poate fi format din combinația celor trei culori. Folosind o gamă numerică de la 0 la 255, pixelul roz este definit ca Roșu = 255 Verde = 192, Albastru = 203 și Articolul este publicat cu sprijinul companiei EDISON..

Cum funcționează un codec video. Partea 1. Noțiuni de bază

Dezvoltăm

aplicații pentru supravegherea video, streaming video , de asemenea, ne ocupăm cuînregistrarea video în sala de operație Modalități alternative de codare a imaginii color.

Pentru a reprezenta culorile din care este compusă imaginea, există și multe alte modele. De exemplu, se poate utiliza o paletă indexată, în care este necesar doar un byte pentru a reprezenta fiecare pixel, în loc de trei, necesare în modelul RGB. Într-un astfel de model se poate folosi o matrice 2D în loc de matricea 3D pentru a reprezenta fiecare culoare. Aceasta economisește memorie, dar oferă o gamă de culori mai mică.

RGB

Cum funcționează un codec video. Partea 1. Noțiuni de bază

De exemplu, priviți această imagine de mai jos. Prima față este complet colorată. Celelalte sunt planele roșie, verde și albastră (intensitatea culorilor corespunzătoare este arătată în nuanțe de gri).

De exemplu, priviți imaginea de mai jos. Fața principală este complet colorată. Celelalte sunt suprafețe roșie, verde și albastră (intensitatea culorilor corespunzătoare este arătată în gradația de gri).

Cum funcționează un codec video. Partea 1. Noțiuni de bază

Observăm că nuanțele de roșu din original vor fi în aceleași locuri în care se observă cele mai luminoase părți ale celui de-al doilea personaj. În timp ce contribuția culorii albastre poate fi văzută în principal doar în ochii lui Mario (ultimul personaj) și în elementele vestimentației sale. Observați unde cele trei planuri de culoare contribuie cel mai puțin (cele mai întunecate părți ale imaginilor) — acestea sunt mustățile lui Mario.

Pentru a stoca intensitatea fiecărei culori este necesar un anumit număr de biți — această mărime se numește adâncimea culorii. Să presupunem că se utilizează 8 biți (pe baza valorii de la 0 la 255) pentru un plan de culoare. Atunci avem o profunditate a culorii de 24 de biți (8 biți * 3 planuri R/G/B).

O altă proprietate a imaginii este rezoluția, care reprezintă numărul de pixeli într-o dimensiune. Adesea este denumită ca lățime × înălțime, după cum se arată mai jos în exemplul de imagine 4 la 4.
Cum funcționează un codec video. Partea 1. Noțiuni de bază

O altă proprietate cu care ne confruntăm lucrând cu imagini/Video este raportul de aspect, care descrie relația proporțională obișnuită între lățimea și înălțimea imaginii sau pixelului.

Atunci când se spune că un film sau o imagine are dimensiunea 16 la 9, de obicei se face referire la raportul de aspect al ecranului (DAR — de la Display Aspect Ratio). Cu toate acestea, pot exista forme diferite pentru pixeli separați — în acest caz se discută despre raportul pixelilor (PAR — de la Pixel Aspect Ratio).

Cum funcționează un codec video. Partea 1. Noțiuni de bază

Cum funcționează un codec video. Partea 1. Noțiuni de bază

Notă pentru gospodină: DVD corespunde DAR 4 la 3

Deși rezoluția reală a DVD-ului este de 704×480, totuși păstrează raportul de aspect 4:3, deoarece PAR are valoarea 10:11 (704×10 / 480×11).

Și, în final, putem defini video ca o succesiune de n cadre pe o perioadă timp, care poate fi considerată o dimensiune suplimentară. Iar n apoi — este rata de cadre sau numărul de cadre pe secundă (FPS — de la Frames per Second).

Cum funcționează un codec video. Partea 1. Noțiuni de bază

Numărul de biți pe secundă necesar pentru a reda video este rata de transfer — bitrate.

bitrate = lățime * înălțime * adâncime bit * cadre pe secundă

De exemplu, pentru un video cu 30 de cadre pe secundă, 24 de biți pe pixel, cu rezoluția 480×240 va necesita 82,944,000 biți pe secundă sau 82,944 Mbit/s (30x480x240x24) — dar asta dacă nu se utilizează vreo metodă de compresie.

Dacă rata de transfer este aproape constantă, atunci aceasta se numește rata de transfer constantă (CBR — de la constant bit rate). Dar poate varia și în acest caz se numește viteză variabilă de transfer (VBR — de la rata variabilă de biți).

Acest grafic ilustrează VBR limitat, când nu sunt consumate prea multe biți în cazul unui cadru complet întunecat.

Cum funcționează un codec video. Partea 1. Noțiuni de bază

Inițial, inginerii au dezvoltat o metodă de dublare a frecvenței percepute a cadrelor pe un ecran de video fără a folosi lățime de bandă suplimentară. Această metodă este cunoscută ca video interlaced; în principal, aceasta trimite jumătate din ecran în primul „cadru”, iar cealaltă jumătate în următorul „cadru”.

În prezent, vizualizarea scenelor se efectuează în principal folosind tehnologia de scanare progresivă. Aceasta este o metodă de afișare, stocare sau transfer de imagini în mișcare, în care toate liniile fiecărui cadru sunt desenate secvențial.

Cum funcționează un codec video. Partea 1. Noțiuni de bază

Așadar! Acum știm cum este reprezentată o imagine în format digital, cum sunt structurate culorile sale, câți biți pe secundă consumăm pentru a reda un video, fie că viteza de transfer este constantă (CBR) sau variabilă (VBR). Cunoaștem rezoluția dată utilizând o frecvență de cadre specificată și am luat contact cu multe alte termeni, cum ar fi video interlaced, PAR și alte termeni.

Eliminarea redundanței

Este cunoscut faptul că un video necompresat nu poate fi utilizat în mod normal. Un video de o oră cu rezoluție 720p și 30 de cadre pe secundă ar ocupa 278 GB. Ajungem la această valoare înmulțind 1280 x 720 x 24 x 30 x 3600 (lățimea, înălțimea, biți pe pixel, FPS și timpul în secunde).

Utilizare algoritmi de compresie fără pierderi, cum ar fi DEFLATE (folosit în PKZIP, Gzip și PNG), nu va oferi o reducere suficientă a lățimii de bandă necesare. Trebuie să căutăm alte metode de comprimare a video-ului.

Pentru aceasta, putem folosi caracteristicile viziunii noastre. Noi percepem mai bine luminozitatea decât culorile. Un video este un set de imagini secvențiale, repetându-se în timp. Între cadrele adiacente ale aceleași scene, diferențele sunt mici. În plus, fiecare cadru conține multe zone ce folosesc aceeași (sau similară) culoare.

Culoare, luminozitate și ochii noștri

Ochii noștri sunt mai sensibili la luminozitate decât la culoare. Puteți verifica acest lucru singuri, privind această imagine.

Cum funcționează un codec video. Partea 1. Noțiuni de bază

Dacă nu vedeți ce este în jumătatea stângă a imaginii, culorile pătratelor A și B În realitate sunt identice, așa că este în regulă. Creierul nostru ne face să acordăm mai multă atenție luminilor și umbrelor, nu culorilor. Pe partea dreaptă, între pătratele marcate, există o legătură de aceeași culoare — de aceea (adică, creierul nostru) identificăm cu ușurință că, de fapt, acolo este aceeași culoare.

Să analizăm (simplificat) cum funcționează ochii noștri. Ochii sunt un organ complex, format din multe părți. Cu toate acestea, ne interesează cel mai mult conurile și bastonașele. Ochii conțin aproximativ 120 de milioane de bastonașe și 6 milioane de conuri.

Să examinăm percepția culorii și a luminozității ca funcții separate ale anumitor părți ale ochiului (de fapt, lucrurile sunt puțin mai complexe, dar vom simplifica). Celulele bastonașe răspund în principal de luminozitate, în timp ce celulele conurilor sunt responsabile cu culoarea. Conurile sunt clasificate în trei tipuri, în funcție de pigmentul conținut: conuri S (blue), conuri M (verzi) și conuri L (roșii).

Deoarece avem mult mai multe bastonașe (luminozitate) decât conuri (culoare), se poate concluziona că suntem mai capabili să distingem tranzițiile între întuneric și lumină decât culorile.

Cum funcționează un codec video. Partea 1. Noțiuni de bază

Funcțiile sensibilității la contrast

Cercetătorii din domeniul psihologiei experimentale și din multe alte domenii au dezvoltat numeroase teorii despre vederea umană. Una dintre acestea se numește funcțiile sensibilității la contrast. Acestea sunt legate de iluminarea spațială și temporală. Pe scurt, este vorba despre câte modificări sunt necesare înainte ca observatorul să le observe. Observați că termenul ‘funcție’ este la plural. Aceasta se datorează faptului că putem măsura funcțiile sensibilității la contrast nu doar pentru imagini alb-negru, ci și pentru imagini color. Rezultatele acestor experimente arată că, în cele mai multe cazuri, ochii noștri sunt mai sensibili la luminozitate decât la culoare.

Deoarece este cunoscut că suntem mai sensibili la luminozitatea imaginii, putem încerca să folosim acest fapt.

Modelul de culoare

Am discutat puțin despre cum să lucrăm cu imagini colorate folosind schema RGB. Există și alte modele. Există un model care separă luminozitatea de cromaticitate și este cunoscut sub numele de YCbCr. Apropo, există și alte modele care fac o separare similară, dar ne vom concentra doar asupra acestuia.

În acest model de culoare Y — este reprezentarea strălucirii, iar două canale de culoare sunt folosite: Cb (albastru saturat) și Cr (roșu saturat). YCbCr poate fi obținut din RGB, la fel cum este posibil și conversia inversă. Folosind acest model, putem crea imagini colorate complet, așa cum se vede mai jos:

Cum funcționează un codec video. Partea 1. Noțiuni de bază

Conversia între YCbCr și RGB

Cineva ar putea contesta: cum este posibil să obții toate culorile, dacă verdele nu este folosit?

Pentru a răspunde la această întrebare, vom converti RGB în YCbCr. Vom folosi coeficientele acceptate în standardul BT.601, care a fost recomandat de divizia CEI-R. Această divizie definește standardele pentru video digital. De exemplu: ce este 4K? Ce ar trebui să fie rata de cadre, rezoluția, modelul de culoare?

Mai întâi, să calculăm strălucirea. Vom folosi constantele propuse de CEI și vom înlocui valorile RGB.

Y = 0.299R + 0.587G + 0.114B

După ce am obținut strălucirea, vom separa culoarea albastră și pe cea roșie:

Cb = 0.564(B — Y)

Cr = 0.713(R — Y)

Și putem, de asemenea, să convertim înapoi și chiar să obținem verdele folosind YCbCr:

R = Y + 1.402Cr

B = Y + 1.772Cb

G = Y — 0.344Cb — 0.714Cr

În general, ecranele (monitoare, televizoare, ecrane etc.) folosesc doar modelul RGB. Dar acest model poate fi organizat în moduri diferite:

Cum funcționează un codec video. Partea 1. Noțiuni de bază

Subdistantă de culoare

Cu o imagine reprezentată ca o combinație de strălucire și cromaticitate, putem utiliza o sensibilitate mai mare a sistemului vizual uman la strălucire decât la cromaticitate, dacă eliminăm selectiv informația. Subdrapajul culorii este o metodă de codare a imaginilor, folosind o rezoluție mai mică pentru cromaticitate decât pentru strălucire.

Cum funcționează un codec video. Partea 1. Noțiuni de bază

Cât de permisibil este să reduci rezoluția cromaticității?! Se dovedește că există deja scheme care descriu cum să tratăm rezoluția și combinarea (Culoarea finală = Y + Cb + Cr ).

Aceste scheme sunt cunoscute ca sisteme de subdrapare și sunt exprimate sub formă de o rată de 3 la 1 — a:x:Stabiliți o parolă și păstrați-o în siguranță!, care determină numărul de eșantioane de semnale de strălucire și de diferențe de culoare.

a — eșantion de referință orizontal (de obicei, egal cu 4)
x — numărul de eșantioane de cromaticitate pe prima linie de pixeli (rezoluția orizontală în raport cu a)
Stabiliți o parolă și păstrați-o în siguranță! — numărul de modificări ale eșantioanelor de cromaticitate între prima și a doua linie de pixeli.

Excepția o reprezintă 4:1:0, care asigură un eșantion de cromaticitate în fiecare bloc de 4 pe 4 de rezoluție a strălucirii.

Scheme generale utilizate în codec-urile moderne:

  • 4:4:4 (fără subdampling)
  • 4:2:2
  • 4:1:1
  • 4:2:0
  • 4:1:0
  • 3:1:1

YCbCr 4:2:0 — exemplu de compresie

Iată un fragment unificat al imaginii utilizând YCbCr 4:2:0. Observați că utilizăm doar 12 biți pe pixel.

Cum funcționează un codec video. Partea 1. Noțiuni de bază

Așa arată aceeași imagine, codificată cu principalele tipuri de subdampling. Primul rând este YCbCr final, iar rândul inferior arată rezoluția culorilor. Rezultatele sunt destul de acceptabile, având în vedere pierderile minime de calitate.

Cum funcționează un codec video. Partea 1. Noțiuni de bază

Am numărat 278 GB de spațiu pe disc necesar pentru a stoca un fișier video de o oră cu rezoluția 720p și 30 de cadre pe secundă, nu-i așa? Utilizând YCbCr 4:2:0, dimensiunea se reduce la jumătate — 139 GB. Totuși, este încă departe de un rezultat acceptabil.

Puteți obține singur histograma YCbCr folosind FFmpeg. În această imagine, albastrul predomină asupra roșului, ceea ce este evident în histogramă.

Cum funcționează un codec video. Partea 1. Noțiuni de bază

Culoare, luminozitate, gamă de culori — un videoclip explicativ

Este recomandat să vizionați acest videoclip grozav. Aici se explică ce este luminozitatea și se clarifică totodată aspectele legate de luminozitate și culoare.

Redați video

Tipuri de cadre

Să mergem mai departe. Vom încerca să eliminăm redundanța temporală. Dar mai întâi, să definim niște termeni de bază. Să presupunem că avem un film cu 30 de cadre pe secundă, iată primele sale 4 cadre:

Cum funcționează un codec video. Partea 1. Noțiuni de bază Cum funcționează un codec video. Partea 1. Noțiuni de bază Cum funcționează un codec video. Partea 1. Noțiuni de bază Cum funcționează un codec video. Partea 1. Noțiuni de bază

Putem observa multe repetări în cadre: de exemplu, fundalul albastru, care rămâne neschimbat de la un cadru la altul. Pentru a rezolva această problemă, putem clasifica abstract aceste cadre în trei tipuri.

Cadru I (IIntro Frame)

Cadru I (cadru de referință, cadru cheie, cadru intern) este autonom. Indiferent de ceea ce trebuie vizualizat, cadru I este, în esență, o fotografie statică. Primul cadru este de obicei un cadru I, dar vom observa frecvent cadre I și în rândul cadrelor care nu sunt primele.

Cum funcționează un codec video. Partea 1. Noțiuni de bază

Cadru P (PPredicted Frame)

Cadru P (cadru prezis) beneficiază de faptul că, aproape întotdeauna, imaginea curentă poate fi reprodusă folosind cadrul anterior. De exemplu, în al doilea cadru, singura modificare este mingea care se mișcă înainte. Putem obține cadru 2 simplu prin modificarea ușoară a cadru 1, utilizând doar diferența dintre aceste cadre. Pentru a construi cadru 2, ne referim la cadrul 1 care îi precede.

Cum funcționează un codec video. Partea 1. Noțiuni de bază ← Cum funcționează un codec video. Partea 1. Noțiuni de bază

Cadru B (Bcadru i-predictive)

Ce părere aveți despre linkurile nu doar la cadrele anterioare, ci și la cele viitoare, pentru a asigura o compresie și mai bună?! Aceasta este, în esență, B-cadru (cadru bidirecțional).

Cum funcționează un codec video. Partea 1. Noțiuni de bază ← Cum funcționează un codec video. Partea 1. Noțiuni de bază → Cum funcționează un codec video. Partea 1. Noțiuni de bază

Ieșire intermediară

Aceste tipuri de cadre sunt utilizate pentru a asigura cea mai bună compresie. Vom analiza cum se întâmplă acest lucru în secțiunea următoare. Între timp, să notăm că cel mai „costisitor” din punct de vedere al memoriei este I-cadrul, P-cadrul costă semnificativ mai puțin, iar cel mai rentabil pentru video este B-cadrul.

Cum funcționează un codec video. Partea 1. Noțiuni de bază

Redundanța temporală (prognozarea inter-cadru)

Să analizăm ce opțiuni avem pentru minimizarea repetărilor în timp. Acest tip de redundanță va fi rezolvat prin metode de prognozare reciprocă.

Să încercăm să cheltuim cât mai puțini biți pentru a codifica secvența de cadre 0 și 1.

Cum funcționează un codec video. Partea 1. Noțiuni de bază

Putem realiza scăderea, pur și simplu scăzând cadru 1 din cadru 0. Obținem cadru 1, folosind de fapt doar diferența dintre acesta și cadrul anterior, codificând efectiv doar restul obținut.

Cum funcționează un codec video. Partea 1. Noțiuni de bază

Dar ce ar fi dacă v-aș spune că există o metodă și mai bună, care folosește și mai puțini biți?! Mai întâi, să împărțim cadru 0 într-o rețea clară, alcătuită din blocuri. Apoi, să încercăm să potrivim blocurile din cadru 0 cu cadru 1. Cu alte cuvinte, să evaluăm mișcarea dintre cadre.

Din Wikipedia — compensarea mișcării pe blocuri

Compensarea mișcării pe blocuri împarte cadrul curent în blocuri non-intersectante, iar vectorul de compensare a mișcării arată originea blocurilor (o confuzie frecventă este că cadrul anterior este împărțit în blocuri non-intersectante, iar vectorii de compensare a mișcării arată unde se mută aceste blocuri. De fapt, este invers — nu este analizat cadrul anterior, ci cel următor, stabilindu-se nu unde se mută blocurile, ci de unde au apărut). De obicei, blocurile inițiale se suprapun în cadrul original. Unele algoritme de compresie video construiesc cadrul curent din părți din mai multe cadre anterioare și nu doar din unul.

Cum funcționează un codec video. Partea 1. Noțiuni de bază

În procesul de evaluare, observăm că mingea s-a mutat de la (x=0, Stabiliți o parolă și păstrați-o în siguranță!=25) la (x=6, Stabiliți o parolă și păstrați-o în siguranță!=26), valori x și Stabiliți o parolă și păstrați-o în siguranță! definiți vectorul de mișcare. Un alt pas pe care îl putem face pentru a economisi biți este să codificăm doar diferența dintre vectorii de mișcare între ultima poziție a blocului și cea prognozată, astfel încât vectorul final de mișcare va fi (x=6-0=6, y=26-25=1).

Într-o situație reală, această bilă ar fi împărțită în n blocuri, dar esența nu se schimbă.

Obiectele din cadru se mișcă în trei dimensiuni, deci când bila se mișcă, aceasta poate deveni vizual mai mică (sau mai mare, dacă se mișcă spre spectator). Este normal să nu existe o corespondență perfectă între blocuri. Iată o vedere combinată a evaluării noastre și a imaginii reale.

Cum funcționează un codec video. Partea 1. Noțiuni de bază

Dar observăm că atunci când aplicăm evaluarea mișcării, datele pentru codare sunt vizibil mai puține decât atunci când folosim o metodă mai simplă de calculare a diferenței între cadre.

Cum funcționează un codec video. Partea 1. Noțiuni de bază

Cum va arăta compensarea reală a mișcării

Această metodă se aplică tuturor blocurilor simultan. De multe ori, bila noastră ipotetică în mișcare va fi împărțită în mai multe blocuri.

Cum funcționează un codec video. Partea 1. Noțiuni de bază

Puteți experimenta aceste concepte utilizând Jupyter.

Pentru a vedea vectorii de mișcare, puteți crea un video cu o prognoză externă folosind ffmpeg.

Cum funcționează un codec video. Partea 1. Noțiuni de bază

De asemenea, se poate utiliza Intel Video Pro Analyzer (este plătit, dar există o versiune demo gratuită, care este limitată doar la primele zece cadre).

Cum funcționează un codec video. Partea 1. Noțiuni de bază

Redundanța spațială (prognoza internă)

Dacă analizăm fiecare cadru din video, vom descoperi numeroase zone interconectate.

Cum funcționează un codec video. Partea 1. Noțiuni de bază

Să trecem prin acest exemplu. Această scenă constă în principal din culori albastre și albe.

Cum funcționează un codec video. Partea 1. Noțiuni de bază

Acesta este cadru I. Nu putem lua cadrele anterioare pentru prognozare, dar putem să-l comprimăm. Să codificăm selecția blocului roșu. Dacă ne uităm la vecinii săi, observăm că în jurul său există unele tendințe de culoare.

Cum funcționează un codec video. Partea 1. Noțiuni de bază

Presupunem că în cadru culorile se răspândesc vertical. Asta înseamnă că culorile pixelilor necunoscuți vor conține valorile vecinilor săi.

Cum funcționează un codec video. Partea 1. Noțiuni de bază

Această prognoză poate fi, de asemenea, greșită. De aceea, este necesar să aplicăm această metodă (prognoza internă) și apoi să scădem valorile reale. Aceasta ne va oferi un bloc rezidual, ceea ce va duce la o matrice mult mai compactă în comparație cu originalul.

Cum funcționează un codec video. Partea 1. Noțiuni de bază

Dacă doriți să exersați cu predicțiile interne, puteți crea un videoclip cu macroblocuri și predicțiile lor folosind ffmpeg. Pentru a înțelege semnificația fiecărei culori a blocului, va trebui să consultați documentația ffmpeg.

Cum funcționează un codec video. Partea 1. Noțiuni de bază

Sau puteți folosi Intel Video Pro Analyzer (așa cum am menționat mai sus, în versiunea de probă gratuită există o limitare la primele 10 cadre, dar este suficient pentru început).

Cum funcționează un codec video. Partea 1. Noțiuni de bază

Partea a doua: Principiile de funcționare ale codec-ului video

Sursa: habr.com

Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS 🔥 Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS | ProHoster