14.3. Kódolás a `libavcodec` codec családdal
Előző | 14. fejezet - Kódolás a MEncoderrel | Következő

## 14.3. Kódolás a `libavcodec` codec családdal

A `libavcodec` számos érdekes videó és audió formátumba történő egyszerű kódolást biztosít. A következő codec-ekbe kódolhatsz (többé-kevésbé friss lista):

### 14.3.1. A `libavcodec` videó codec-jei

Videó codec neve | Leírás
--- | ---
mjpeg | Motion JPEG
ljpeg | veszteségmentes JPEG
h261 | H.261
h263 | H.263
h263p | H.263+
mpeg4 | ISO szabvány MPEG-4 (DivX6, XviD kompatibilis)
msmpeg4 | Szabvány előtti MPEG-4 variáns az MS-től, v3 (AKA DivX3)
msmpeg4v2 | Szabvány előtti MPEG-4 az MS-től, v2 (régi ASF fájlokban használják)
wmv1 | Windows Media Video, 1-es verzió (AKA WMV7)
wmv2 | Windows Media Video, 2-es verzió (AKA WMV8)
rv10 | RealVideo 1.0
rv20 | RealVideo 2.0
mpeg1video | MPEG-1 videó
mpeg2video | MPEG-2 videó
huffyuv | veszteségmentes tömörítés
asv1 | ASUS Video v1
asv2 | ASUS Video v2
ffv1 | az FFmpeg veszteségmentes videó codec-je
svq1 | Sorenson video 1
flv | Flash Videókban használt Sorenson H.263
dvvideo | Sony Digital Video
snow | az FFmpeg kísérleti wavelet-alapú codecja

Az első oszlop a codec neveket tartalmazza, amit a `vcodec` opció után kell megadni, például: `-lavcopts vcodec=msmpeg4`

Egy példa MJPEG tömörítéssel:

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

### 14.3.2. A `libavcodec` audió codec-jei

Audió codec neve | Leírás
--- | ---
mp2 | MPEG Layer 2
ac3 | AC3, AKA Dolby Digital
adpcm_ima_wav | IMA adaptív PCM (4 bit mintánként, 4:1-es tömörítés)
sonic | kísérleti veszteséges/veszteségmentes codec

Az első oszlop a codec neveket tartalmazza, amit az `acodec` opció után kell megadni, például: `-lavcopts acodec=ac3`

Egy példa AC3 tömörítéssel:

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

Ellentétben a `libavcodec` videó codec-jeivel, az audió codec-jei nem használnak el annyi bit-et, amennyit szánsz nekik, mivel hiányzik belőlük némi minimális pszichoakusztikus modell (ha van egyáltalán), ami a legtöbb egyéb codec implementációban benne van. Azonban vedd figyelembe, hogy ezek az audió codec-ek nagyon gyorsak és azonnal használhatóak bárhol, ahol a MEncodert a `libavcodec`-kel együtt fordították le (ami a legtöbb esetben így van), és nem függ külső függvénykönyvtáraktól.

### 14.3.3. A libavcodec kódolási opciói

Ideális esetben szeretnéd, ha csak azt kellene mondani a kódolónak, hogy váltson "jobb minőségre" és kész. Ez szép is lenne, de sajnos nehezen megvalósítható, mert a különböző kódolási opciók különböző minőséget eredményeznek, mely függ a forrás anyagtól is. Ez azért van, mert a tömörítés függ a szóbanforgó videó vizuális tulajdonságaitól. Például az anime és az élő felvétel két nagyon különböző anyag és így különböző opciókat követelnek meg az optimális kódoláshoz. A jó hír, hogy néhány opciót soha sem lehet elhagyni, mint például az `mbd=2`, `trell` és `v4mv`. Olvass tovább a gyakori kódolási opciók leírásához.

Állítható opciók:

- vmax_b_frames: 1 vagy 2 a jó, a filmtől függően. Figyelj rá, hogy úgy kell kódolnod, hogy DivX5-tel dekódolható legyen az eredmény, aktiválnod kell a zárt GOP támogatást a `libavcodec` `cgop` opciójával, de ki kell kapcsolnod a jelenet detektálást, ami nem túl jó ötlet, mivel rontja a kódolási hatékonyságot egy kicsit.

