Hoe werkt een videocodec. Deel 1. Basisprincipes

Tweede deel: Principes van videocodecs

Elk raster afbeelding kan worden voorgesteld als een tweedimensionale matrix. Wanneer het gaat om kleuren, kan het idee verder worden ontwikkeld door de afbeelding te beschouwen als een driedimensionale matrix, waarin aanvullende dimensies worden gebruikt om gegevens voor elke kleur op te slaan.

Wanneer we de uiteindelijke kleur beschouwen als een combinatie van de zogenaamde primaire kleuren (rood, groen en blauw), definiëren we in onze driedimensionale matrix drie vlaktes: de eerste voor de kleur rood, de tweede voor groen en de laatste voor blauw.
Hoe werkt een videocodec. Deel 1. Basisprincipes
Laten we elke punt in deze matrix een pixel (beeldelement) noemen. Elke pixel bevat informatie over de intensiteit (meestal in de vorm van een getalswaarde) van elke kleur. Bijvoorbeeld, een rode pixel betekent dat deze 0 groen, 0 blauw en maximaal rood bevat. Een roze pixel kan worden gevormd met behulp van een combinatie van de drie kleuren. Met een getalbereik van 0 tot 255, wordt een roze pixel gedefinieerd als Rood = 255, Groen = 192 en Blauw = 203.

Hoe werkt een videocodec. Deel 1. Basisprincipes

Het artikel is gepubliceerd met de steun van EDISON.

We ontwikkelen toepassingen voor videobewaking, streaming video, en we houden ons ook bezig met videoregistratie in de operatiekamer.

Alternatieve manieren om een kleurenafbeelding te coderen

Voor het weergeven van de kleuren waaruit de afbeelding bestaat, zijn er vele andere modellen. Bijvoorbeeld, een geïndexeerde palet kan worden gebruikt, waarbij slechts één byte nodig is om elke pixel voor te stellen, in tegenstelling tot de drie die nodig zijn bij het gebruik van het RGB-model. In zo'n model kan een 2D-matrix worden gebruikt in plaats van een 3D-matrix voor het weergeven van elke kleur. Dit bespaart geheugen, maar biedt een kleinere kleurnuance.

Hoe werkt een videocodec. Deel 1. Basisprincipes

RGB

Bekijk bijvoorbeeld deze afbeelding hieronder. Het eerste gezicht is volledig gekleurd. De anderen zijn de rode, groene en blauwe vlakken (de intensiteit van de overeenkomende kleuren wordt weergegeven in grijstinten).

Hoe werkt een videocodec. Deel 1. Basisprincipes

We zien dat de tinten rood in het origineel op dezelfde plekken te zien zijn als waar de helderste delen van het tweede gezicht zich bevinden. Terwijl de bijdrage van de blauwe kleur voornamelijk alleen te zien is in de ogen van Mario (het laatste gezicht) en de elementen van zijn kleding. Let op waar alle drie de kleurvlakken de minste bijdrage leveren (de donkerste delen van de afbeeldingen) — dit zijn de snorharen van Mario.

Voor het opslaan van de intensiteit van elke kleur is een bepaald aantal bits vereist — deze waarde wordt de kleurendiepte. Stel dat 8 bits (afgeleid van de waarde van 0 tot 255) worden gebruikt voor één kleurvlak. Dan hebben we een kleurendiepte van 24 bits (8 bits × 3 vlakken R/G/B).

Een andere eigenschap van een afbeelding is resolutie, wat het aantal pixels in één dimensie vertegenwoordigt. Vaak wordt deze aangegeven als breedte × hoogte, zoals hieronder in de afbeeldingvoorbeeld 4 op 4.
Hoe werkt een videocodec. Deel 1. Basisprincipes

Een andere eigenschap waarmee we te maken hebben bij het werken met afbeeldingen/video's is beeldverhouding, die de gebruikelijke proportionele relatie tussen de breedte en hoogte van een afbeelding of pixel beschrijft.

