Recenze  |  Aktuality  |  Články
Doporučení  |  Diskuze
Filmy a seriály, streamovací služby
Televize  |  Projektory
Audio a domácí kina
Multimediální centra  |  Ostatní
Svět hardware  |  Digimanie
Svět mobilně

Kodeky tajemství zbavené

13.10.2005, Radek Jahoda, článek
Před nedávnem jsme se podívali v článku Kontejner není kontejner na nejrozšířenější multimediální kontejnery, tentokrát se podíváme do jejich nitra - čili na kodeky, konkrétně na kodeky videa.
Začněme opět hezky od základů, i když tyto věci asi každý zná. Ale tento článek je určen i pro naprosté laiky, takže se tomu nebudeme vyhýbat. Kodek je zkratka dvou slov KOder+ DEKoder, v angličtině kodek=codec a podobně jde o zkratku COder+DECoder. Koder se stará o kompresi a dekoder o dekompresi. Protože jeden bez druhého je zbytečný, dělají se většinou společně do jednoho modulu. Aby mohlo tento modul používat více programů, je definováno jednotné programové rozhraní. Přes toto rozhraní se kodeku při kompresi posílá nekomprimované video v požadovaném formátu (viz tento článek) a naopak kodek posílá již zkomprimované video zpět programu. Při dekompresi je to samozřejmě naopak. Přes toto rozhraní lze i konfigurovat parametry kodeku jako požadovaný datový tok, kvalitu, rychlost komprese apod., buď přímo nebo lze zobrazit konfigurační dialog, který je v kodeku zabudovaný.

Ve Windows existují tato rozhraní dvě. Starší Video Compression Manager (VCM) pochází ještě z dob Windows 3.1 a má značná omezení. Proto bylo vytvořeno v rámci DirectShow rozhraní nové, které programátorům umožňuje lepší komunikaci s kodekem. Nejde vlastně ani tak o rozhraní kodeku, ale toto rozhraní je univerzální pro všechny DirectShow filtry. To jen tak na vysvětlení, proč některé programy nedokáží využít všechny nainstalované kodeky, např. VirtulDub pracuje jen s VCM kodeky.

My se ale podívejme na princip různých kodeků, protože z toho plyne i jejich rozdílný způsob použití. Právě nesprávný způsob použití kodeku je nejčastější chybou a také velmi častým dotazem.

Kodeky lze rozdělit podle několika kriterií. Pokud vezmeme již zmíněný způsob použití, tak jsou to dvě kategorie. První kategorií jsou kodeky určené pro následné zpracování videa. Hlavním cílem je snížit velikost nekomprimovaného videa, ale bez znatelné degradace obrazu. Požadavkem je také velká rychlost komprese, aby bylo umožněno kódování v reálném čase, ale také velká rychlost dekomprese, aby nezdržovala práci při editaci.

Zastavme se ještě u zmíněné degradaci obrazu. Je zde na mysli matematická degradace, tzn. aby se data po dekompresi co nejméně odlišovala od originálu. Nejde jen o to, aby obraz vizuálně vypadal stejně jako originál, protože při následné kompresi do jiného kodeku jsou i velmi malé, lidskému oku neviditelné změny ztížením práce dalšímu kompresoru. Kompresory totiž většinou zanášejí do obrazu vysokofrekvenční složky, které jsou nejhůře kompresovatelné. Do této kategorie patří všechny bezeztrátové kodeky (dekomprimovaný obraz je identický originálu) a také MJPEG a DV. Druhou kategorií jsou kodeky pro finální kompresi. Jejich cílem je co největší komprese, aby se video vešlo na požadované úložné médium (CD, DVD). Kvalita videa má zůstat vizuálně co nejvěrnější originálu, mírná degradace obrazu není na škodu, pokud není za běžných podmínek postřehnutelná lidským okem. Sem patří všechny kodeky MPEG a jejich odvozeniny jako DivX, XviD, H.264 a také Real Video apod.

