Hoe werkt een videocodec? Deel 1: Basisprincipes

Tweede deel: Hoe de videocodec werkt

Elk raster Voorbeeld kan in de vorm worden weergegeven tweedimensionale matrix. Als het om kleuren gaat, kan het idee worden ontwikkeld door naar een afbeelding te kijken driedimensionale matrix, waarin extra dimensies worden gebruikt om gegevens voor elk van de kleuren op te slaan.

Als we de uiteindelijke kleur beschouwen als een combinatie van de zogenaamde. primaire kleuren (rood, groen en blauw), in onze driedimensionale matrix definiëren we drie vlakken: het eerste voor rood, het tweede voor groen en het laatste voor blauw.
Hoe werkt een videocodec? Deel 1: Basisprincipes
Elk punt in deze matrix zullen we een pixel (beeldelement) noemen. Elke pixel bevat informatie over de intensiteit (meestal als een numerieke waarde) van elke kleur. Bijvoorbeeld, rode pixel betekent dat het 0 groen, 0 blauw en maximaal rood bevat. Roze pixel kan worden gevormd met behulp van een combinatie van drie kleuren. Met behulp van een numeriek bereik van 0 tot 255 wordt een roze pixel gedefinieerd als Rood = 255, Groen = 192 и Blauw = 203.

Hoe werkt een videocodec? Deel 1: Basisprincipes

Dit artikel is gepubliceerd met steun van EDISON.

Wij zijn aan het ontwikkelen toepassingen voor videobewaking, videostreaming, en ook wij zijn verloofd video-opname in de operatiekamer.

Alternatieve manieren om een ​​kleurenafbeelding te coderen

Er zijn veel andere modellen voor het weergeven van de kleuren waaruit een afbeelding bestaat. U kunt bijvoorbeeld een geïndexeerd palet gebruiken, waarbij slechts één byte nodig is om elke pixel weer te geven, in plaats van de drie die vereist zijn bij gebruik van het RGB-model. In een dergelijk model is het mogelijk om een ​​2D-matrix te gebruiken in plaats van een 3D-matrix om elke kleur weer te geven. Dit bespaart geheugen, maar geeft een kleiner kleurengamma.

Hoe werkt een videocodec? Deel 1: Basisprincipes

RGB

Kijk bijvoorbeeld eens naar deze foto hieronder. Het eerste gezicht is volledig geverfd. De andere zijn de rode, groene en blauwe vlakken (de intensiteiten van de overeenkomstige kleuren worden weergegeven in grijstinten).

Hoe werkt een videocodec? Deel 1: Basisprincipes

We zien dat de roodtinten in het origineel zich op dezelfde plaatsen bevinden waar de helderste delen van het tweede vlak worden waargenomen. Terwijl de bijdrage van blauw vooral alleen te zien is in Mario's ogen (laatste gezicht) en elementen van zijn kleding. Merk op waar alle drie de kleurvlakken het minst bijdragen (de donkerste delen van de afbeeldingen): Mario's snor.

Om de intensiteit van elke kleur op te slaan, is een bepaald aantal bits nodig; deze hoeveelheid wordt genoemd beetje diepte. Laten we zeggen dat er per kleurvlak 8 bits worden uitgegeven (gebaseerd op een waarde van 0 tot 255). Dan hebben we een kleurdiepte van 24 bits (8 bits * 3 R/G/B-vlakken).

Een andere eigenschap van een afbeelding is разрешение, wat het aantal pixels in één dimensie is. Vaak aangeduid als breedte x hoogte, zoals in de onderstaande voorbeeldafbeelding van 4 bij 4.
Hoe werkt een videocodec? Deel 1: Basisprincipes

Een andere eigenschap waar we mee te maken hebben bij het werken met afbeeldingen/video’s is aspectverhouding, die de normale proportionele relatie beschrijft tussen de breedte en hoogte van een afbeelding of pixel.

Als ze zeggen dat een bepaalde film of foto 16 bij 9 groot is, bedoelen ze dat meestal beeldverhouding weergeven (MAAR - van Beeldverhouding weergeven). Soms kunnen er echter verschillende vormen van individuele pixels zijn - in dit geval hebben we het over pixelverhouding (PAR - van Pixelverhouding).

