14.3. Enkódování s rodinou kodeků libavcodec

14.3. Enkódování s rodinou kodeků `libavcodec`
Předcházející | Kapitola 14. Enkódování s MEncoderem | Další

## 14.3. Enkódování s rodinou kodeků `libavcodec`

`libavcodec` zajišťuje jednoduché enkódování do mnoha zajímavých video a audio formátů. Můžete enkódovat do následujících kodeků (více méně aktuální):

### 14.3.1. Video kodeky `libavcodec`

Jméno video kodeku | Popis
--- | ---
mjpeg | Motion JPEG
ljpeg | lossless (bezztrátový) JPEG
h261 | H.261
h263 | H.263
h263p | H.263+
mpeg4 | standardní ISO MPEG-4 (DivX 5, XviD kompatibilní)
msmpeg4 | prvotní MPEG-4 varianta od MS, v3 (DivX3)
msmpeg4v2 | prvotní MPEG-4 od MS, v2 (použitý ve starých ASF souborech)
wmv1 | Windows Media Video, verze 1 (WMV7)
wmv2 | Windows Media Video, verze 2 (WMV8)
rv10 | RealVideo 1.0
rv20 | RealVideo 2.0
mpeg1video | MPEG-1 video
mpeg2video | MPEG-2 video
huffyuv | bezztrátová komprese
asv1 | ASUS Video v1
asv2 | ASUS Video v2
ffv1 | bezztrátový video kodek z FFmpeg
svq1 | Sorenson video 1
flv | Sorenson H.263 používaný ve Flash Video
dvvideo | Sony Digital Video
snow | Experimentální vlnkově orientovaný kodek z FFmpeg

První pole obsahuje názvy kodeků, které můžete přiřadit konfiguračnímu parametru `vcodec`, např: `-lavcopts vcodec=msmpeg4`

Příklad s MJPEG kompresí:

    mencoder dvd://2 -o titul2.avi -ovc lavc -lavcopts vcodec=mjpeg -oac copy

### 14.3.2. Audio kodeky `libavcodec`

Jméno audio kodeku | Popis
--- | ---
mp2 | MPEG Layer 2
ac3 | AC3, alias Dolby Digital
adpcm_ima_wav | IMA adaptivní PCM (4 bity na vzorek, komprese 4:1)
sonic | experimentální lossy/lossless kodek

Vprvním sloupci naleznate jména kodeků, které byste měli přiřadit parametru `acodec`, například: `-lavcopts acodec=ac3`

Příklad s kompresí AC3:

    mencoder dvd://2 -o titul2.avi -oac lavc -lavcopts acodec=ac3 -ovc copy

Narozdíl od videokodeků z `libavcodec` její audio kodeky neprovádějí inteligentní rozdělení přidělených bitů, jelikož jim chybí nějaký minimální psychoakustický model (pokud vůbec), který obsahuje většina implementací ostatních kodeků. Vězte však, že všechny tyto kodeky zvuku jsou velmi rychlé a pracují jak jsou všude, kde máte MEncoder se zakompilovanou knihovnou `libavcodec` (což je naprostá většina případů) a nezávisejí na externích knihovnách.

### 14.3.3. Enkódovací volby libavcodecu

V ideálním případě byste asi chtěli jen říct enkodéru, aby se přepnul do režimu "vysoká kvalita" a šel na to. To by bylo jistě hezké, ale naneštěstí je to těžké zavést, jelikož různé volby enkódování vedou k různé kvalitě v závislosti na zdrojovém materiálu. To proto, že komprese závisí na vizuálních vlastnostech daného videa. Například anime a živá akce mají zcela rozdílné vlastnosti a tedy vyžadují odlišné volby pro dosažení optimálního enkódování. Dobrá zpráva je, že některé volby by nikdy neměly chybět, jako `mbd=2`, `trell` a `v4mv`. Podrobný popis obvyklých enkódovacích voleb naleznete níže.