Dalším možným rozdělením je způsob komprese. Každý kodek sice využívá vlastní způsob, ale v naprosté většině jde o obecně známé principy. Takto bychom mohli do jedné kategorie dát bezeztrátové kodeky, které využívají klasické způsoby redukce dat jako Huffmanovo kódování (kodek Huffyuv) nebo i způsoby komprese používané pakovacími programy (Zip).

Druhou kategorií jsou kodeky, které pro redukci využívají převod do frekvenční oblasti a nejvyšší koeficienty jsou zanedbány. Snad všechny kodeky rozdělují obraz do menších bloků o rozměrech 8x8 bodů a tyto bloky jsou pomocí Diskrétní kosinové transformace (DCT) převedeny do časové oblasti. DCT je podobná Fourierově transformaci a převádí signál do frekvenční oblasti.


kde koeficienty

pro z>0 a pro z=0

Pomocí tohoto algoritmu získáme hodnoty všech koeficientů - opět v matici 8x8 hodnot [u,v] pro zdrojovou tabulku [x,y], s(y,x) jsou zdrojové hodnoty. Pokud znáte klasickou DCT, tak jde o podobný vzorec, tento je ale převeden pro maticový systém. Čím méně vysokofrekvenčních složek se v obrazu vyskytuje, tím více nul je ve výsledku, přičemž užitečné hodnoty jsou vždy v levém horním rohu, nulové hodnoty nejsou uloženy. Ukládá se po diagonálách a střídavě v opačném směru - tomuto způsobu se říká zigzag scan order.

Za normálních podmínek se nepřenáší pouze tyto nulové hodnoty, ale pokud chceme ještě zvýšit kompresi, nepřenáší se ani poslední platné hodnoty. Oříznutí těchto koeficientů má pak za následek koskatění obrazu práve v těchto blocích 8x8 bodů. Je zřejmé, že u jednolitých ploch, kde se nevyskytují vyšší frekvence, je tento způsob vhodný (nejvyšší koeficienty budou nulové), v extrémním případě, kdy jsou všechny vstupní hodnoty stejné dostaneme po DCT pouze jeden koeficient se stejnou hodnotou.

Naopak u obrazu s mnoha detaily a ostrými hranami bude docházet k degradaci obrazu, opět extrémní případ ve vstupu je jen jedna hodnota odlišná od všech ostatních, po DCT dostaneme všechny koeficienty nenulové. Čím více nejvyšších koeficientů je zanedbáno, tím větší komprese se dosáhne, ale dojde tím k větší degradaci (koskatění) obrazu. Tento způsob dnes používá většina kodeků, protože je rychlý a dnešní procesory ho díky podpoře různých dodaných instrukcí (MMX, SSE) zvládají dobře.

Pokud Vám něco připomíná, tak se nepletete. Stejně pracuje komprese JPEG pro obrázky a i video má svůj ekvivalent - kodek MJPEG (Motion JPEG) komprimuje každý obrázek jako JPEG. Používají ho například i pokročilejší kodeky jako MPEG, DivX, WMV atd. U všech ale dochází k další redukci tím, že DCT koeficienty, které mohou dosahovat hodnoty až 2047 pro osmibitový vstup, jsou redukovány opět na osm bitů, tedy děleny osmi nebo jiným číslem (lze ho definovat u některých kodeků kvantizační tabulkou pro každý koeficient zvlášť). Této redukci se říká kvantizace a zhoršuje se tím dále přesnost komprese.

Při dekompresi dojde naopak k vynásobení tímto číslem a pomocí inverzní (zpětné) diskrétní kosinové transformace (iDCT) se opět zrekonstruuje původní blok 8x8 bodů, který utrpí deformaci, jak jsme si právě vysvětlili. Pro lidské oko není tato změna za normálních okolností postřehnutelná, ale při následném zpracování a opětovné kompresi vnáší do obrazu takové složky signálu, které mohou značně ztížit práci dalšímu kodeku - viz dále.

kde rovněž