Als men zegt dat een bepaalde film of afbeelding de afmeting 16 op 9 heeft, wordt meestal bedoeld de beeldverhouding van het scherm (DAR — van Display Aspect Ratio). Maar soms kunnen er verschillende vormen van individuele pixels zijn — in dit geval hebben we het over de pixelverhouding (PAR — van Pixel Aspect Ratio).

Hoe werkt een videocodec. Deel 1. Basisprincipes

Hoe werkt een videocodec. Deel 1. Basisprincipes

Voor de huismoeder om op te letten: DVD overeenkomt met DAR 4 op 3

Hoewel de werkelijke resolutie van de DVD 704×480 is, behoudt deze toch een beeldverhouding van 4:3, omdat PAR 10:11 is (704×10 / 480×11).

En ten slotte kunnen we video's definiëren als een reeks van n frames per tijdperiood tijd, wat als een extra dimensie kan worden beschouwd. En n dan is het de framefrequentie of het aantal frames per seconde (FPS — van Frames per Second).

Hoe werkt een videocodec. Deel 1. Basisprincipes

Het aantal bits per seconde dat nodig is voor het afspelen van video is zijn dataverhouding — bitrate.

bitrate = breedte * hoogte * kleurendiepte * frames per seconde

Bijvoorbeeld, voor video met 30 frames per seconde, 24 bits per pixel en een resolutie van 480×240 is 82.944.000 bits per seconde of 82.944 Mbps vereist (30x480x240x24) — dit is zonder enige compressiemethoden te gebruiken.

Als de dataverhouding bijna constant is, wordt deze een constante dataverhouding (CBR — van constant bit rate). Maar deze kan ook variëren, in dat geval wordt het variabele dataverhouding (VBR — van variable bit rate).

Deze grafiek toont een beperkte VBR, wanneer er niet te veel bits worden besteed in het geval van een volledig zwart frame.

Hoe werkt een videocodec. Deel 1. Basisprincipes

Oorspronkelijk hebben ingenieurs een methode ontwikkeld om de waargenomen framefrequentie van een videodisplay te verdubbelen zonder extra bandbreedte te gebruiken. Deze methode staat bekend als interlaced video; in wezen stuurt het de helft van het scherm in het eerste 'frame' en de andere helft in het volgende 'frame'.

Tegenwoordig gebeurt de visualisatie van scènes voornamelijk met behulp van de technologie voor progressieve scanning. Dit is een manier om bewegende beelden weer te geven, op te slaan of te verzenden, waarbij alle lijnen van elk frame achtereenvolgens worden getekend.

Hoe werkt een videocodec. Deel 1. Basisprincipes

Nou, nu weten we hoe een afbeelding digitaal wordt weergegeven, hoe de kleuren zijn opgebouwd, hoeveel bits per seconde we nodig hebben om video weer te geven, of de bitrate constant (CBR) of variabel (VBR) is. We weten over de opgegeven resolutie met een opgegeven framerate en hebben kennisgemaakt met veel andere termen, zoals interlaced video, PAR en enkele anderen.

Verwijdering van redundantie

Het is bekend dat ongecomprimeerde video niet normaal te gebruiken is. Een uur video met een resolutie van 720p en een framerate van 30 frames per seconde zou 278 GB in beslag nemen. Dit getal krijgen we door 1280 x 720 x 24 x 30 x 3600 (breedte, hoogte, bits per pixel, FPS en tijd in seconden) met elkaar te vermenigvuldigen.

Gebruik van verliesloze compressie-algoritmen, zoals DEFLATE (gebruikt in PKZIP, Gzip en PNG), zal niet voldoende verminderen in de benodigde bandbreedte. We moeten naar andere manieren van video-compressie zoeken.