Hoe werkt een videocodec? Deel 1: Basisprincipes

Hoe werkt een videocodec? Deel 1: Basisprincipes

Opmerking voor de gastvrouw: DVD komt overeen met DAR 4 tot 3

Hoewel de werkelijke dvd-resolutie 704x480 is, behoudt deze nog steeds een beeldverhouding van 4:3 omdat de PAR 10:11 is (704x10 / 480x11).

En uiteindelijk kunnen we het bepalen video als een opeenvolging van n kaders voor de periode tijd, wat als een extra dimensie kan worden beschouwd. A n dan is de framesnelheid of het aantal frames per seconde (FPS - van Beelden per seconde).

Hoe werkt een videocodec? Deel 1: Basisprincipes

Het aantal bits per seconde dat nodig is om een ​​video weer te geven, is het aantal bits per seconde dat nodig is om een ​​video weer te geven transmissiesnelheid - bitsnelheid.

bitrate = breedte * hoogte * bitdiepte * frames per seconde

Voor een video van 30 fps, 24 bps, 480x240 zou bijvoorbeeld 82,944,000 bps of 82,944 Mbps (30x480x240x24) nodig zijn, maar dat is als er geen compressiemethode wordt gebruikt.

Als de overdrachtssnelheid vrijwel constant, dan heet het constante transmissiesnelheid (CBR - van constante bitrate). Maar het kan ook variëren, in dit geval heet dat variabele baudrate (VBR - van variabele bitsnelheid).

Deze grafiek toont beperkte VBR, waarbij niet te veel bits worden verspild in het geval van een volledig donker frame.

Hoe werkt een videocodec? Deel 1: Basisprincipes

Ingenieurs ontwikkelden aanvankelijk een methode om de waargenomen framesnelheid van een videoscherm te verdubbelen zonder extra bandbreedte te gebruiken. Deze methode staat bekend als geïnterlinieerde video; Kortom, het verzendt de helft van het scherm in het eerste "frame" en de andere helft in het volgende "frame".

Momenteel worden scènes meestal weergegeven met behulp van vooruitstrevende scantechnologieën. Het is een methode voor het weergeven, opslaan of verzenden van bewegende beelden waarbij alle lijnen van elk frame opeenvolgend worden getekend.

Hoe werkt een videocodec? Deel 1: Basisprincipes

Goed! Nu weten we hoe een beeld digitaal wordt weergegeven, hoe de kleuren zijn gerangschikt, hoeveel bits per seconde we besteden aan het weergeven van video, of de bitsnelheid constant (CBR) of variabel (VBR) is. We kennen een bepaalde resolutie bij gebruik van een bepaalde framesnelheid, we kennen veel andere termen, zoals interlaced video, PAR en enkele andere.

Het verwijderen van redundantie

Het is bekend dat video zonder compressie niet normaal kan worden gebruikt. Een video van een uur met een resolutie van 720p en 30 frames per seconde zou 278 GB in beslag nemen. We komen tot deze waarde door 1280 x 720 x 24 x 30 x 3600 te vermenigvuldigen (breedte, hoogte, bits per pixel, FPS en tijd in seconden).

Gebruiken verliesloze compressie-algoritmen, zoals DEFLATE (gebruikt in PKZIP, Gzip en PNG), zal de vereiste bandbreedte niet voldoende verminderen. We moeten op zoek gaan naar andere manieren om video te comprimeren.

Hiervoor kunt u gebruik maken van de kenmerken van onze visie. We zijn beter in het onderscheiden van helderheid dan in kleur. Een video is een reeks opeenvolgende beelden die zich in de loop van de tijd herhalen. Er zijn kleine verschillen tussen aangrenzende frames van dezelfde scène. Bovendien bevat elk frame veel gebieden met dezelfde (of vergelijkbare) kleur.

Kleur, helderheid en onze ogen

Onze ogen zijn gevoeliger voor helderheid dan voor kleur. Je kunt dit zelf zien door naar deze foto te kijken.

Hoe werkt een videocodec? Deel 1: Basisprincipes