pro z>0 a pro z=0

Druhý způsob komprese je z matematického hlediska značně složitější. Jedná se o Wavelets transformaci (WT, v češtině se někdy nazývá vlnková transformace). Tato metoda je z matematického hlediska rovněž velmi stará, její počátky sahají až do začátku devatenáctého století, kdy Joseph Fourier objevil, že se jakákoliv funkce nechá aproximovat pomocí kombinace funkcí sinus a cosinus. Právě aproximace je základem této metody. Zásadní roli ale hraje aproximační funkce a také vhodná volba okna, ve kterém se metoda použije. Zjednodušeně řečeno, můžeme aproximovat jak celé město, tak jednotlivé domy. Existuje nekonečné množství způsobů a možností, jak zvolit okno a analyzovat jeho obsah. Základem je zvolit si mateřskou funkci, tzv. Wavelet, který slouží jako aproximační funkce. Wavelet musí mít nulovou střední hodnotu a má podobný význam jako sin/cos, které používá Fourierova transformace. Pomocí WT se vlastně určuje podobnost (korelace) mateřské funkce s analyzovanou, v našem případě s obrazem. Nedělá nic jiného, než roztahuje mateřskou funkci do šířky a zjišťuje její podobnost s originálem.



Koeficient s mění šířku transformace, koeficient l pak jeho pozici, dohromady pak určují jeden stupeň transformace. Můžeme si ho představit jako filtr, kterým filtrujeme vstupní signál se změněnými parametry. Vzniklé funkce tvoří ortogonální bázi - waveletovou bázi. Nejjednodušším waveletem je Haarův wavelet, který má takovýto tvar:



U tohoto waveletu dostaneme po první transformaci střední hodnotu signálu, s každou další transformací se přibližujeme původnímu signálu. Velkou výhodou WT je to, že pro různé typy vstupního signálu lze vybrat vhodnou mateřskou funkci. Takto lze zajistit nutnost co nejmenšího počtu koeficientů pro rekonstrukci původního obrazu. Celý výpočet je samozřejmě složitější a nemá cenu zabíhat do podrobností, nám bude stačit tento zevrubný popis. Připomeňme si ještě, že tuto metodu lze použít obecně a využívá se i pro analýzu signálů, např. pro popis počasí, pro analýzu zvuku, odstraňování šumu atd.

Výše popsané metody, které vychází z čistě matematického základu, mají samozřejmě své limity, nad které již nelze dále zvyšovat kompresi bez značného dopadu na kvalitu obrazu. Proto se začínají uplatňovat metody, které se dívají na obraz z visuálního hlediska, tedy faktu, že jednotlivé snímky jsou si více či méně podobné. Hovoříme o odstranění časové podobnosti (temporal redundancy). Dostáváme se tak k dalšímu možnému rozdělení. Všechny předchozí metody jsou intraframe (intra=uvnitř), tzn. že pro dekompresi jednoho snímku je postačující znát komprimovaná data pouze pro tento snímek.

Lze ale využít vlastnosti videa, že následující snímky jsou více či méně podobné těm předchozím. Lze tedy zakódodovat pouze změnu mezi jednotlivými snímky a ne snímky celé. Této metodě se říká interframe (inter=mezi). Tuto metodu používají všechny moderní kodeky jako MPEG, DivX, XviD apod. Má kromě vyšší komprese také své nevýhody. Vnáší do komprese další chyby, hledání změn v obraze je zdlouhavé a tak se prodlužuje doba komprese, při dekompresi jednoho snímku je nutné dekomprimovat i několik předcházejících snímků, což zase prodlužuje dekompresi. Z uvedeného plyne, že tyto kodeky nejsou příliš vhodné pro střih. Pokud tedy například zachytáváte rovnou do MPEG a výsledek bez rekomprese vypalujete na DVD, je vše v pořádku. Pokud se ale pokusíte tento materiál stříhat, není to příliš vhodné. Nehledě na to, že při kompresi v reálném čase se omezuje hledání změn v obraze, protože se to prostě musí stihnout do příchodu dalšího snímku. Komprese offline, tedy komprese uloženého videa je tedy kvalitnější, kompresor si může dovolit s hledáním změn více práce.

