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
jpegls | JPEG LS
targa | Targa kép
gif | GIF kép
bmp | BMP kép
png | PNG kép
h261 | H.261
h263 | H.263
h263p | H.263+
mpeg4 | ISO szabvány MPEG-4 (DivX, 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
ffvhuff | FFmpeg által módosított veszteségmentes huffyuv
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
flashsv | Flash Screen Video
dvvideo | Sony Digital Video
snow | az FFmpeg kísérleti wavelet-alapú codecja
zbmv | Zip Blocks Motion Video

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
--- | ---
ac3 | Dolby Digital (AC-3)
adpcm_* | Adaptív PCM formátumok - lásd a mellékelt táblázatot
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) - FAAC használatával
libgsm | ETSI GSM 06.10 full rate
libgsm_ms | Microsoft GSM
libmp3lame | MPEG-1 audio layer 3 (MP3) - LAME használatával
mp2 | MPEG-1 audio layer 2 (MP2)
pcm_* | PCM formats - lásd a mellékelt táblázatot
roq_dpcm | Id Software RoQ DPCM
sonic | kísérleti FFmpeg veszteséges codec
sonicls | kísérleti FFmpeg veszteségmentes codec
vorbis | Xiph Ogg Vorbis codec
wmav1 | Windows Media Audio v1
wmav2 | Windows Media Audio v2

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

Egy példa AC-3 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.2.1. PCM/ADPCM formátum kiegészítő táblázat

PCM/ADPCM codec neve | Leírás
--- | ---
pcm_s32le | előjeles 32-bit-es little-endian
pcm_s32be | előjeles 32-bit-es big-endian
pcm_u32le | előjel nélküli 32-bit-es little-endian
pcm_u32be | előjel nélküli 32-bit-es big-endian
pcm_s24le | előjeles 24-bit-es little-endian
pcm_s24be | előjeles 24-bit-es big-endian
pcm_u24le | előjel nélküli 24-bit-es little-endian
pcm_u24be | előjel nélküli 24-bit-es big-endian
pcm_s16le | előjeles 16-bit-es little-endian
pcm_s16be | előjeles 16-bit-es big-endian
pcm_u16le | előjel nélküli 16-bit-es little-endian
pcm_u16be | előjel nélküli 16-bit-es big-endian
pcm_s8 | előjeles 8-bit-es
pcm_u8 | előjel nélküli 8-bit-es
pcm_alaw | G.711 A-LAW
pcm_mulaw | G.711 μ-LAW
pcm_s24daud | előjeles 24-bit-es D-Cinema Audio formátum
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

### 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 a nyitó képek és logók után), 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 -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 második lépés ugyan ez, csak megadjuk a `vpass=2`-t:

    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

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` 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