Médialejátszó rendszerkövetelmények

Egy médialejátszó alkalmazás tervezése során elég sok szempontot figyelembe kell vennünk, különösen a különböző DirectX verziók miatt is. Alapjaiban véve a DirectShow elérhető Windows 9x, Windows 2000, Windows Me, Windows XP és Windows Vista-n is. Tehát a kliens oldali Windows operációs rendszerek minden generációján hozzáférhető. A használatához ismernünk kell a COM technológia alapjait és a .NET keretrendszer által képzett híd megvalósításával, az interop szolgáltatásokkal sem árt tisztában lenni. Alapból a Microsoft DirectX 9 által támogatott fájltípusok a következők:

Windows Media® Audio (WMA), Windows Media® Video (WMV), Advanced Systems Format (ASF), Motion Picture Experts Group (MPEG),
Audio-Video Interleaved (AVI), QuickTime (version 2 and lower), WAV, AIFF, AU, SND, MIDI

Továbbá tömörített formátumok közül:

Windows Media Video, ISO MPEG-4 video version 1.0 Microsoft MPEG-4 version 3, Sipro Labs ACELP, Windows Media Audio, MPEG Audio Layer-3 (MP3) (decompression only), Digital Video (DV), MPEG-1 (decompression only), MJPEG, Cinepak

A Microsoft MPEG 2-höz nem szolgáltat alapból dekódert, ahoz egy harmadik fél által kell hozzájutnunk. Ez a harmadik fél többnyire valamilyen kodekgyártó cég. Ezen a téren külön tudom ajánlani az FFDShow Codec Packot, amivel idáig még nekem nem gyűlt meg a bajom, legalábbis minden formátumot zökkenőmentesen le tudok játszani vele. Egy dologra figyeljünk oda, mégpedig hogy amikor telepítünk egy codec csomagot, s a telepítő felajánlja, hogy full telepítés, azt sose válasszuk, ha csak nem vagyunk tisztában azzal, hogy nem lesz belőle galiba, ugyanis vannak egymással inkompatibilis szűrők, s érhetnek minket meglepetések. Egy kodekcsomag több különböző cég szűrőit is tartalmazhatja az egyes formátumokhoz, pl. MPEG I, ilyenkor lehetőleg csak az egyik fajtát telepítsük, ezért is vannak többnyire a kodekcsomag telepítők úgy elkészítve, hogy egyéni telepítést is lehet választani és erősen ajánlott is. Az FFDShow esetében ilyen gondunk nincs, viszont van egy két olyan kodekcsomag, ami kb. 5 különböző cég szűrőit telepíti egyszerre egy médiaformátumhoz, s akkor képesek "összeakadni" a szűrők lejátszáskor.

A DirectShow egy hardverfüggetlen megoldást biztosít, alapértelmezésben a DirectDraw-t használja a megjelenítéshez és a DirectSound-t a hangkijátszáshoz, de ha ezek nem elérhetők, mondjuk a hardver adottságainál fogva, akkor a GDI-t használja a videó felrajzolásához és a waveOut multimédia API-t a hanglejátszáshoz. De van egy további újdonsága is, hogy a Video Mixing Renderer 9-nek köszönhetően a Direct3D-t is képes megjelenítőként használni.

DirectShow alkalmazásokat régebben általában C++ nyelven volt szokás írni, bár a C-t is lehetett használni hozzá. Én speciel használtam C++Builder és Delphi alól is tökéletesen, ugyan C++Builder alá míg beszereztem a szükséges libeket megőszültem. A Visual Basic-el régebben viszont nem volt elérhető minden funkció. Szerencsére a .NET-nek köszönhetően még a Win32 alapú megoldások használata is sokkal egyszerűbbé válhat. Ehhez találtam egy jó COM interop assemblyt, a DirectShowLib-et, ami összeszedi és rendszerezi a különböző COM könyvtárakban szereplő interfészeket, úgy mint Quartz.dll, MsVidCtl.dll, stb.

A Microsoft egyenlőre nem tervezi a DirectShow-t elérhetővé tenni tisztán managelt kódból, itt az idézet az SDK-ból:

Will DirectShow ever be accessible through managed code?

There are no current plans to implement a "Managed DirectShow" platform. You can use COM interop to create DirectShow client applications in managed code, but creating filters that depend on the Common Language Runtime (CLR) is not recommended for performance reasons.

A fejlesztéshez olyan fordítót kell használnunk, ami támogatja a COM-ot, azaz képes COM objektumokat előállítani, ez bármelyik .NET nyelvre igaz kellene legyen.

S most jön, hogy jól át kell gondolnunk, amikor a DirectShow-t használjuk, hogy milyen szoftverkövetelményekkel támasztjuk azt elő. Ezt a különböző komponens-összetevők határozzák meg. Először is mint mondottam a DirectShow alapértelmezésben a DirectDraw-t és DirectSound-t használja, feltéve hogy a szükséges hardverfeltételeknek eleget lehet e tenni. A Video Mixing Renderer és az Overlay Mixer szűrők a DirectDraw 3 és DirectDraw 5-öt használják megjelenítőként. A Video Mixing Renderer 7 csak Windows XP-n érhető el és a DirectDraw 7-t használja. A Video Mixing Renderer 9 (VMR 9) pedig az utolsó Direct3D API-t használja. Egyéb DirectX API-k használatára nincs szükség DirectShow alkalmazások írásához, mivel a DirectSound is, mint szűrő a DirectShow által hozzáférhető. Egyébként ha valaki azzal a kifejezéssel találkozik, hogy ActiveMovie, az a DirectShow eredeti neve volt még a kezdetekor, bár nem volt túl hosszú pályafutása így a köztudatban.