Klasický model, který používá například MPEG-1/2 (formát zavedený standardizační organizací Motion Picture Expert Group), je založen ne na dvou, ale rovnou na třech typech snímků:
    • I - intra coded snímek je jak již podle mázvu víme samostatný snímek, který ke kompresi resp. dekompresi nepotřebuje žádný jiný snímek.
    • P - forward predicted snímek potřebuje jeden předcházející snímek, ať už je to I-snímek nebo jiný P-snímek.
    • B - forward and backward predicted jsou snímky, které jsou odvozeny jak od předchozího I nebo P-snímku, tak i od následujícího.

P-snímky a B-snímky jsou tedy interframes, protože využívají informace z jiných snímků, které ale samotné nemají k dispozici. Z uvedeného plyne, že několik P-snímků může být mezi dvěma I-snímky, B-snímky mohou být mezi dvěma I/P snímky. Základním kamenem celého algoritmu je predikce, tedy jakýsi předpoklad pohybu obrazu (nebo jeho částí). Celý jeden shluk snímků mezi dvěma I-snímky včetně prvního se nazývá GOP (Group Of Pictures). Při požadavku na dekompresi konkrétního P snímku se musí nejprve najít předchozí I-snímek, poté dekomprimovat všechny následující P-snímky až do našeho snímku. U B-snímků musíme dekódovat oba okolní P-snímky. A nejde jen o editaci, stejná situace je při přehrávání. Pokud bychom měli příliš dlouhý GOP, trvalo by velice dlouho, než bychom se k požadovanému snímku dopracovali. Někteří experti používají délku GOPu u MPEG-4 i několik minut, což je samozřejmě nesmysl. Objevilo se i video, které mělo jediný I-snímek! Hádejte který. U klasického MPEG-1/2 na DVD se tento problém řeší tak, že je definována maximální délka GOPu 12 pro PAL resp. 15 snímků pro NTSC a přehrávání začíná vždy na I-snímku. Rozptyl přibližně půl vteřiny se při navigaci ani nepozná.



Podívejme se na způsob, kterým se provádí zmíněná predikce u MPEG-1/2. Obraz je nejprve rozdělen do bloků o rozměrech 16x16 bodů a zkoumá se možné posunutí tohoto bloku z původního místa. Posunutí tohoto bloku vytvoří vektor, který ho jednoznačně definuje. Jde o posun v horizontální a vertikální ose. Posunutí může být ale jen do maximální vzdálenosti 64 bodů (pro MPEG-2). Tomuto vektoru se říká pohybový vektor (motion vector) a metodě motion estimation. Je ale zřejmé, že v reálném světě není pohyb vždy tak jednoznačný, objekt se mohl otočit nebo zmenšit. Proto je ještě proveden výpočet rozdílu mezi původním a výsledným obrazem a tento je teprve pomocí DCT zakódován - tomuto principu se říká motion compensation. Rozdílová složka obsahuje většinou jen málo nenulových hodnot a tak se snadno zakóduje. Pokud by chyba byla příliš velká nebo nebyl nalezen pohybový vektor, enkodér se může rozhodnout nekódovat rozdíl, ale zakódovat původní blok jako u I snímku. Ne všechny bloky tedy musí být pohybové.



MPEG-1 formát byl určen především pro video v PC s použitím tehdy nastupujícími CD disky - tzv. VideoCD formát ale omezuje pro tento účel rozlišení na 352x288 pro PAL resp. 352x240 pro NTSC. MPEG-2 pak jako formát určený pro komerční "stolní" DVD zařízení již pracuje s plným formátem 720x576 pro PAL resp. 720x480 pro NTSC s možností prokládaného formátu, jeho kvalita je přibližně identická s TV vysíláním. MPEG-2 ale dále definuje různé kvalitativní stupně, aby to nebylo jednoduché, tak navíc dvěma způsoby. Jeden způsob jsou profily, které určují komplexnost kódování, tedy jaké části standardu jsou použity.