Hiervoor kunnen we gebruik maken van de kenmerken van ons zicht. We onderscheiden helderheid beter dan kleuren. Video is een verzameling opeenvolgende afbeeldingen die in de loop van de tijd herhaald worden. Tussen aangrenzende frames van één scène zijn de verschillen klein. Bovendien bevat elk frame veel gebieden die dezelfde (of vergelijkbare) kleur gebruiken.

Kleur, helderheid en onze ogen

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

Hoe werkt een videocodec. Deel 1. Basisprincipes

Als je niet ziet dat de kleuren van de vierkanten in de linkerhelft van de afbeelding A en B werkelijk hetzelfde zijn, is dat normaal. Onze hersenen dwingen ons om meer aandacht te besteden aan licht en schaduw, dan aan kleur. Aan de rechterkant is er een verbinding van dezelfde kleur tussen de gemarkeerde vierkanten — daarom (dwz onze hersenen) kunnen we gemakkelijk vaststellen dat het daar in feite dezelfde kleur is.

Laten we (vereenvoudigd) bekijken hoe onze ogen werken. Het oog is een complex orgaan, bestaande uit veel onderdelen. Echter, we zijn vooral geïnteresseerd in kegeltjes en staafjes. Het oog bevat ongeveer 120 miljoen staafjes en 6 miljoen kegeltjes.

Laten we kleur- en lichtwaarneming beschouwen als afzonderlijke functies van bepaalde delen van het oog (in werkelijkheid is het iets gecompliceerder, maar we houden het simpel). Staafjes zijn vooral verantwoordelijk voor helderheid, terwijl kegeltjes verantwoordelijk zijn voor kleur. Kegeltjes worden ingedeeld in drie types, afhankelijk van het aanwezige pigment: S-kegeltjes (blauw), M-kegeltjes (groen) en L-kegeltjes (rood).

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

Hoe werkt een videocodec. Deel 1. Basisprincipes

Functies van contrastgevoeligheid

Onderzoekers van experimentele psychologie en vele andere gebieden hebben talloze theorieën over het menselijk zicht ontwikkeld. En een daarvan wordt genoemd de functies van contrastgevoeligheid. Ze zijn gerelateerd aan ruimtelijke en temporele verlichting. In het kort gaat het erom hoeveel veranderingen vereist zijn voordat de waarnemer deze opmerkt. Let op het meervoud van het woord "functie". Dit komt omdat we de contrastgevoeligheidsfuncties niet alleen kunnen meten voor zwart-witbeelden, maar ook voor kleuren. De resultaten van deze experimenten tonen aan dat onze ogen in de meeste gevallen gevoeliger zijn voor helderheid dan voor kleur.

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

Kleurmodel

We hebben al een beetje onderzocht hoe we met kleurafbeeldingen kunnen werken met behulp van het RGB-schema. Er zijn andere modellen. Er is een model dat helderheid van kleur scheidt en het staat bekend als YCbCr. Trouwens, er zijn andere modellen die een soortgelijke scheiding maken, maar we zullen alleen deze bespreken.

In dit kleurmodel Y is de representatie van helderheid, en er worden twee kleurkanalen gebruikt: Cb (verzadigd blauw) en Cr (verzadigd rood). YCbCr kan worden verkregen uit RGB, net zoals een omgekeerde conversie mogelijk is. Met dit model kunnen we full-color afbeeldingen maken, zoals hieronder te zien is:

Hoe werkt een videocodec. Deel 1. Basisprincipes

Conversie tussen YCbCr en RGB

Iemand zou kunnen tegenwerpen: hoe kunnen alle kleuren worden verkregen zonder groen?

Om deze vraag te beantwoorden, converteren we RGB naar YCbCr. We gebruiken de coefficients die in de standaard zijn vastgesteld. BT.601, die werd aanbevolen door de afdeling ITU-R. Deze afdeling bepaalt de normen voor digitale video. Bijvoorbeeld: wat is 4K? Wat moeten de framerate, resolutie en kleurmodel zijn?