- vb_strategy=1: segít a gyors mozgású jeleneteknél. Néhány videónál a vmax_b_frames rontja a minőséget, de a vmax_b_frames=2 a vb_strategy=1-gyel együtt segít.

- dia: mozgás kereső tartomány. A nagyobb a jobb és a lassabb. Negatív értékek teljesen más skálát adnak. A jó értékek -1 a gyors kódoláshoz vagy 2-4 a lassabbhoz.

- predia: mozgás kereső előre-lépés. Nem olyan fontos, mint a dia. Jó értékek 1-től (alapértelmezett) 4-ig. preme=2 kell hozzá, hogy igazán hasznos legyen.

- cmp, subcmp, precmp: Összehasonlító funkciók a mozgás becsléshez. Kísérletezz a 0 (alapértelmezett), 2 (hadamard), 3 (dct) és 6 (ráta torzítás) értékekkel! 0 a leggyorsabb és és elegendő a precmp-hez. A cmp-hez és subcmp-hez 2 jó, ha anime és 3 ha élő akció. A 6 vagy jobb vagy nem, de mindenképpen lassabb.

- last_pred: Az előző képkockából megjósolandó mozgások száma. 1-3 vagy hasonló segít egy kis sebességcsökkenés árán. A magasabb értékek lassúak, de igazi hasznuk nincs.

- cbp, mv0: A makroblokkok kiválasztását irányítja. Egy kis sebességcsökkenés egy kis minőségjavulásért.

- qprd: adaptív kvantálás, mely a makroblokk komplexitásán alapul. Vagy segít vagy nem, a videó és egyéb opciók függvényében. Ennek lehetnek mellékhatásai, hacsak nem állítod be a vqmax-ot valami ésszerűen alacsony értékre (a 6 jó, talán minimum 4); a vqmin=1 is segíthet.

- qns: nagyon lassú, különösen ha a qprd-vel kombinálod. Ezen opció hatására a kódoló minimalizálja a zajt tömörítési mellékhatásokkal, ahelyett, hogy a szigorúan a forráshoz próbálna igazodni. Ne használd ezt, csak ha már minden mást kipróbáltál és az eredmény még mindig nem elég jó.

- vqcomp: Rátaírányítás beállítása. Hogy milyen értékek jók, az a filmtől függ. Nyugodtan elhagyhatod ezt, ha akarod. A vqcomp csökkentése több bitet engedélyez az alacsony komplexitású részeknél, a növelése a nagy komplexitású részekre teszi őket (alapértelmezés: 0.5, tartomány: 0-1, javasolt tartomány: 0.5-0.7).

- vlelim, vcelim: Beállítja a szimpla együttható eliminációs küszöböt a fényerősséghez és a chroma plane-khez. Ezt elkülönítve kódolja le minden MPEG-szerű algorítmus. Az ötlet emögött az opció mögött az, hogy egy jó heurisztikát használnak annak megállapítására, hogy a blokkban történt változás kisebb-e, mint az általad megadott küszöb és ebben az esetben egyszerűen "változtatás nélkül" kerül elkódolásra a blokk. Ez biteket ment meg és talán gyorsít is a kódoláson. A vlelim=-4 és vcelim=9 látszólag jók az élő filmekhez, de nem segítenek az anime-nál; ha animációt kódolsz, inkább hagyd őket változatlanul.

- qpel: Negyed pixel mozgás becslés. Az MPEG-4 fél pixeles precíziót használ a mozgáskereséshez alapértelmezésként, ezért ez az opció plusz terhelést hoz, mivel több információ tárolódik az elkódolt fájlban. A tömörítési nyereség/veszteség a filmtől függ, de általában nem hatékony anime-oknál. A qpel mindig jelentős dekódolási CPU idő igénnyel jár (+25% a gyakorlatban).

- psnr: nem érinti az aktuális kódolást, de készít egy log fájlt, mely megadja minden képkocka típusát/méretét/minőségét és a végére odaírja a PSNR-t (Peak Signal to Noise Ratio, Zajarány csúcspontja).