SP
Simple Profile
Používá pouze snímky typu I a P.
MP
Main Profile
Nejpoužívanější (DVD, DVB, HDV), používá samplování barev 4:2:0 a všechny typy snímků IPB.
422P
4:2:2 Profile
Používán ve studiové produkci a jako jediný používá samplování 4:2:2.
SNR
SNR Profile
Jako Main Profile, navíc umožňuje rozdělení bitrate podle odstupu signálu od šumu pomocí kvantizace.
SP
Spatial Profile
Jako Main Profile, ale zakódovává nejprve v nižším rozlišení a navrch teprve ve vyšším rozlišení.
HP
High Profile
Umožňuje rovněž 4:2:2 samplování a navíc SNR a Spatial škálování.

Druhý způsob kvality určuje jednoduše rozlišení a označuje se jako Level.

LL Low Level Nejnižší rozlišení 352x288 resp. 352x240, maximálně 4Mb/s.
ML Main Level Nejpoužívanější s rozlišením 720x576 resp. 720x480 s maximálním bitrate 15Mb/s.
H-14 High 1440 Je používán HDV s rozlišením 1280×720p a 1440×1080i, maximálně 60Mb/s.
HL High Level 1920x1080, maximální bitrate 80Mb/s, používán u ATSC HD s 19Mb/s.

Ne každý level je možné použít se všemi profily, nejčastější je použití MP@ML (DVD, DVB).

MPEG ve verzi 1 a 2 byl ale jen začátek popisu videa z visuálního hlediska. Standard MPEG-4 jde mnohem dále. Nedívá se na obraz jako celek, ale rozděluje ho na pozadí a jednotlivé objekty, které jsou na tomto pozadí. Protože je MPEG-4 poměrně složitý, je dále rozdělen do částí, které ho popisují a později i doplňují o další vlastnosti (již jste určitě slyšeli o Part 10 - AVC). MPEG-4 je také rozdělen do několika profilů, které rozdělují použití i vlastnosti, které je možné použít. Jako první profil byl MPEG-4 SP (Simple Protocol), který byl určen pro aplikace s nízkým bitrate - pro internet, videokonference, streamované video apod., kde je jen velmi málo pohybu. Tato verze nepočítá s B-snímky, používá pouze I-snímky (nazývané také klíčové snímky) a P-snímky. Další verze MPEG-4 ASP (Advanced Simple Protocol), přidává podporu B-snímků, detekci pohybu objektů po celém snímku a přesnost pohybu na 1/4 pixelu. Dalším doplněním je verze MPEG-4 AVC (Advanced Video Coding), známá také jako Part 10 a přijatá jako standard H.264. Umožňuje ještě větší kompresi při srovnatelné kvalitě jako MPEG-2, není již určena pouze pro streamované video, ale jako náhrada za MPEG-2 v komerčních zařízeních. Mezi nejvýznamnější změny patří možnost predikce obrazu i přes více snímků, variabilní velikost bloků pro detekci pohybu od 4x4 bodů, váhová predikce, vylepšeno kódování I-snímků, postprocessing pro odstranění koskatění bloků a mnoho dalšího.

Přestože je MPEG-4 poměrně složitý, podívejme se alespoň na základní principy. MPEG-4 stream je jakási visuální scéna (Visual Object Sequence - VS), která se obsahuje libovolný počet objektů (Video Object - VO). Každý objekt není reprezentován pouze v jednom snímku, ale může být ve více snímcích, jeho polohu v čase určuje Video Object Plane (VOP). Jednotlivé VOP jsou zakódovány ve streamu v určité struktuře, které se říká Group of Video Object Planes (GOV) a určuje přístup k VOP ve streamu. Speciálním druhem VOP je Intra coded VOP (I-VOP), což je vlastně normální I-snímek, zakódovaný pomocí DCT s určitou kvantizací. Podobně existují také P-VOP a B-VOP, které vycházejí z nám již známého modelu.