Laten we eerst de helderheid berekenen. We gebruiken de constanten die door de ITU zijn voorgesteld en vervangen de RGB-waarden.

Y = 0.299R + 0.587G + 0.114B

Nadat we de helderheid hebben verkregen, scheiden we de blauwe en rode kleur:

Cb = 0.564(B — Y)

Cr = 0.713(R — Y)

En we kunnen ook terug converseren en zelfs groen verkrijgen met behulp van YCbCr:

R = Y + 1.402Cr

B = Y + 1.772Cb

G = Y — 0.344Cb — 0.714Cr

Over het algemeen gebruiken weergaven (monitoren, televisies, schermen, enz.) alleen het RGB-model. Maar dit model kan op verschillende manieren worden georganiseerd:

Hoe werkt een videocodec. Deel 1. Basisprincipes

Kleur subsampling

Met een afbeelding die wordt weergegeven als een combinatie van helderheid en chrominantie, kunnen we de hogere gevoeligheid van het menselijke gezichtsvermogen voor helderheid gebruiken dan voor chrominantie, door selectief informatie te verwijderen. Kleur subsampling is een methode van afbeelding codering waarbij minder resolutie voor chrominantie wordt gebruikt dan voor helderheid.

Hoe werkt een videocodec. Deel 1. Basisprincipes

Hoe ver is het toegestaan om de chrominantie-resolutie te verlagen?! Het blijkt dat er al enkele schema's zijn die beschrijven hoe resolutie en fusie te verwerken (Eindkleur = Y + Cb + Cr).

Deze schema's staan bekend als subsampling systemen en worden uitgedrukt in een verhouding van 3: 1 — a:x:y, die het aantal monsters van helderheids- en chrominantiesignalen definieert.

a — referentie horizontale sampling (meestal gelijk aan 4)
x — het aantal chrominantiekleine monsters in de eerste rij pixels (horizontale resolutie ten opzichte van a)
y — het aantal wijzigingen in chrominantiesamples tussen de eerste en tweede rij pixels.

Een uitzondering is 4:1:0, die ervoor zorgt dat er één chrominantie monster is in elke 4 op 4 helderheid resolutieblok.

Algemene schema's die worden gebruikt in moderne codecs:

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

YCbCr 4: 2: 0 — een voorbeeld van fusie

Dit is een samengevoegd afbeeldingsfragment met behulp van YCbCr 4:2:0. Let op dat we slechts 12 bits per pixel gebruiken.

Hoe werkt een videocodec. Deel 1. Basisprincipes

Zo ziet hetzelfde beeld eruit, gecodeerd met de belangrijkste soorten kleursubdifferentiatie. De bovenste rij is de uiteindelijke YCbCr, de onderste rij toont de chrominantie-resolutie. Heel behoorlijk resultaat, gezien de kleine kwaliteitsverliezen.

Hoe werkt een videocodec. Deel 1. Basisprincipes

Vergeet niet dat we 278 GB schijfruimte berekenden voor het opslaan van een uur video in 720p met 30 frames per seconde? Als we YCbCr 4:2:0 gebruiken, zal deze grootte halveren - 139 GB. We zijn nog steeds ver van een acceptabel resultaat.

Je kunt zelf de YCbCr-histogram genereren met FFmpeg. In deze afbeelding overheerst blauw boven rood, wat duidelijk zichtbaar is in de histogram.

Hoe werkt een videocodec. Deel 1. Basisprincipes

Chrominantie, helderheid, kleurenschema - video-overzicht

Dit geweldige video wordt aanbevolen om te bekijken. Hierin wordt uitgelegd wat helderheid is, en alle punten worden aan de orde gesteld. ё over helderheid en kleur.

Video afspelen

Soorten frames

Laten we verder gaan. We gaan proberen de tijdsredundantie te verminderen. Maar eerst laten we wat basisterminologie definiëren. Stel 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