Opciók, melyekkel nem javasolt játszadozni:

- vme: Az alapértelmezett a legjobb.

- lumi_mask, dark_mask: Pszichovizuális adaptív kvantálás. Ne játszadozz ezekkel az opciókkal, ha számít a minőség. Az ésszerű értékek jók lehetnek a te esetedben, de vigyázz, ez nagyon szubjektív.

- scplx_mask: Megpróbálja megelőzni a blokkos mellékhatásokat, de az utófeldolgozás jobb.

### 14.3.4. Kódolás beállítási példák

A következő beállítások példák különböző kódolási opciók kombinációjára, amik a sebesség vs minőség kérdést döntően befolyásolják ugyanazon cél bitráta mellett.

Az összes kódolási beállítást egy 720x448 @30000/1001 fps-es példa videón teszteltük, a cél bitráta 900kbps volt, a gép pedig egy AMD-64 3400+ 2400 MHz-en 64 bites módban. Mindegyik kódolási beállítás tartalmazza a kódolási sebességet (képkocka per másodpercben) és a PSNR veszteséget (dB-ben) a "nagyon jó minőséghez" viszonyítva. Kérlek vedd figyelembe, hogy a forrásanyagodtól, a géped típusától és a fejlesztésektől függően különböző eredményeket kaphatsz.

Leírás | Kódolási opciók | sebesség (fps-ben) | Relatív PSNR veszteség (dB-ben)
--- | --- | --- | ---
Nagyon jó minőség | `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` | 6fps | 0dB
Jó minőség | `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` | 15fps | -0.5dB
Gyors | `vcodec=mpeg4:mbd=2:trell:v4mv:turbo` | 42fps | -0.74dB
Valós idejű | `vcodec=mpeg4:mbd=2:turbo` | 54fps | -1.21dB

### 14.3.5. Egyedi inter/intra matricák

A `libavcodec` ezen képességével egyedi inter (I-frame/kulcs frame) és intra (P-frame/jósolt frame) matricákat állíthatsz be. Több codec támogatja ezt: az `mpeg1video` és `mpeg2video` a jelentések szerint működik.

Ennek egy tipikus felhasználása a KVCD által javasolt matricák beállítása.

Egy KVCD "Notch" Kvantálási Mátrix:

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

Használat:

    $ mencoder input.avi -o output.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élda

Nos hát, éppen most vetted meg a Harry Potter és a titkok kamrája gyönyörű új példányát (widescreen edition természetesen) és le akarod rip-pelni ezt a DVD-t, hogy hozzáadhasd a PC-s házimozidhoz. Ez egy régió 1-es DVD, így NTSC-s. Az alábbi példa egyszerűen alkalmazható PAL-ra is, a `-ofps 24000/1001` kapcsoló elhagyásával (mert a kimeneti frameráta ugyan annyi, mint a bemeneti) és természetesen a vágás méretei is mások lesznek.

Miután lefuttattad az `mplayer dvd://1` parancsot, kövesd a mit kezdjünk a telecine-nel és az átlapolással NTSC DVD-ken részben leírt utasításokat és fedezd fel, hogy ez egy 24000/1001 fps-es progresszív videó, ami azt jelenti, hogy nem kell inverz telecine szűrőt használnod, mint pl. a `pullup` vagy a `filmdint`.

Következőnek megállapítjuk a megfelelő vágási téglalapot, így használjuk a cropdetect szűrőt:

    mplayer dvd://1 -vf cropdetect

Győződj meg róla, hogy egy teljesen kitöltött képkockán állsz (pl. egy világos jelenet), ezt fogod látni az MPlayer konzol kimenetén:

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

Ezután lejátszuk a filmet ezzel a szűrővel a számok ellenérzéséhez:

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

És azt látjuk, hogy tökéletesen megfelel. Majd meggyőződünk, hogy a szélesség és a magasság osztható 16-tal. A szélesség jó, de a magasság nem. Mivel nem buktunk hetedik osztályban matekból, tudjuk, hogy a 16 legközelebbi többszöröse, ami kisebb, mint 362, a 352.