Als je dat niet ziet, zie je in de linkerhelft van de afbeelding de kleuren van de vierkanten A и B eigenlijk hetzelfde zijn, dan is dat normaal. Onze hersenen dwingen ons om meer aandacht te besteden aan licht en schaduw in plaats van aan kleur. Aan de rechterkant tussen de aangewezen vierkanten bevindt zich een trui van dezelfde kleur - dus wij (dat wil zeggen onze hersenen) kunnen gemakkelijk vaststellen dat ze in feite dezelfde kleur hebben.

Laten we (op een vereenvoudigde manier) kijken hoe onze ogen werken. Het oog is een complex orgaan dat uit vele onderdelen bestaat. Wij zijn echter het meest geïnteresseerd in kegels en staven. Het oog bevat ongeveer 120 miljoen staafjes en 6 miljoen kegeltjes.

Laten we de perceptie van kleur en helderheid beschouwen als afzonderlijke functies van bepaalde delen van het oog (in feite is alles wat ingewikkelder, maar we zullen het vereenvoudigen). Staafcellen zijn voornamelijk verantwoordelijk voor de helderheid, terwijl kegelcellen verantwoordelijk zijn voor de kleur. Kegels zijn onderverdeeld in drie typen, afhankelijk van het pigment dat ze bevatten: S-kegels (blauw), M-kegels (groen) en L-kegels (rood).

Omdat we veel meer staafjes (helderheid) dan kegeltjes (kleur) hebben, kunnen we concluderen dat we beter in staat zijn om overgangen tussen donker en licht te onderscheiden dan kleuren.

Hoe werkt een videocodec? Deel 1: Basisprincipes

Contrastgevoeligheidsfuncties

Onderzoekers in de experimentele psychologie en vele andere vakgebieden hebben veel theorieën over het menselijk zicht ontwikkeld. En een van hen wordt gebeld contrastgevoeligheidsfuncties. Ze houden verband met ruimtelijke en temporele verlichting. Kortom, het gaat erom hoeveel veranderingen er nodig zijn voordat een waarnemer ze opmerkt. Let op het meervoud van het woord "functie". Dit komt door het feit dat we contrastgevoeligheidsfuncties niet alleen voor zwart-witafbeeldingen kunnen meten, maar ook voor kleurenafbeeldingen. De resultaten van deze experimenten laten zien dat onze ogen in de meeste gevallen gevoeliger zijn voor helderheid dan voor kleur.

Omdat we weten dat we gevoeliger zijn voor de helderheid van het beeld, kunnen we proberen dit feit te gebruiken.

kleurmodel

We hebben een beetje ontdekt hoe we met kleurenafbeeldingen kunnen werken met behulp van het RGB-schema. Er zijn ook andere modellen. Er is een model dat luminantie van chroma scheidt en dit staat bekend als YCbCr. Er zijn trouwens andere modellen die een vergelijkbare indeling maken, maar we zullen alleen deze overwegen.

In dit kleurmodel Y is een weergave van de helderheid en gebruikt ook twee kleurkanalen: Cb (rijk blauw) en Cr (rijk rood). YCbCr kan worden afgeleid van RGB, maar de omgekeerde conversie is ook mogelijk. Met dit model kunnen we afbeeldingen in kleur maken, zoals we hieronder zien:

Hoe werkt een videocodec? Deel 1: Basisprincipes

Converteren tussen YCbCr en RGB

Iemand zal tegenwerpen: hoe is het mogelijk om alle kleuren te krijgen als groen niet wordt gebruikt?

Laten we, om deze vraag te beantwoorden, RGB naar YCbCr converteren. Laten we de coëfficiënten gebruiken die in de standaard zijn aangenomen BT.601, wat door de eenheid werd aanbevolen ITU-R. Deze divisie bepaalt de normen voor digitale video. Bijvoorbeeld: wat is 4K? Wat moet de framesnelheid, resolutie, kleurmodel zijn?

Laten we eerst de helderheid berekenen. Laten we de door de ITU voorgestelde constanten gebruiken en de RGB-waarden vervangen.

Y = 0.299R + 0.587G + 0.114B

