9.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):

9.3.1. A libavcodec videó codec-jei

Videó codec neveLeírás
mjpegMotion JPEG
ljpegveszteségmentes JPEG
jpeglsJPEG LS
targaTarga kép
gifGIF kép
bmpBMP kép
pngPNG kép
h261H.261
h263H.263
h263pH.263+
mpeg4ISO szabvány MPEG-4 (DivX, Xvid kompatibilis)
msmpeg4szabvány előtti MPEG-4 variáns az MS-től, v3 (AKA DivX3)
msmpeg4v2szabvány előtti MPEG-4 az MS-től, v2 (régi ASF fájlokban használják)
wmv1Windows Media Video, 1-es verzió (AKA WMV7)
wmv2Windows Media Video, 2-es verzió (AKA WMV8)
rv10RealVideo 1.0
rv20RealVideo 2.0
mpeg1videoMPEG-1 videó
mpeg2videoMPEG-2 videó
huffyuvveszteségmentes tömörítés
ffvhuffFFmpeg által módosított veszteségmentes huffyuv
asv1ASUS Video v1
asv2ASUS Video v2
ffv1az FFmpeg veszteségmentes videó codec-je
svq1Sorenson video 1
flvFlash Videókban használt Sorenson H.263
flashsvFlash Screen Video
dvvideoSony Digital Video
snowaz FFmpeg kísérleti wavelet-alapú codecja
zmbvZip Motion Blocks Video
dnxhdAVID DNxHD

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

9.3.2. A libavcodec audió codec-jei

Audió codec neveLeírás
ac3Dolby Digital (AC-3)
adpcm_*Adaptív PCM formátumok - lásd a mellékelt táblázatot
flacFree Lossless Audio Codec (FLAC)
g726G.726 ADPCM
libfaacAdvanced Audio Coding (AAC) - FAAC használatával
libgsmETSI GSM 06.10 full rate
libgsm_msMicrosoft GSM
libmp3lameMPEG-1 audio layer 3 (MP3) - LAME használatával
mp2MPEG-1 audio layer 2 (MP2)
pcm_*PCM formats - lásd a mellékelt táblázatot
roq_dpcmId Software RoQ DPCM
sonickísérleti FFmpeg veszteséges codec
soniclskísérleti FFmpeg veszteségmentes codec
vorbisXiph Ogg Vorbis codec
wmav1Windows Media Audio v1
wmav2Windows 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.

9.3.2.1. PCM/ADPCM formátum kiegészítő táblázat

PCM/ADPCM codec neveLeírás
pcm_s32leelőjeles 32-bit-es little-endian
pcm_s32beelőjeles 32-bit-es big-endian
pcm_u32leelőjel nélküli 32-bit-es little-endian
pcm_u32beelőjel nélküli 32-bit-es big-endian
pcm_s24leelőjeles 24-bit-es little-endian
pcm_s24beelőjeles 24-bit-es big-endian
pcm_u24leelőjel nélküli 24-bit-es little-endian
pcm_u24beelőjel nélküli 24-bit-es big-endian
pcm_s16leelőjeles 16-bit-es little-endian
pcm_s16beelőjeles 16-bit-es big-endian
pcm_u16leelőjel nélküli 16-bit-es little-endian
pcm_u16beelőjel nélküli 16-bit-es big-endian
pcm_s8előjeles 8-bit-es
pcm_u8előjel nélküli 8-bit-es
pcm_alawG.711 A-LAW
pcm_mulawG.711 μ-LAW
pcm_s24daudelőjeles 24-bit-es D-Cinema Audio formátum
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

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

9.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ásKódolási opcióksebesség (fps-ben)Relatív PSNR veszteség (dB-ben)
Nagyon jó minőségvcodec=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=26fps0dB
Jó minőségvcodec=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:turbo15fps-0.5dB
Gyorsvcodec=mpeg4:mbd=2:trell:v4mv:turbo42fps-0.74dB
Valós idejűvcodec=mpeg4:mbd=2:turbo54fps-1.21dB

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

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