Volby k nastavení:

- vmax_b_frames: 1 nebo 2 je v pořádku, v závislosti na filmu. Poznamenejme, že pokud chcete mít svá videa dekódovatelná kodekem DivX5, budete muset zapnout podporu uzavřeného GOP, pomocí volby `libavcodec`u `cgop`, ale budete také muset vypnout detekci scény, což není dobrý nápad, jelikož tak trochu zhoršíte efektivitu enkódování.

- vb_strategy=1: pomáhá ve scénách s rychlým pohybem. Vyžaduje vmax_b_frames >= 2. V některých videích může vmax_b_frames snížit kvalitu, ale vmax_b_frames=2 spolu s vb_strategy=1 pomůže.

- dia: okruh vyhledávání pohybu. Čím větší, tím lepší a pomalejší. Záporné hodnoty mají úplně jiný význam. Dobrými hodnotami jsou -1 pro rychlé enkódování, nebo 2-4 pro pomalejší.

- predia: předprůchod pro vyhledávání pohybu. Není tak důležitý jako dia. Dobré hodnoty jsou 1 (výchozí) až 4. Vyžaduje preme=2, aby byla opravdu k něčemu.

- cmp, subcmp, precmp: Porovnávací funkce pro odhad pohybu. Experimentujte s hodnotami 0 (výchozí), 2 (hadamard), 3 (dct) a 6 (omezení datového toku). 0 je nejrychlejší a dostatečná pro precmp. Pro cmp a subcmp je 2 dobrá pro anime a 3 zase pro živou akci. 6 může, ale nemusí být o něco lepší, ale je pomalá.

- last_pred: Počet prediktorů pohybu přebíraných z předchozího snímku. 1-3 nebo tak pomůžou za cenu menšího zdržení. Vyšší hodnoty jsou však pomalé a nepřináší žádný další užitek.

- cbp, mv0: Ovládá výběr makrobloků. Malá ztráta rychlosti za malý zisk kvality.

- qprd: adaptivní kvantizace založená na komplexnosti makrobloku. Může pomoci i uškodit v závislosti na videu a ostatních volbách. Toto může způsobovat artefakty, pokud nenastavíte vqmax na nějakou rozumně malou hodnotu (6 je dobrá, možná byste ale měli jít až na 4); vqmin=1 může také pomoci.

- qns: velmi pomalá, zvlášť v kombinaci s qprd. Tato volba nutí enkodér minimalizovat šum díky kompresi artefaktů, místo aby se snažil striktně zachovávat věrnost videa. Nepoužívejte ji, pokud jste již nezkusili všechno ostatní kam až to šlo a výsledek přesto není dost dobrý.

- vqcomp: Vylepšení ovládání datového toku. Dobré hodnoty se liší podle videa. Můžete to bezpečně ponechat jak to je, pokud chcete. Snížením vqcomp pustíte více bitů do scén s nízkou komplexností, zvýšením je pošlete do scén s vysokou komplexností (výchozí: 0.5, rozsah: 0-1. doporučený rozsah: 0.5-0.7).

- vlelim, vcelim: Nastaví jediný koeficient prahu eliminace pro jasové a barevné roviny. Ty jsou enkódovány odděleně ve všech MPEGu podobných algoritmech. Myšlenka stojící za těmito volbami je použití dobré heuristiky pro určení, zda je změna v bloku menší než vámi nastavený práh a v tom případě se blok enkóduje jako "nezměněný". To šetří bity a možná i zrychlí enkódování. vlelim=-4 a vcelim=9 se zdají být dobré pro hrané filmy, ale příliš nepomohou s anime; pokud enkódujete animované vido, měli byste je asi nechat beze změn.

