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

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

## 7.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í):

### 7.3.1. Video kodeky `libavcodec`

Jméno video kodeku | Popis
--- | ---
mjpeg | Motion JPEG
ljpeg | lossless (bezztrátový) JPEG
jpegls | JPEG LS
targa | Targa obrázek
gif | GIF obrázek
bmp | BMP obrázek
png | PNG obrázek
h261 | H.261
h263 | H.263
h263p | H.263+
mpeg4 | standardní ISO MPEG-4 (DivX, 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
ffvhuff | FFmpeg modifikovaná 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
flashsv | Flash Screen Video
dvvideo | Sony Digital Video
snow | Experimentální vlnkově orientovaný kodek z FFmpeg
zbmv | Zip Blocks Motion Video

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

### 7.3.2. Audio kodeky `libavcodec`

Jméno audio kodeku | Popis
--- | ---
ac3 | Dolby Digital (AC-3)
adpcm_* | Adaptivní PCM formáty – viz pomocnou tabulku
flac | Free Lossless Audio Codec (FLAC)
g726 | G.726 ADPCM
libamr_nb | 3GPP Adaptive Multi-Rate (AMR) narrow-band
libamr_wb | 3GPP Adaptive Multi-Rate (AMR) wide-band
libfaac | Advanced Audio Coding (AAC) – používá FAAC
libgsm | ETSI GSM 06.10 plný rozsah
libgsm_ms | Microsoft GSM
libmp3lame | MPEG-1 audio layer 3 (MP3) – používá LAME
mp2 | MPEG-1 audio layer 2 (MP2)
pcm_* | PCM formáty – viz pomocnou tabulku
adpcm_ima_wav | IMA adaptivní PCM (4 bity na vzorek, komprese 4:1)
sonic | experimentální FFmpeg ztrátový kodek
roq_dpcm | Id Software RoQ DPCM
sonicls | experimentální FFmpeg bezztrátový kodek
vorbis | Vorbis
wmav1 | Windows Media Audio v1
wmav2 | Windows Media Audio v2

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í AC–3:

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

Narozdíl od jejích videokodeků, audio kodeky z knihovny `libavcodec` neprovádějí inteligentní rozdělení přidělených bitů, jelikož jim chybí byť jen 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í bez potíží 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.

#### 7.3.2.1. Pomocná tabulka pro PCM/ADPCM formát

Název PCM/ADPCM kodeku | Popis
--- | ---
pcm_s32le | signed 32-bit little-endian
pcm_s32be | signed 32-bit big-endian
pcm_u32le | unsigned 32-bit little-endian
pcm_u32be | unsigned 32-bit big-endian
pcm_s24le | signed 24-bit little-endian
pcm_s24be | signed 24-bit big-endian
pcm_u24le | unsigned 24-bit little-endian
pcm_u24be | unsigned 24-bit big-endian
pcm_s16le | signed 16-bit little-endian
pcm_s16be | signed 16-bit big-endian
pcm_u16le | unsigned 16-bit little-endian
pcm_u16be | unsigned 16-bit big-endian
pcm_s8 | signed 8-bit
pcm_u8 | unsigned 8-bit
pcm_alaw | G.711 A-LAW
pcm_mulaw | G.711 μ-LAW
pcm_s24daud | signed 24-bit D-Cinema Audio format
pcm_zork | Activision Zork Nemesis
adpcm_ima_qt | Apple QuickTime
adpcm_ima_wav | Microsoft/IBM WAVE
adpcm_ima_dk3 | Duck DK3
adpcm_ima_dk4 | Duck DK4
adpcm_ima_ws | Westwood Studios
adpcm_ima_smjpeg | SDL Motion JPEG
adpcm_ms | Microsoft
adpcm_4xm | 4X Technologies
adpcm_xa | Phillips Yellow Book CD-ROM eXtended Architecture
adpcm_ea | Electronic Arts
adpcm_ct | Creative 16->4-bit
adpcm_swf | Adobe Shockwave Flash
adpcm_yamaha | Yamaha
adpcm_sbpro_4 | Creative VOC SoundBlaster Pro 8->4-bit
adpcm_sbpro_3 | Creative VOC SoundBlaster Pro 8->2.6-bit
adpcm_sbpro_2 | Creative VOC SoundBlaster Pro 8->2-bit
adpcm_thp | Nintendo GameCube FMV THP
adpcm_adx | Sega/CRI ADX

### 7.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ší.

### 7.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

### 7.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 vstup.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

### 7.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 PC kina. 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 mimo úvodní a koncové titulky) 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í v ose y o 5 pixelů, protože je to liché číslo, což by nepříznivě ovlivnilo kvalitu. Místo toho zvýšíme odsazení v ose 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

Takto malé 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 -o Harry_Potter_2.avi -ovc lavc \
        -lavcopts vcodec=mpeg4:vbitrate=2400:v4mv:mbd=2:trell:cmp=3:subcmp=3:autoaspect:vpass=1 \
        -vf pullup,softskip,crop=720:352:0:62,hqdn3d=2:1:2

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

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

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` 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ší
7.2. Jak naložit s telecine a prokladem v NTSC DVD | Domů | 7.4. Enkódování pomocí kodeku `Xvid`