Nejdůležitějším a nejtěžším prvkem kódování je vyhledání objektů v obraze, tedy určení jejich tvaru a jejich zakódování - shape coding. Objekt je zakódován tak, že se určí pixely, které k objektu patří a jejich průhlednost. Jde vlastně o ekvivalent černobílého obrázku s pixely o hodnotě 0-255, která určuje zmíněnou průhlednost. Používá se zde rovněž motion compansation pro zakódování pohybu objektů.

Opakem shape coding je sprite coding - jde o informaci, která náleží k okolí objektu, jde typicky o pozadí, v případěbackground sprite se jedná o celé pozadí - statický obrázek, který je možné zakódovat jen jednou. Možná jste si toho všimli, že pozadí někdy až nepřirozeně stojí, přestože se původně malinko pohybuje, to jen enkoder usoudil, že nejde o důležitou informaci a tento pohyb zanedbal (nejčastěji je možné si toho všimnout u WMV). Tento princip byl zaveden do MPEG-4 kvůli jeho původnímu určení - videokonferenci, kde je pozadí téměř neměnné.

Další důležitou vlastností je scalability, což lze přeložit jako škálovatelnost, v tomto případě ho lze označit i jako interpolace či aproximace - jak objektů v prostoru (spatial), tak i v čase (temporal). U temporal scalability lze dokonce zvětšovat framerate a zlepšit tak plynulost pohybu, přestože v původním záznamu je framerate nižší.

Jak již jsme si řekli, ne všechny vlastnosti mohou být použity. Také ne každý dekoder je schopný zpracovat všechny části streamu. Proto byly zavedeny stupně kompatibility (conformance points), které definují vlastnosti, které je možné použít. Dekoder určitého stupně je schopen dekódovat stream z enkodéru stejného stupně nebo nižšího. Stupeň je definován jako profile, který určuje vlastnosti, které je možné použít, a level, který definuje jejich parametry.
    • Simple Visual Profile - je nejzákladnější profil, který umožňuje použít pouze obdelníkové objekty, každý blok může mít 4 pohybové vektory, celkový počet vektorů není omezen
    • Simple Scalable Visual Profile - přidává podporu pro temporal a spatial scalability
    • Advanced Simple Profile - přidaný dodatečně, založen na Simple Visual Profile s větší účinností komprese
    • Core Visual Profile - přidává objekty libovolného tvaru a temporal scalability
    • Main Visual Profile - umožňuje prokládaný obraz, průhledné objekty a sprite coding

Dnešní kodeky nejčastěji využívají Advanced Simple Profile, mnohé ho ale rozvíjejí o další vlastnosti dle svého, nedrží se přesně doporučených stupňů kompatibility, proto bývají často nekompatibilní (DivX, XviD, 3ivX, WMV). Postupný vývoj kodeků samozřejmě přináší zvýšení komprese při zachování kvality. Standardizované kodeky mají stupeň komprese přibližně takovýto:

MPEG-1
MPEG-2
MPEG-4 ASP
MPEG-4 AVC
100%
90%
50%
35%


Toto samozřejmě není konec vývoje kodeků. Pracuje se již na dalších verzích, nejblíže uvedení je MPEG-7 označovaný jako Multimedia Content Description Interface, který má využívat Waveletů a popisovat scénu ještě komplexněji než MPEG-4, ale to si necháme pro příště - za pár let, až to bude aktuální.

Snad tento článek pomohl k alespoň zevrubnému pochopení principu kodeků a pomůže při volbě toho správného kodeku pro Vaši práci. Má totiž velký vliv na konečné výsledky Vašeho snažení.

Zdroj (vše anglicky):
JPEG a DCT
Popis MPEG a DCT
Popis MPEG-4
Wavelety, popis transformace a použití
a mnoho dalších přečtených materiálů...