- qpel: Odhad pohybu s přesností na čtvrt pixelu. MPEG-4 používá přesnost na půl pixelu jako výchozí při vyhledávání pohybu, proto je tato volba spojena s určitou režií, jelikož se do výstupního souboru ukládá více informací. Kompresní zisk/ztráta závisí na filmu, ale obvykle to není příliš efektivní na anime. qpel vždy způsobí zvýšení výpočetní náročnosti dekódování (v praxi +25% času CPU).

- psnr: neovlivní aktuální enkódování, ale zaznamená typ/velikost/kvalitu každého snímku do log souboru a na konci vypíše souhrnný PSNR (odstup signálu od šumu).

Volby se kterými nedoporučujeme si hrát:

- vme: Výchozí je nejlepší.

- lumi_mask, dark_mask: Psychovizuálně adaptivní kvantizace. Nehrajte si s těmito volbami, pokud vám jde o kvalitu. Rozumné hodnoty mohou být efektivní ve vašem případě, ale pozor, je to velmi subjektivní.

- scplx_mask: Snaží se předcházet blokovým artefaktům, ale postprocesing je lepší.

### 14.3.4. Příklady nastavení enkódování

Následující nastavení jsou příklady nastavení různých kombinací voleb enkodéru, které ovlivňují poměr rychlost versus kvalita při shodném cílovém datovém toku.

Veškerá nastavení byla testována na video vzorku 720x448 @30000/1001 snímků za sekundu, cílový datový tok byl 900kbps a prováděly se na AMD-64 3400+ při 2400 Mhz v režimu 64 bitů. Každá kombinace nastavení má uvedenu změřenou rychlost enkódování (ve snímcích za sekundu) a ztrátu PSNR (v dB) oproti nastavení "velmi vysoká kvalita". Rozumějte však že, v závislosti na vašem zdrojovém materiálu, typu počítače a pokrokům ve vývoji, můžete dospět k velmi odlišným výsledkům.

Popis | Volby | Rychlost [fps] | Relativní ztráta PSNR [dB]
--- | --- | --- | ---
Velmi vysoká kvalita | `vcodec=mpeg4:mbd=2:mv0:trell:v4mv:cbp:last_pred=3:predia=2:dia=2:vmax_b_frames=2:vb_strategy=1:precmp=2:cmp=2:subcmp=2:preme=2:qns=2` | 6 | 0
Vysoká kvalita | `vcodec=mpeg4:mbd=2:trell:v4mv:last_pred=2:dia=-1:vmax_b_frames=2:vb_strategy=1:cmp=3:subcmp=3:precmp=0:vqcomp=0.6:turbo` | 15 | -0.5
Rychlé enkódování | `vcodec=mpeg4:mbd=2:trell:v4mv:turbo` | 42 | -0.74
Enkódování v reálném čase | `vcodec=mpeg4:mbd=2:turbo` | 54 | -1.21

### 14.3.5. Uživatelské inter/intra matice

Díky této vlastnosti `libavcodec`u můžete nastavit uživatelskou inter (I-snímky/klíčové snímky) a intra (P-snímky/predikované (rozumějte vypočítané) snímky) matice. To je podporováno mnoha kodeky: `mpeg1video` a `mpeg2video` jsou hlášeny jako funkční.

Typické použití této vlastnosti je nastavení matic preferovaných KVCD specifikacemi.

Kvantizační Matice KVCD "Notch":

Intra:

     8  9 12 22 26 27 29 34
     9 10 14 26 27 29 34 37
    12 14 18 27 29 34 37 38
    22 26 27 31 36 37 38 40
    26 27 29 36 39 38 40 48
    27 29 34 37 38 40 48 58
    29 34 37 38 40 48 58 69
    34 37 38 40 48 58 69 79

Inter:

    16 18 20 22 24 26 28 30
    18 20 22 24 26 28 30 32
    20 22 24 26 28 30 32 34
    22 24 26 30 32 32 34 36
    24 26 28 32 34 34 36 38
    26 28 30 32 34 36 38 40
    28 30 32 34 36 38 42 42
    30 32 34 36 38 40 42 44