A legjobb eszköz annak vizsgálatára, hogy éppen milyen szűrők vannak telepítve a rendszerünkbe a Graphedt.exe. Ez felsorolja az összes szűrőt ami regisztrálva van a rendszerünkbe, többek között a harmadik fél által telepítetteket, az egyéb Microsoft technológiák által telepítetteket, és olyanokat is, mint Windows Media és NetMeeting. Ezt már illusztráltam is egy képen az előző bejegyzésemben. Pl. egy MPEG fájl renderelésekor már láthatjuk is, hogy az intelligens kapcsolatépítési mechanizmusnak köszönhetően mi is fog nekünk felépülni. Ez az alkalmazás a DirectX SDK részeként férhető hozzá, a forráskódja nem nyilvános, tehát nem lehet hozzáférni és nem is újraterjeszthető.

A DirectShow támogatja az ún. DirectX média objektumokat (Microsoft DirectX Media Objects – DMOs) is. Ezek hasonlóak a DirectShow szűrökhöz, de ebbe még most ne menjünk bele, mert erről megint oldalakat lehetne regélni, egyenlőre itt lehet olvasni erről, hogy mi is ez: DirectX Media Objects. Azért egy példát, hogy említsek, például a DMOs objektumok segítségével tehetünk különböző hangeffekteket is egy audió stream alá, mint pl. visszhangzás, stb. Ezen a szinten jön szóba a digitális videó és televíziózás élménye is. Ezzel kapcsolatban találtam is egy nagyon ígéretesnek kinéző könyvet a neten:
Programming Microsoft® DirectShow® for Digital Video and Television

Előfordulhatnak egy fájl lejátszása közben további problémák is, mint pl. ha csak egy fekete képernyő jelenik meg a lejátszáskor, de a hangot halljuk közben. Ennek az oka, hogy a médiafájl kódolva van valamilyen kodekkel és az nem taláható meg a rendszerben. Ilyenkor szokott pl. a mediaplayer is kísérletet tenni egy codec letöltésére.

Újabb kérdés, ami megfogalmazódhat bennünk: Azt hogyan detektáljuk, hogy a DirectShow installálva van e a gépünkre? Külön erre kitérő meg szemgúvasztó kódokat nem kell írnunk, elég azt vizsgálnunk, hogy sikerült e a Filter Graph Managert (FGM) létrehozni, avagy sem.

De még hogy ne legyen ennyire egyszerű az élet itt se, a Microsoft saját fájlformátumának dolgai külön említést érdemelnek. Mégpedig az ASF Writer és ASF Reader szűrőkhöz egyedi tanusítványra volt szükség, hogy használni lehessen őket még a Windows Media Format SDK 7.0 idejében. DirectX 9-ben hála Istennek ez megszűnt (Windows Media Format SDK 7.1), persze ott is csak a nemvédett tartalmakra igaz ez, amin mondjuk csodálkozni nem kell, de azóta ezen a téren a 9-es szériába sem történt érdemi változás szerencsére.

A DirectShow-hoz ha installálja valaki a DirectX Debug runtime könyvtárakat, akkor akár lehetőség van debug driverek, vagy egyéb kernel módú komponensek írására és telepítésére is…

Most körülbelül láthatjuk, mennyi mindent kell mérlegelnünk egy szimpla lejátszó alkalmazás, vagy akár komponens írásakor. Mégis akkor miért használjuk a DirectShow-t, miért nem használjuk akkor inkább simán a Media Playert?

Egyrészt azért mert a MediaPlayer is változatonként más és más, míg egy DirectShow lejátszót meglehet írni úgy, hogy az az összes eddig létező op. rendszeren fusson hardvertől függetlenül. Annak egyik oka például, hogy a Windows Media Player 9, 10, 11 már nem érhető el az előző op. rendszereken többek között a Video Mixing Renderer 7 használatának is köszönhető. Persze nem mintha bármit számítana, mert XP alá most már én sem tervezek, szóval amit eddig írtam médialejátszót, azt is egy kicsit átalakítom az XP minimális követelményeinek megfelelőre cserébe egy rakás új funkcióért, például orverlay technológia. De ettől függetlenül simán meglehet csinálni egy alap videólejátszót, ami fut Win95-n is akár. Másrészt pedig én irányíthatom a teljes folyamatot, olyan külsőt tervezek neki amilyet csak akarok, olyan szűrőket, transzformációkat, effekteket használok amilyeneket csak akarok és olyan médiainformációkat nyerek ki, amiket csak akarok. Nincs is jobb a teljes folyamat kézbentartásánál! Ez erre lett kitalálva, itt van mindenki orra előtt, igen is, tessék használni! S ekkor még a Direct3D-vel való összekapcsolásról és ezáltal a user experience fokozásáról még nem is beszéltem.

Íme a tökéletes hardverfüggetlen multimédia API, egy szóban DirectShow.

Hozzászólás