Így egyszerűen használhatjuk a `crop=720:352:0:58` opciót, de jó lenne egy kicsit lecsípni a telejéből és az aljából, hogy középen maradjunk. Összehúzzuk a magasságot 10 pixellel, de nem akarjuk növelni az y-offszetet 5 pixellel, mert az páratlan szám és rontja a minőséget. Helyette inkább 4 pixellel növeljük az y-offszetet:

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

A másik ok, hogy lecsípjünk pixeleket mid fent, mint lent, hogy biztosak legyünk, hogy a fél-fekete pixeleket is levágtuk, amennyiben vannak. Figyelj rá, hogy ha a videó telecine-lt, a `pullup` szűrő (vagy bármelyik inverz telecine szűrő, amit használsz) a vágás előtt szerepeljen a szűrők láncában. Ha átlapolt, végezz deinterlace-t a vágás előtt. (Ha úgy döntesz, hogy megtartod az átlapolt videót, győződj meg róla, hogy a függőleges vágási offszet 4 többszöröse.)

Ha érdekel annak a 10 pixelnek az elvesztése, inkább a méretek 16 legközelebbi többszörösére való kicsinyítése érdekelhet. A szűrő lánc ez esetben:

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

A videó ilyen módon történő lekicsinyítése azt jelenti, hogy néhány apró részlet elveszik, de ez valószínűleg nem lesz észrevehető. A nagyítás rosszabb minőséget eredményez (hacsak nem növeled a bitrátát). A vágás az összes ilyen pixeltől megszabadít. Ez egy üzlet, amit minden esetben meg kell fontolnod. például ha a DVD videó televízióra készült, ajánlott elkerülni a függőleges méretezést, mert a sor mintázás az eredeti felvételhez igazodik.

Megtekintés után azt látjuk, hogy a filmünk eléggé eseménydús és nagyon részletes, így 2400Kbit-et választunk bitrátának.

Most már készen vagyunk a két lépéses kódoláshoz. Első lépés:

    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 második lépés ugyan ez, csak megadjuk a `vpass=2`-t:

    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

A `v4mv:mbd=2:trell` kapcsolók nagyban javítják a minőséget a kódolási idő rovására. Nem ajánlott ezen opciók elhagyása, ha a fő cél a jó minőség. A `cmp=3:subcmp=3:mbcmp=3` opciók egy összehasonlító függvényt választanak ki, ami jobb minőséget biztosít, mint az alapértelmezettek. Ezzel a paraméterrel is kísérletezhetsz (lásd a man oldalt a lehetséges értékekért), mivel a különböző függvények nagyban befolyásolják a minőséget a forrás anyagtól függően. Például ha úgy találod, hogy a `libavcodec` túl kockás eredményt ad, megpróbálhatod a kísérleti NSSE összehasonlító függvény használatát a `*cmp=10` opcióval.

Ennél a filmnél a keletkező AVI 138 perc hosszú lesz és közel 3 GB-os. És mivel azt mondtuk, hogy a fájl méret nem számít, ez egy tökéletesen megfelelő méret. De ha kisebbet szeretnél, próbálj ki egy alacsonyabb bitrátát. A bitráták növelése csökkenő mértékű javulást hoz, így pl. tisztán kivehető a különbség az 1800Kbit és a 2000Kbit között, szinte észrevehetetlen 2000Kbit felett. Nyugodtan kísérletezz, amíg csak kedved tartja.

Mivel a forrás videót áteresztettük a zajeltávolító szűrőn, talán egy picit vissza akarsz tenni a lejátszás közben. Ez, az `spp` utófeldolgozó szűrővel drasztikusan javítja a felfogható minőséget és segít a segít a videó kockásodásának megszüntetésében. Az MPlayer `autoq` opciójával szabályozhatod az spp szűrő utófeldolgozásának mértékét a CPU-tól függően. Emellett valószínűleg gamma és/vagy szín korrekciót is szeretnél csinálni, hogy jobban illeszkedjen a monitorodhoz. Például:

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

Előző | Fel | Következő
14.2. Mit kezdjünk a telecine-nel és az átlapolással NTSC DVD-ken | Tartalom | 14.4. Kódolás az `XviD` codec-kal