Použití:

    $ mencoder vstup.avi -o výstup.avi -oac copy -ovc lavc -lavcopts inter_matrix=...:intra_matrix=...

    $ mencoder input.avi -ovc lavc -lavcopts
    vcodec=mpeg2video:intra_matrix=8,9,12,22,26,27,29,34,9,10,14,26,27,29,34,37,
    12,14,18,27,29,34,37,38,22,26,27,31,36,37,38,40,26,27,29,36,39,38,40,48,27,
    29,34,37,38,40,48,58,29,34,37,38,40,48,58,69,34,37,38,40,48,58,69,79
    :inter_matrix=16,18,20,22,24,26,28,30,18,20,22,24,26,28,30,32,20,22,24,26,
    28,30,32,34,22,24,26,30,32,32,34,36,24,26,28,32,34,34,36,38,26,28,30,32,34,
    36,38,40,28,30,32,34,36,38,42,42,30,32,34,36,38,40,42,44 -oac copy -o svcd.mpg

### 14.3.6. Příklad

Takže jste si koupili zbrusu novou kopii filmu Harry Potter a Tajemná komnata (širokoúhlou verzi samozřejmě) a chcete si toto DVD ripnout, takže si jej můžete přidat do svého Domácího kino-počítače PC. Je to region 1 DVD, takže je v NTSC. Níže uvedený příklad je stále vhodný i pro PAL, jen musíte vynechat `-ofps 24000/1001` (protože výstupní snímková rychlost je shodná se vstupní) a přirozeně budou rozdílné souřadnice pro ořez.

Po spuštění `mplayer dvd://1`, postupujeme podle informací obsažených v sekci Jak naložit s telecine a prokladem v NTSC DVD a zjistíme že je to 24000/1001 neprokládané video, takže nepotřebujeme použít inverzní telecine filtr, jako je `pullup` nebo `filmdint`.

Dále musíme zjistit vhodný ořezový obdélník, takže použijeme filtr cropdetect:

    mplayer dvd://1 -vf cropdetect

Ujistěte se, že jste přešli přes zaplněný snímek (nějakou jasnou scénu) a v konzoli MPlayeru uvidíte:

    crop area: X: 0..719  Y: 57..419  (-vf crop=720:362:0:58)

Potom přehrajeme film s tímto filtrem, abychom otestovali jeho správnost:

    mplayer dvd://1 -vf crop=720:362:0:58

A zjistíme, že to vypadá zcela v pořádku. Dále se ujistíme, že šířka i výška jsou násobky 16. Šířka je v pořádku, výška ovšem ne. Protože jsme nepropadli v sedmé třídě z matematiky, víme, že nejbližším násobkem 16 nižším než 362 je 352.

Mohli bychom použít `crop=720:352:0:58`, ale bude lepší ustřihnout kousek nahoře i dole, takže zachováme střed. Zkrátili jsme výšku o 10 pixelů, ale nechceme zvýšit odsazení y o 5 pixelů, protože je to liché číslo, což by nepříznivě ovlivnilo kvalitu. Místo toho zvýšíme odsazení y o 4 pixely:

    mplayer dvd://1 -vf crop=720:352:0:62

Další důvod pro odstřižení pixelů shora i zdola je to, že si můžeme být jisti odstřižením napůl černých pixelů pokud existují. Pokud je však vaše video telecinováno, ujistěte se, že máte v řetězu filtrů `pullup` filtr (nebo jiný filtr pro inverzi telecine, který hodláte použít) ještě před odstraněním prokladu a ořezem. (Pokud se rozhodnete zachovat vaše video prokládané, pak se ujistěte, že vaše vertikální odsazení (offset) je násobkem 4.)

Pokud si děláte starosti se ztrátou těch 10 pixelů, možná raději snížíte rozměry na nejbližší násobek 16. Řetězec filtrů by pak vypadal asi takto:

    -vf crop=720:362:0:58,scale=720:352