We kunnen veel herhalingen in de frames zien: bijvoorbeeld de blauwe achtergrond, die van frame tot frame niet verandert. Om dit probleem op te lossen, kunnen we ze abstract classificeren als drie soorten frames.

I-frame (Intro Frame)

I-frame (referentiekader, sleutelafbeelding, intern frame) is autonoom. Onafhankelijk van wat er vereist is om te visualiseren, is een I-frame in wezen een statische foto. Het eerste frame is meestal een I-frame, maar we zullen regelmatig I-frames tegenkomen, zelfs ver na de eerste frames.

Hoe werkt een videocodec. Deel 1. Basisprincipes

P-frame (Predicted Frame)

P-frame (voorspellend frame) maakt gebruik van het feit dat het huidige beeld bijna altijd kan worden gereproduceerd met behulp van het vorige frame. In het tweede frame is de enige wijziging de bewegende bal. We kunnen frame 2 verkrijgen door frame 1 iets te wijzigen, alleen door het verschil tussen deze frames te gebruiken. Voor het opbouwen van frame 2 verwijzen we naar het voorgaande frame 1.

Hoe werkt een videocodec. Deel 1. Basisprincipes ← Hoe werkt een videocodec. Deel 1. Basisprincipes

B-frame (Bi-predictive Frame)

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

Hoe werkt een videocodec. Deel 1. Basisprincipes ← Hoe werkt een videocodec. Deel 1. Basisprincipes → Hoe werkt een videocodec. Deel 1. Basisprincipes

Tussentijdse output

Deze typen frames worden gebruikt om de beste compressie te waarborgen. We zullen bespreken hoe dit gebeurt in het volgende gedeelte. Laten we ondertussen opmerken dat het meest 'kostbare' in termen van geheugen het I-frame is, het P-frame is aanzienlijk goedkoper, en de meest voordelige optie voor video is het B-frame.

Hoe werkt een videocodec. Deel 1. Basisprincipes

Tijdelijke redundantie (inter-frame voorspelling)

Laten we kijken naar de mogelijkheden die we hebben om herhalingen in de tijd te minimaliseren. Dit type redundantie kan worden opgelost met behulp van wederzijdse voorspelling.

Laten we proberen zo min mogelijk bits te besteden aan de codering van de sequentie van frames 0 en 1.

Hoe werkt een videocodec. Deel 1. Basisprincipes

We kunnen aftrekken, we trekken simpelweg frame 1 af van frame 0. We krijgen frame 1 door alleen het verschil tussen dat frame en het vorige frame te gebruiken, en coderen in feite alleen het resulterende restant.

Hoe werkt een videocodec. Deel 1. Basisprincipes

Maar wat als ik je vertel dat er een nog betere methode is die nog minder bits gebruikt?! Laten we eerst frame 0 verdelen in een duidelijke raster van blokken. En laat vervolgens proberen de blokken van frame 0 te matchen met frame 1. Met andere woorden, laten we de beweging tussen de frames beoordelen.

Van Wikipedia — bewegingscompensatie met blokken

Blokgewijze bewegingscompensatie verdeelt het huidige frame in niet-overlappende blokken en de bewegingscompensatievector geeft de oorsprong van de blokken aan (een veel voorkomende misvatting is dat het vorige frame wordt verdeeld in niet-overlappende blokken, en de bewegingscompensatievectoren aangeven waar deze blokken naartoe gaan. In werkelijkheid is het omgekeerd — niet het vorige frame wordt geanalyseerd, maar het volgende, en we bepalen niet waar de blokken naartoe bewegen, maar waar ze vandaan komen). Gewoonlijk overlappen de oorspronkelijke blokken elkaar in het oorspronkelijke frame. Sommige videocompressie-algoritmes assembleren het huidige frame uit delen van niet één, maar meerdere eerder verzonden frames.

