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 kodekuPopis
mjpegMotion JPEG
ljpeglossless (bezztrátový) JPEG
jpeglsJPEG LS
targaTarga obrázek
gifGIF obrázek
bmpBMP obrázek
pngPNG obrázek
h261H.261
h263H.263
h263pH.263+
mpeg4standardní ISO MPEG-4 (DivX, Xvid kompatibilní)
msmpeg4prvotní MPEG-4 varianta od MS, v3 (DivX3)
msmpeg4v2prvotní MPEG-4 od MS, v2 (použitý ve starých ASF souborech)
wmv1Windows Media Video, verze 1 (WMV7)
wmv2Windows Media Video, verze 2 (WMV8)
rv10RealVideo 1.0
rv20RealVideo 2.0
mpeg1videoMPEG-1 video
mpeg2videoMPEG-2 video
huffyuvbezztrátová komprese
ffvhuffFFmpeg modifikovaná huffyuv bezztrátová komprese
asv1ASUS Video v1
asv2ASUS Video v2
ffv1bezztrátový video kodek z FFmpeg
svq1Sorenson video 1
flvSorenson H.263 používaný ve Flash Video
flashsvFlash Screen Video
dvvideoSony Digital Video
snowExperimentální vlnkově orientovaný kodek z FFmpeg
zbmvZip 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 kodekuPopis
ac3Dolby Digital (AC-3)
adpcm_*Adaptivní PCM formáty – viz pomocnou tabulku
flacFree Lossless Audio Codec (FLAC)
g726G.726 ADPCM
libamr_nb3GPP Adaptive Multi-Rate (AMR) narrow-band
libamr_wb3GPP Adaptive Multi-Rate (AMR) wide-band
libfaacAdvanced Audio Coding (AAC) – používá FAAC
libgsmETSI GSM 06.10 plný rozsah
libgsm_msMicrosoft GSM
libmp3lameMPEG-1 audio layer 3 (MP3) – používá LAME
mp2MPEG-1 audio layer 2 (MP2)
pcm_*PCM formáty – viz pomocnou tabulku
adpcm_ima_wavIMA adaptivní PCM (4 bity na vzorek, komprese 4:1)
sonicexperimentální FFmpeg ztrátový kodek
roq_dpcmId Software RoQ DPCM
soniclsexperimentální FFmpeg bezztrátový kodek
vorbisVorbis
wmav1Windows Media Audio v1
wmav2Windows 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 kodekuPopis
pcm_s32lesigned 32-bit little-endian
pcm_s32besigned 32-bit big-endian
pcm_u32leunsigned 32-bit little-endian
pcm_u32beunsigned 32-bit big-endian
pcm_s24lesigned 24-bit little-endian
pcm_s24besigned 24-bit big-endian
pcm_u24leunsigned 24-bit little-endian
pcm_u24beunsigned 24-bit big-endian
pcm_s16lesigned 16-bit little-endian
pcm_s16besigned 16-bit big-endian
pcm_u16leunsigned 16-bit little-endian
pcm_u16beunsigned 16-bit big-endian
pcm_s8signed 8-bit
pcm_u8unsigned 8-bit
pcm_alawG.711 A-LAW
pcm_mulawG.711 μ-LAW
pcm_s24daudsigned 24-bit D-Cinema Audio format
pcm_zorkActivision Zork Nemesis
adpcm_ima_qtApple QuickTime
adpcm_ima_wavMicrosoft/IBM WAVE
adpcm_ima_dk3Duck DK3
adpcm_ima_dk4Duck DK4
adpcm_ima_wsWestwood Studios
adpcm_ima_smjpegSDL Motion JPEG
adpcm_msMicrosoft
adpcm_4xm4X Technologies
adpcm_xaPhillips Yellow Book CD-ROM eXtended Architecture
adpcm_eaElectronic Arts
adpcm_ctCreative 16->4-bit
adpcm_swfAdobe Shockwave Flash
adpcm_yamahaYamaha
adpcm_sbpro_4Creative VOC SoundBlaster Pro 8->4-bit
adpcm_sbpro_3Creative VOC SoundBlaster Pro 8->2.6-bit
adpcm_sbpro_2Creative VOC SoundBlaster Pro 8->2-bit
adpcm_thpNintendo GameCube FMV THP
adpcm_adxSega/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 libavcodecu 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.

PopisVolbyRychlost [fps]Relativní ztráta PSNR [dB]
Velmi vysoká kvalitavcodec=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=260
Vysoká kvalitavcodec=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:turbo15-0.5
Rychlé enkódovánívcodec=mpeg4:mbd=2:trell:v4mv:turbo42-0.74
Enkódování v reálném časevcodec=mpeg4:mbd=2:turbo54-1.21

7.3.5. Uživatelské inter/intra matice

Díky této vlastnosti libavcodecu 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