Nadat we de helderheid hebben, scheiden we de blauwe en rode kleuren:

Cb = 0.564(B - Y)

Cr = 0.713(R - Y)

En we kunnen ook terug converteren en zelfs groen worden met behulp van YCbCr:

R = Y + 1.402Cr

B = Y + 1.772Cb

G = Y - 0.344Cb - 0.714Cr

Normaal gesproken gebruiken beeldschermen (monitors, tv's, schermen, enz.) alleen het RGB-model. Maar dit model kan op verschillende manieren worden georganiseerd:

Hoe werkt een videocodec? Deel 1: Basisprincipes

Subsampling van kleuren

Met een beeld dat wordt weergegeven als een combinatie van luminantie en chrominantie, kunnen we de grotere gevoeligheid van het menselijke visuele systeem voor luminantie dan voor chrominantie benutten door selectief informatie te verwijderen. Chroma-subsampling is een methode voor het coderen van afbeeldingen met een lagere resolutie voor chroma dan voor luminantie.

Hoe werkt een videocodec? Deel 1: Basisprincipes

Hoeveel is het toegestaan ​​om de kleurresolutie te verlagen?! Het blijkt dat er al enkele diagrammen zijn die beschrijven hoe om te gaan met resolutie en samenvoeging (resulterende kleur = Y + Cb + Cr).

Deze regelingen staan ​​bekend als downsampling-systemen en worden uitgedrukt als een drievoudige verhouding - a:x:y, dat het aantal monsters van luminantie- en kleurverschilsignalen bepaalt.

a — horizontale bemonsteringsnorm (meestal gelijk aan 4)
x — aantal chromamonsters in de eerste rij pixels (horizontale resolutie ten opzichte van a)
y — het aantal veranderingen in chromamonsters tussen de eerste en tweede rij pixels.

De uitzondering is 4:1:0, waardoor één chromamonster wordt geleverd in elk luminantieresolutieblok van 4 bij 4.

Veel voorkomende schema's die in moderne codecs worden gebruikt:

  • 4:4:4 (geen downsampling)
  • 4:2:2
  • 4:1:1
  • 4:2:0
  • 4:1:0
  • 3:1:1

YCbCr 4:2:0 - fusievoorbeeld

Hier is een samengevoegde afbeelding met YCbCr 4:2:0. Houd er rekening mee dat we slechts 12 bits per pixel uitgeven.

Hoe werkt een videocodec? Deel 1: Basisprincipes

Zo ziet dezelfde afbeelding eruit, gecodeerd met de belangrijkste typen kleursubsampling. De eerste rij is de laatste YCbCr, de onderste rij toont de chromaresolutie. Zeer behoorlijke resultaten, gezien het lichte kwaliteitsverlies.

Hoe werkt een videocodec? Deel 1: Basisprincipes

Weet je nog dat we 278 GB opslagruimte telden om een ​​videobestand van een uur op te slaan met een resolutie van 720p en 30 frames per seconde? Als we YCbCr 4:2:0 gebruiken, wordt deze grootte met de helft verkleind: 139 GB. Tot nu toe is het nog steeds verre van een acceptabel resultaat.

U kunt het YCbCr-histogram zelf verkrijgen met FFmpeg. In deze afbeelding domineert blauw over rood, wat duidelijk zichtbaar is in het histogram zelf.

Hoe werkt een videocodec? Deel 1: Basisprincipes

Kleur, helderheid, kleurengamma - videobeoordeling

We raden je aan deze geweldige video te bekijken. Het legt uit wat helderheid is, en over het algemeen zijn alle stippen gestippeld ё over helderheid en kleur.

Frametypen

Laten we verder gaan. Laten we proberen de tijdredundantie te elimineren. Maar laten we eerst wat basisterminologie definiëren. Laten we zeggen dat we een film hebben met 30 frames per seconde, hier zijn de eerste 4 frames:

Hoe werkt een videocodec? Deel 1: Basisprincipes Hoe werkt een videocodec? Deel 1: Basisprincipes Hoe werkt een videocodec? Deel 1: Basisprincipes Hoe werkt een videocodec? Deel 1: Basisprincipes

In de frames zien we veel herhaling: bijvoorbeeld een blauwe achtergrond die niet verandert van frame tot frame. Om dit probleem op te lossen, kunnen we ze abstract indelen in drie soorten frames.

I-frame (Intro-frame)

I-frame (referentieframe, sleutelframe, binnenframe) is op zichzelf staand. Ongeacht wat u wilt visualiseren, een I-frame is in wezen een statische foto. Het eerste frame is meestal een I-frame, maar we zullen regelmatig I-frames waarnemen, zelfs als het niet de eerste frames zijn.

Hoe werkt een videocodec? Deel 1: Basisprincipes

P-frame (Pbeoordeeld frame)

P-frame (voorspellend frame) maakt gebruik van het feit dat bijna altijd het huidige beeld kan worden gereproduceerd met behulp van het vorige frame. In het tweede frame is de enige verandering bijvoorbeeld dat de bal naar voren beweegt. We kunnen frame 2 verkrijgen door frame 1 eenvoudigweg iets aan te passen, waarbij alleen het verschil tussen deze frames wordt gebruikt. Om frame 2 te construeren, verwijzen we naar het voorgaande frame 1.

Hoe werkt een videocodec? Deel 1: BasisprincipesHoe werkt een videocodec? Deel 1: Basisprincipes

B-frame (Bi-voorspellend frame)

Hoe zit het met links niet alleen naar vroegere, maar ook naar toekomstige frames om voor een nog betere compressie te zorgen?! Dit is in feite een B-frame (bidirectioneel frame).

Hoe werkt een videocodec? Deel 1: BasisprincipesHoe werkt een videocodec? Deel 1: BasisprincipesHoe werkt een videocodec? Deel 1: Basisprincipes

Tussentijdse intrekking

Deze frametypen worden gebruikt om de best mogelijke compressie te bieden. Hoe dit gebeurt, zullen we in de volgende sectie bekijken. Laten we voorlopig opmerken dat het I-frame het "duurste" is in termen van verbruikt geheugen, het P-frame is merkbaar goedkoper, maar de meest winstgevende optie voor video is het B-frame.

Hoe werkt een videocodec? Deel 1: Basisprincipes

Tijdelijke redundantie (voorspelling tussen frames)

Laten we eens kijken welke opties we hebben om herhaling in de loop van de tijd te minimaliseren. We kunnen dit soort redundantie oplossen met behulp van kruisvoorspellingsmethoden.

We zullen proberen zo min mogelijk bits te besteden aan het coderen van een reeks frames 0 en 1.

Hoe werkt een videocodec? Deel 1: Basisprincipes

Wij kunnen produceren aftrekken, trekken we eenvoudigweg frame 1 af van frame 0. We krijgen frame 1, gebruiken alleen het verschil tussen frame XNUMX en het vorige frame, in feite coderen we alleen de resulterende rest.

Hoe werkt een videocodec? Deel 1: Basisprincipes

Maar wat als ik je vertelde dat er een nog betere methode is die nog minder bits gebruikt?! Laten we eerst frame 0 opsplitsen in een duidelijk raster bestaande uit blokken. En dan proberen we de blokken uit frame 0 te matchen met frame 1. Met andere woorden, we schatten de beweging tussen frames.

Van Wikipedia- bewegingscompensatie blokkeren

Blokbewegingscompensatie verdeelt het huidige frame in niet-overlappende blokken en de bewegingscompensatievector rapporteert de oorsprong van de blokken (een veel voorkomende misvatting is dat voorgaand het frame is verdeeld in niet-overlappende blokken, en bewegingscompensatievectoren vertellen waar die blokken naartoe gaan. Maar in feite is het andersom: het is niet het vorige frame dat wordt geanalyseerd, maar het volgende; het is niet duidelijk waar de blokken bewegen, maar waar ze vandaan komen). Typisch overlappen de bronblokken in het bronframe. Sommige algoritmen voor videocompressie stellen het huidige frame samen uit delen van niet eens één, maar meerdere eerder verzonden frames.

Hoe werkt een videocodec? Deel 1: Basisprincipes

Tijdens het evaluatieproces zien we dat de bal is bewogen van (x= 0, y=25) tot (x= 6, y=26), waarden x и y bepaal de bewegingsvector. Een andere stap die we kunnen doen om bits te behouden, is door alleen het verschil in bewegingsvectoren tussen de laatste blokpositie en de voorspelde positie te coderen, zodat de uiteindelijke bewegingsvector zal zijn (x=6-0=6, y=26-25=1 ).

In een echte situatie zou deze bal verdeeld zijn in n blokken, maar dit verandert niets aan de essentie van de zaak.

Objecten in het frame bewegen in drie dimensies, dus wanneer de bal beweegt, kan deze visueel kleiner worden (of groter als deze naar de kijker toe beweegt). Het is normaal dat er geen perfecte match tussen de blokken zal zijn. Hier is een gecombineerde weergave van onze schatting en de echte foto.

Hoe werkt een videocodec? Deel 1: Basisprincipes

Maar we zien dat wanneer we bewegingsschatting gebruiken, er merkbaar minder gegevens zijn voor codering dan wanneer we een eenvoudiger methode gebruiken om de delta tussen frames te berekenen.

Hoe werkt een videocodec? Deel 1: Basisprincipes

Hoe echte bewegingscompensatie eruit zou zien

Deze techniek wordt op alle blokken tegelijk toegepast. Vaak wordt onze voorwaardelijk bewegende bal in meerdere blokken tegelijk verdeeld.

Hoe werkt een videocodec? Deel 1: Basisprincipes

Met behulp van deze concepten kunt u zelf een gevoel krijgen voor deze concepten Jupiterpy.

Om bewegingsvectoren te zien, kunt u een externe voorspellingsvideo maken met behulp van ffmpeg.

Hoe werkt een videocodec? Deel 1: Basisprincipes

Je kan ook gebruiken Intel Video Pro-analyzer (het is betaald, maar er is een gratis proefperiode die beperkt is tot alleen de eerste tien frames).

Hoe werkt een videocodec? Deel 1: Basisprincipes

Ruimtelijke redundantie (interne prognose)

Als we elk frame in een video analyseren, zullen we veel onderling verbonden gebieden ontdekken.

Hoe werkt een videocodec? Deel 1: Basisprincipes

Laten we dit voorbeeld eens doornemen. Deze scène bestaat voornamelijk uit blauwe en witte kleuren.

Hoe werkt een videocodec? Deel 1: Basisprincipes

Dit is een I-frame. We kunnen geen eerdere frames gebruiken voor voorspellingen, maar we kunnen deze wel comprimeren. Laten we de selectie van het rode blok coderen. Als we naar de buren kijken, merken we dat er enkele kleurtrends omheen zijn.

Hoe werkt een videocodec? Deel 1: Basisprincipes

We gaan ervan uit dat kleuren zich verticaal in het frame verspreiden. Dat betekent dat de kleur van de onbekende pixels de waarden van zijn buren zal bevatten.

Hoe werkt een videocodec? Deel 1: Basisprincipes

Een dergelijke voorspelling kan onjuist blijken te zijn. Het is om deze reden dat u deze methode (interne voorspelling) moet toepassen en vervolgens de werkelijke waarden moet aftrekken. Dit geeft ons een restblok, wat zal resulteren in een veel meer gecomprimeerde matrix vergeleken met het origineel.

Hoe werkt een videocodec? Deel 1: Basisprincipes

Als je wilt oefenen met interne voorspellingen, kun je met ffmpeg een video maken van macroblokken en hun voorspellingen. Om de betekenis van elke blokkleur te begrijpen, moet u de ffmpeg-documentatie lezen.

Hoe werkt een videocodec? Deel 1: Basisprincipes

Of u kunt Intel Video Pro Analyzer gebruiken (zoals ik hierboven al zei, de gratis proefversie is beperkt tot de eerste 10 frames, maar dit zal in eerste instantie voldoende voor u zijn).

Hoe werkt een videocodec? Deel 1: Basisprincipes

Tweede deel: Hoe de videocodec werkt

Bron: www.habr.com

Voeg een reactie