A DVD-szűrődiagram létrehozása
[A laphoz társított funkció, DirectShowegy régi funkció. Ezt felváltotta a MediaPlayer, a IMFMediaEngineés a Media Foundation részét képező Audió/Videó rögzítés. Ezek a funkciók Windows 10-hez és Windows 11-hez lettek optimalizálva. A Microsoft határozottan javasolja, hogy az új kód MediaPlayer, IMFMediaEngine és Audio/Video Capture eszközt használja a Media FoundationDirectShowhelyett, ha lehetséges. A Microsoft javasolja, hogy az örökölt API-kat használó meglévő kódot át kell írni az új API-k használatára, ha lehetséges.]
A DirectShow-alkalmazásokhoz hasonlóan a DVD-lejátszóalkalmazások is egy szűrőgráf létrehozásával kezdődnek. A DirectShow a következő összetevőket biztosítja a DVD-lejátszáshoz:
- DVD Graph Builder. Egy segédobjektum, amely a szűrőgráfot hozza létre. Elérhetővé teszi az IDvdGraphBuilder felületet.
- DVD-navigátor szűrő. DirectShow-szűrő, amely kezeli a DVD-lejátszást, a navigációt és más parancsokat.
A DVD-lejátszáshoz MPEG-2 dekóder is szükséges. A hardveres és szoftveres MPEG-2 dekóderek harmadik felektől érhetők el. Először hozza létre a DVD Graph Builder objektum egy példányát.
IDvdGraphBuilder *pBuild = NULL;
hr = CoCreateInstance(CLSID_DvdGraphBuilder, NULL,
CLSCTX_INPROC_SERVER, IID_IDvdGraphBuilder, (void **)&pBuild);
Ezen a ponton kiválaszthatja és konfigurálhatja a videó renderelőt a gráf többi részének létrehozása előtt. Ezt a nem kötelező lépést a következő szakaszban részletesebben ismertetjük. Ha kihagyja ezt a lépést, a DVD Graph Builder kiválaszt egy alapértelmezett renderelőt. Ezután hozza létre a gráfot a IDvdGraphBuilder::RenderDvdVideoVolume metódus meghívásával.
AM_DVD_RENDERSTATUS buildStatus;
hr = pBuild->RenderDvdVideoVolume(L"Z:\\video_ts", 0, &buildStatus);
Az első paraméter a DVD-fájlokat tartalmazó könyvtár neve. A DVD-lemezeken ezek a fájlok egy VIDEO_TS nevű könyvtárban találhatók. Ha az első paraméter NULL, a DVD Graph Builder az első DVD-kötetet tartalmazó meghajtót használja.
A második paraméter különböző választható jelzőket tartalmaz a dekóder típusának (hardver vagy szoftver) és egyéb lehetőségek kiválasztásához.
A harmadik paraméter egy AM_DVD_RENDERSTATUS struktúra, amely állapotinformációkat kap. Ha a RenderDvdVideoVolume metódus S_FALSE ad vissza, az azt jelenti, hogy a hívás részben sikeres volt (vagy részben sikertelen volt, ha pesszimista). Előfordulhat például, hogy a metódus nem tudja renderelni a szubpicture streamet, annak ellenére, hogy a többi stream sikeresen renderelt. Ha a RenderDvdVideoVolume metódus hibakódot vagy S_FALSE értéket ad vissza, a hiba részleteiért megvizsgálhatja a AM_DVD_RENDERSTATUS struktúrát.
Ezután szerezzen egy mutatót a Filter Graph Managerre azáltal, hogy meghívja az IDvdGraphBuilder::GetFiltergraphfüggvényt. Ez a metódus a Filter Graph Manager IGraphBuilder felületére mutató mutatót ad vissza.
IGraphBuilder *pGraph = NULL;
hr = pBuild->GetFiltergraph(&m_pGraph);
A IDvdGraphBuilder::GetDvdInterface metódussal kérje le a DVD-hez kapcsolódó interfészeket, beleértve a következőket:
- IDvdControl2. Szabályozza a lejátszást és a DVD-parancsokat
- IDvdInfo2. Információt ad vissza a DVD-kezelő aktuális állapotáról.
- IAMLine21Decoder. A feliratok megjelenítését vezérli. Alapértelmezés szerint a feliratok megjelenítése be van kapcsolva. A letiltásához hívja meg IAMLine21Decoder::SetServiceState a AM_L21_CCSTATE_Off jelzővel.
- IBasicAudio. Szabályozza a hangkötetet és az egyensúlyt.
Az alábbi kód például az IDvdControl2 felületet adja vissza.
IDvdControl2 *pDvdControl = NULL;
hr = pBuild->GetDvdInterface(IID_IDvdControl2, (void**)&pDvdControl);
A DVD-lejátszási szűrődiagram összeállításának ajánlott módja, hogy egy DVD Graph Builder objektum automatikusan elvégezze ezt Ön helyett. Ezt a megközelítést az alábbiakban és a DVD-mintaalkalmazásban mutatjuk be. Ha manuálisan kell létrehoznia a DVD-szűrőgráfot, ezt a DirectShow dokumentációjában máshol tárgyalt gráfépítési alapvető szabályok követésével teheti meg. Általában nem szabad manuálisan hozzáadni, eltávolítani, csatlakoztatni vagy leválasztani az egyes szűrőket a DVD Graph Builder által létrehozott gráfban, mert ez összezavarhatja a törlési kódot.
A Video Renderer konfigurálása
A DirectShow számos videómegjelenítő szűrőt biztosít. A gráf létrehozása előtt kiválaszthatja, hogy melyik videoképkészítőt szeretné használni. Válassza ki a renderelőt IDvdGraphBuilder::GetDvdInterface meghívásával, és kérjen egy, a rendererre jellemző felületet:
- Átfedéses keverőszűrő: IDDrawExclModeVideo.
- Video Mixing Renderer 7 (VMR-7): IVMRFilterConfig.
- Video Mixing Renderer 9 (VMR-9): IVMRFilterConfig9.
- Enhanced Video Renderer (EVR): IEVRFilterConfig.
Ha a szűrőgráf létrehozása előtt ezen felületek bármelyikét kéri, a DVD Graph Builder létrehozza a megfelelő videó renderelőt. Később, a gráf létrehozásakor a DVD Graph Builder megpróbálja használni ezt a renderelőt. Ha azonban nem tudja létrehozni a gráfot a kiválasztott renderelővel, átválthat egy másik renderelőre. Előfordulhat például, hogy az MPEG-2 dekóder nem kompatibilis a VMR-szűrővel, ebben az esetben a DVD Graph Builder alapértelmezés szerint az Overlay Mixer-re áll.
Ezek az interfészek lehetővé teszik a renderelő konfigurálását, mielőtt csatlakozna a dekóderhez. Beállíthatja például, hogy a virtuális gép ablak nélküli módot használjon az alapértelmezett ablakos mód helyett. A videómegjelenítőkről további információt a A DirectShow videómegjelenítésicímű témakörben talál.
Windows XP és újabb rendszereken a DVD Graph Builder mindig a Video Mixing Renderer 7 (VMR-7) rendszert használja, kivéve, ha:
- A hívó lekérdezi azokat a felületeket, amelyek csak az Overlay Mixer-ben találhatók, például az IMixerPinConfig2. Ez egy tippet küld a DVD Graph Buildernek, hogy az alkalmazás nem a VMR-t, hanem az átfedéses keverőt szeretné használni. A Windows Media Player rendelkezik egy olyan párbeszédpanel opcióval, amely lehetővé teszi az Overlay Mixer használatának kényszerítését.
- A telepített dekóder nem VMR-kompatibilis. A gráfkészítés során az új IAMDecoderCaps felület a dekóder VMR-támogatásának ellenőrzésére szolgál. Ha az nincs jelen, a DVD Graph Builder az Átfedés-keverőt fogja használni.
- Hardveres dekóder használata esetén a dekóder nem tud csatlakozni a Video Port Manager (VPM) szolgáltatáshoz. Ha egy hardverdekóder nem tudja használni a VPM-et, akkor nem használhatja a VMR-t sem, ezért a DVD Graph Builder ezután megpróbál létrehozni egy gráfot az Overlay Mixerrel.
- Ismeretes, hogy a kijelzőkártyának nincs elegendő erőforrása és/vagy képessége a VMR támogatására, de ezt nem jelenti megfelelően az illesztőprogramban. (Egyes ismert eseteket a DVD Graph Builder kifejezetten kizár.)
- A dekóder és a VMR közötti kapcsolat bármilyen okból meghiúsulhat, ami általában a szükséges felületek létrehozásához szükséges VRAM hiányára vezethető vissza. Ezekben az esetekben a DVD Graph Builder kikapcsolja a VMR használatát, és megpróbálja az Overlay Mixer-t használni egy gráf létrehozásához.
Ablak módban
Ablakos módban (Overlay Mixer vagy VMR) a renderelő saját videoablakot hoz létre. Ha ezt az ablakot az alkalmazásablak gyermekévé szeretné tenni, hívja meg a IVideoWindow::put_Owner függvényt az alkalmazás leírójával. A IVideoWindow::put_WindowStyle hívásával beállíthatja a "WS_CHILD" és "WS_CLIPSIBLINGS" stílusokat a renderelő videóablakhoz. Ha egérüzeneteket szeretne lekérni a renderelő videoablakából, hívja meg az IVideoWindow::put_MessageDrain metódust egy fogóponttal az alkalmazásablakhoz. Ez a módszer beállít egy "üzenetlefolyót" – a videóablak továbbítja a kapott egérüzeneteket az üzenetlefolyó ablakba.
pVideoWindow->put_Owner((OAHWND)hwnd);
pVideoWindow->put_WindowStyle(WS_CHILD | WS_CLIPSIBLINGS);
pVideoWindow->put_MessageDrain((OAHWND)hwnd) ;
Az üzenetlefolyó kissé bonyolulttá teszi a DVD menügombok kiválasztását. Feltéve, hogy a videóablak nem tölti ki az alkalmazás teljes ügyfélterületét, egyes egéresemények a videóablakon kívül esnek. Amikor egy egéreseményt kap a videóablak belsejéből-tól, feldolgoznia kell a DVD menü navigációhoz. A videóablakon kívüli egéreseményeket nem szabad feldolgozni. Az üzenetlefolyóval nem lehet különbséget tenni a kettő között. Ezenkívül a videóablak egéreseményeinek koordinátái a videoablak ügyfélterületéhez viszonyítva vannak; de a videóablakon kívüli egéresemények az alkalmazás ügyfélterületéhez viszonyítva vannak.
Ablak nélküli mód
Az ablak nélküli mód teljesen elkerüli az egérüzenetekkel kapcsolatos problémákat. Nincs szüksége üzenetátirányítóra, mert a VMR (vagy EVR) nem hoz létre saját ablakot ablak nélküli módban. Ehelyett közvetlenül az alkalmazás ablakára rajzol. Ha a cél téglalap kisebb, mint az alkalmazás ügyfélterülete, a DVD-kezelő ezt figyelembe veszi a DVD gombpozícióinak kiszámításakor. Ezért ha egy egérüzenetet kap, a koordinátákat közvetlenül a DVD-kezelőnek továbbíthatja, a navigációs menüben leírtak szerint.
Kapcsolódó témakörök