Takovéto zmenšení videa bude znamenat ztrátu malého množství detailů, což bude pravděpodobně stěží postřehnutelné. Zvětšování by naopak vedlo ke snížení kvality (pokud byste nezvýšili datový tok). Ořez odstraní tyto pixely úplně. To je jedna z věcí, kterou byste si měli uvážit pro každý případ zvlášť. Například pokud bylo DVD video vyrobeno pro televizi, měli byste se vyvarovat vertikálnímu škálování, jelikož počet řádků odpovídá originální nahrávce.

Při prohlídce jsme zjistili, že video je poměrně akční, s vysokým počtem detailů, takže jsme zvolili datový tok 2400 Kbitů.

Nyní jsme připraveni provést dvouprůchodové enkódování. Průchod jedna:

    mencoder dvd://1 -ofps 24000/1001 -oac copy -vf pullup,softskip,crop=720:352:0:62,hqdn3d=2:1:2 -ovc lavc \
    -lavcopts vcodec=mpeg4:vbitrate=2400:v4mv:mbd=2:trell:cmp=3:subcmp=3:mbcmp=3:autoaspect:vpass=1 \
    -o Harry_Potter_2.avi

A průchod dva je stejný, jen nastavíme `vpass=2`:

    mencoder dvd://1 -ofps 24000/1001 -oac copy -vf pullup,softskip,crop=720:352:0:62,hqdn3d=2:1:2 -ovc lavc \
    -lavcopts vcodec=mpeg4:vbitrate=2400:v4mv:mbd=2:trell:cmp=3:subcmp=3:mbcmp=3:autoaspect:vpass=2 \
    -o Harry_Potter_2.avi

Volby `v4mv:mbd=2:trell` velmi zvýší kvalitu za cenu časové náročnosti enkódování. Vcelku není důvod tyto volby vypustit, pokud je primárním cílem kvalita. Volby `cmp=3:subcmp=3:mbcmp=3` vyberou porovnávací funkci, která poskytuje lepší kvalitu, než výchozí. S tímto parametrem můžete zkusit experimentovat (nahlédněte do man stránky pro seznam možných hodnot), jelikož různé funkce mohou mít velký vliv na kvalitu v závislosti na zdrojovém materiálu. Například pokud zjistíte, že `libavcodec` produkuje příliš mnoho čtverečkových artefaktů, můžete zkusit zvolit experimentální NSSE jako porovnávací funkci přes `*cmp=10`.

V případě tohoto filmu bude výsledné AVI dlouhé 138 minut a veliké kolem 3GB. A protože jste řekli, že na velikosti nezáleží, je to přijatelná velikost. Ale pokud byste jej chtěli menší, můžete zkusit nižší datový tok. Efekt zvyšování datového toku se totiž neustále snižuje, takže zatímco je zlepšení po zvýšení z 1800 Kbitů na 2000 Kbitů zjevné, nemusí být již tak velké nad 2000 Kbitů. Beze všeho s tím experimentujte, dokud nebudete spokojeni.

Jelikož jsme protáhli video odšumovacím filtrem, měli bychom jej trochu přidat během přehrávání. To, spolu s `spp` post-procesním filtrem, znatelně zvýší vnímanou kvalitu a pomůže odstranit čtverečkové artefakty ve videu. S MPlayerovou volbou `autoq` může být množství postprocesingu prováděného filtrem spp přizpůsobováno vytížení CPU. V tuto chvíli rovněž můžete provést korekci gama a/nebo barevnou korekci k dosažení nejlepších výsledků. Například:

    mplayer Harry_Potter_2.avi -vf spp,noise=9ah:5ah,eq2=1.2 -autoq 3

Předcházející | Nahoru | Další
14.2. Jak naložit s telecine a prokladem v NTSC DVD | Domů | 14.4. Enkódování pomocí kodeku `XviD`