Hoe werkt een videocodec. Deel 1. Basisprincipes

Tijdens de evaluatie zien we dat de bal is verplaatst van (x=0, y=25) naar (x=6, y=26), waarden x en y bepalen de bewegingsvector. Een andere stap die we kunnen nemen om bits te besparen, is om alleen het verschil in bewegingsvectoren te coderen tussen de laatste positie van het blok en de voorspelde, zodat de uiteindelijke bewegingsvector (x=6-0=6, y=26-25=1) zal zijn.

In een echte situatie zou deze bal verdeeld zijn in n blokken, maar dat verandert de essentie niet.

Objecten in het beeld 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 overeenstemming zal zijn tussen de blokken. Hier is een gecombineerde weergave van onze schatting en de echte afbeelding.

Hoe werkt een videocodec. Deel 1. Basisprincipes

Maar we zien dat wanneer we de bewegingsschatting toepassen, de data voor codering aanzienlijk minder is dan wanneer we een eenvoudigere methode gebruiken van het berekenen van de delta tussen de frames.

Hoe werkt een videocodec. Deel 1. Basisprincipes

Hoe de echte bewegingscompensatie eruit zal zien

Deze methode wordt onmiddellijk op alle blokken toegepast. Vaak zal onze hypothetische bewegende bal in meerdere blokken worden verdeeld.

Hoe werkt een videocodec. Deel 1. Basisprincipes

Je kunt deze concepten zelf uitproberen door gebruik te maken van Jupyter.

Om de bewegingsvectoren te zien, kun je een video maken met externe voorspelling met behulp van ffmpeg.

Hoe werkt een videocodec. Deel 1. Basisprincipes

Je kunt ook gebruikmaken van Intel Video Pro Analyzer (het is betaald, maar er is een gratis proefversie die alleen beperkt is tot de eerste tien frames).

Hoe werkt een videocodec. Deel 1. Basisprincipes

Ruimtelijke redundantie (interne voorspelling)

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

Hoe werkt een videocodec. Deel 1. Basisprincipes

Laten we dit voorbeeld bekijken. Scène bestaat voornamelijk uit blauwe en witte kleuren.

Hoe werkt een videocodec. Deel 1. Basisprincipes

Dit is een I-frame. We kunnen de vorige frames voor voorspelling niet gebruiken, maar we kunnen het wel comprimeren. We coderen de selectie van het rode blok. Als we naar de buren kijken, merken we dat er enkele kleurtrends rondom zijn.

Hoe werkt een videocodec. Deel 1. Basisprincipes

We veronderstellen dat de kleuren in het frame verticaal verspreid zijn. Dit betekent dat de kleur van onbekende pixels de waarden van zijn buren zal bevatten.

Hoe werkt een videocodec. Deel 1. Basisprincipes

Zo'n voorspelling kan ook onjuist blijken te zijn. Daarom moet deze methode (interne voorspelling) worden toegepast, en vervolgens moeten de werkelijke waarden nogmaals worden afgetrokken. Dit zal ons een restblok geven, wat zal leiden tot een veel compacter matrix in vergelijking met het origineel.

Hoe werkt een videocodec. Deel 1. Basisprincipes

Als je wilt oefenen met interne voorspellingen, kun je een video maken met macroblokken en hun voorspellingen met behulp van ffmpeg. Om de betekenis van elke kleur van het blok te begrijpen, moet je de documentatie van ffmpeg bekijken.

Hoe werkt een videocodec. Deel 1. Basisprincipes

Je kunt ook Intel Video Pro Analyzer gebruiken (zoals ik eerder al noemde, is er in de gratis proefversie een limiet op de eerste 10 frames, maar dat is in het begin voldoende voor jou).

Hoe werkt een videocodec. Deel 1. Basisprincipes

Tweede deel: Principes van videocodecs

Bron: habr.com

Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers 🔥 Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers | ProHoster