Erstellen des DVD-Filterdiagramms
[Das dieser Seite zugeordnete Feature DirectShow ist ein Legacyfeature. Es wurde durch MediaPlayer, IMFMediaEngine und Audio/Video Capture in Media Foundation ersetzt. Diese Features wurden für Windows 10 und Windows 11 optimiert. Microsoft empfiehlt dringend, dass neuer Code nach Möglichkeit MediaPlayer, IMFMediaEngine und Audio/Video Capture in Media Foundation anstelle von DirectShow verwendet. Microsoft schlägt vor, vorhandenen Code, der die Legacy-APIs verwendet, um nach Möglichkeit die neuen APIs zu verwenden.]
Wie bei jeder DirectShow-Anwendung beginnt eine DVD-Wiedergabeanwendung mit dem Erstellen eines Filterdiagramms. DirectShow stellt die folgenden Komponenten für die DVD-Wiedergabe bereit:
- DVD Graph Builder. Ein Hilfsobjekt, das das Filterdiagramm erstellt. Es macht die IDvdGraphBuilder-Schnittstelle verfügbar.
- DVD Navigator-Filter . Ein DirectShow-Filter, der die DVD-Wiedergabe, Navigation und andere Befehle verarbeitet.
Für die DVD-Wiedergabe ist auch ein MPEG-2-Decoder erforderlich. MPEG-2-Decoder für Hardware und Software sind von Drittanbietern erhältlich. Erstellen Sie zunächst eine instance des DVD Graph Builder-Objekts.
IDvdGraphBuilder *pBuild = NULL;
hr = CoCreateInstance(CLSID_DvdGraphBuilder, NULL,
CLSCTX_INPROC_SERVER, IID_IDvdGraphBuilder, (void **)&pBuild);
An diesem Punkt können Sie den Videorenderer auswählen und konfigurieren, bevor Sie den Rest des Diagramms erstellen. Dieser optionale Schritt wird im nächsten Abschnitt ausführlicher beschrieben. Wenn Sie diesen Schritt weglassen, wählt der DVD Graph Builder einen Standardrenderer aus. Erstellen Sie als Nächstes das Diagramm, indem Sie die IDvdGraphBuilder::RenderDvdVideoVolume-Methode aufrufen.
AM_DVD_RENDERSTATUS buildStatus;
hr = pBuild->RenderDvdVideoVolume(L"Z:\\video_ts", 0, &buildStatus);
Der erste Parameter ist der Name eines Verzeichnisses, das die DVD-Dateien enthält. Auf einem DVD-Datenträger befinden sich diese Dateien in einem Verzeichnis mit dem Namen VIDEO_TS. Wenn der erste Parameter NULL ist, verwendet der DVD Graph Builder das erste Laufwerk, das ein DVD-Volume enthält.
Der zweite Parameter enthält verschiedene optionale Flags für die Auswahl des Decodertyps (Hardware oder Software) und andere Optionen.
Der dritte Parameter ist eine AM_DVD_RENDERSTATUS-Struktur, die status Informationen empfängt. Wenn die RenderDvdVideoVolume-Methode S_FALSE zurückgibt, bedeutet dies, dass der Aufruf teilweise erfolgreich war (oder teilweise fehlgeschlagen ist, wenn Sie ein Pessimist sind). Beispielsweise kann die Methode den Teildatenstrom nicht rendern, obwohl die anderen Datenströme erfolgreich gerendert wurden. Wenn die RenderDvdVideoVolume-Methode einen Fehlercode oder den Wert S_FALSE zurückgibt, können Sie die AM_DVD_RENDERSTATUS Struktur auf Details zum Fehler untersuchen.
Rufen Sie als Nächstes einen Zeiger auf den Filter Graph Manager ab, indem Sie IDvdGraphBuilder::GetFiltergraph aufrufen. Diese Methode gibt einen Zeiger auf die IGraphBuilder-Schnittstelle des Filter Graph-Managers zurück.
IGraphBuilder *pGraph = NULL;
hr = pBuild->GetFiltergraph(&m_pGraph);
Verwenden Sie die IDvdGraphBuilder::GetDvdInterface-Methode , um DVD-bezogene Schnittstellen abzurufen, einschließlich der folgenden:
- IDvdControl2. Steuert wiedergabe- und DVD-Befehle
- IDvdInfo2. Gibt Informationen zum aktuellen Zustand des DVD-Navigators zurück.
- IAMLine21Decoder. Steuerelemente Untertitel Anzeige geschlossen. Die Anzeige geschlossener Untertitel ist standardmäßig aktiviert. Zum Deaktivieren rufen Sie IAMLine21Decoder::SetServiceState mit dem flag AM_L21_CCSTATE_Off auf.
- IBasicAudio. Steuert Die Lautstärke und den Ausgleich der Audiowiedergabe.
Der folgende Code gibt beispielsweise die IDvdControl2-Schnittstelle zurück.
IDvdControl2 *pDvdControl = NULL;
hr = pBuild->GetDvdInterface(IID_IDvdControl2, (void**)&pDvdControl);
Die empfohlene Möglichkeit zum Erstellen des DVD-Wiedergabefilterdiagramms besteht darin, dies automatisch von einem DVD Graph Builder-Objekt für Sie auszuführen. Dieser Ansatz wird unten und in der DVD-Beispielanwendung veranschaulicht. Wenn Sie Ihr DVD-Filterdiagramm manuell erstellen müssen, können Sie dies tun, indem Sie die grundlegenden Regeln der Grapherstellung befolgen, die an anderer Stelle in der DirectShow-Dokumentation erläutert werden. Im Allgemeinen sollten Sie einzelne Filter in dem vom DVD Graph Builder erstellten Diagramm nicht manuell hinzufügen, entfernen, verbinden oder trennen, da dies den Bereinigungscode verwirren könnte.
Konfigurieren des Videorenderers
DirectShow bietet mehrere Videorendererfilter. Bevor Sie das Diagramm erstellen, können Sie den gewünschten Videorenderer auswählen. Wählen Sie den Renderer aus, indem Sie IDvdGraphBuilder::GetDvdInterface aufrufen und eine Schnittstelle anfordern, die für diesen Renderer spezifisch ist:
- Overlay-Mixerfilter: IDDrawExclModeVideo.
- Video mixing Renderer 7 (VMR-7): IVMRFilterConfig.
- Video Mixing Renderer 9 (VMR-9): IVMRFilterConfig9.
- Erweiterter Videorenderer (EVR): IEVRFilterConfig.
Wenn Sie vor dem Erstellen des Filterdiagramms eine dieser Schnittstellen anfordern, erstellt der DVD Graph Builder den entsprechenden Videorenderer. Später, wenn Sie das Diagramm erstellen, versucht der DVD Graph Builder, diesen Renderer zu verwenden. Wenn das Diagramm jedoch nicht mithilfe des ausgewählten Renderers erstellt werden kann, kann es zu einem anderen Renderer wechseln. Beispielsweise ist Ihr MPEG-2-Decoder möglicherweise nicht mit dem VMR-Filter kompatibel. In diesem Fall würde der DVD Graph Builder standardmäßig auf den Overlay-Mixer festgelegt.
Diese Schnittstellen bieten Ihnen auch die Möglichkeit, den Renderer zu konfigurieren, bevor er mit dem Decoder verbunden ist. Sie können beispielsweise festlegen, dass die VMR den fensterlosen Modus anstelle des standardmäßigen Fenstermodus verwendet. Weitere Informationen zu Videorenderern finden Sie im Thema Informationen zum Rendern von Videos in DirectShow.
Unter Windows XP und höher verwendet der DVD Graph Builder immer den Video Mixing Renderer 7 (VMR-7), es sei denn:
- Der Aufrufer hat nur den Overlay-Mixer gefunden, z. B. IMixerPinConfig2. Dadurch wird ein Hinweis an den DVD Graph Builder gesendet, dass die Anwendung den Overlay-Mixer und nicht den VMR verwenden möchte. Windows Medienwiedergabe verfügt auch über eine Dialogfeldoption, um die Verwendung des Überlagerungsmischers zu erzwingen.
- Der installierte Decoder ist nicht VMR-kompatibel. Während der Grapherstellung wird die neue IAMDecoderCaps-Schnittstelle verwendet, um die VMR-Unterstützung des Decoders zu überprüfen. Wenn dies nicht vorhanden ist, verwendet der DVD Graph Builder den Überlagerungsmischer.
- Bei Verwendung eines Hardwaredecoders kann der Decoder keine Verbindung mit dem Videoport-Manager (VPM ) herstellen. Wenn ein Hardwaredecoder den VPM nicht verwenden kann, kann er die VMR nicht verwenden, und so versucht der DVD Graph Builder dann, mithilfe des Overlay-Mixers ein Diagramm zu erstellen.
- Die Anzeige Karte verfügt bekanntlich über unzureichende Ressourcen und/oder Funktionen, um die VMR zu unterstützen, meldet dies jedoch nicht ordnungsgemäß im Treiber. (Einige bekannte Fälle werden vom DVD Graph Builder ausdrücklich ausgeschlossen.)
- Die Verbindung zwischen dem Decoder und der VMR schlägt aus irgendeinem Grund fehl, in der Regel aufgrund eines Mangels an VRAM zum Erstellen der erforderlichen Oberflächen. In diesen Fällen schaltet der DVD Graph Builder die VMR-Verwendung aus und versucht, den Überlagerungsmischer zum Erstellen eines Graphen zu verwenden.
Fenstermodus
Im Fenstermodus (Overlay Mixer oder VMR) erstellt der Renderer ein eigenes Videofenster. Um dieses Fenster zu einem untergeordneten Element des Anwendungsfensters zu machen, rufen Sie IVideoWindow::p ut_Owner mit einem Handle für die Anwendung auf. Rufen Sie auch IVideoWindow::p ut_WindowStyle auf, um die WS_CHILD und WS_CLIPSIBLINGS Formatvorlagen im Videofenster des Renderers festzulegen. Um Mausnachrichten aus dem Videofenster des Renderers abzurufen, rufen Sie IVideoWindow::p ut_MessageDrain mit einem Handle zum Anwendungsfenster auf. Diese Methode richtet eine "Nachrichtenentwässerung" ein – das Videofenster leitet alle empfangenen Mausnachrichten an das Nachrichtenablauffenster weiter.
pVideoWindow->put_Owner((OAHWND)hwnd);
pVideoWindow->put_WindowStyle(WS_CHILD | WS_CLIPSIBLINGS);
pVideoWindow->put_MessageDrain((OAHWND)hwnd) ;
Das Löschen von Nachrichten macht die Auswahl der DVD-Menüschaltflächen etwas kompliziert. Wenn das Videofenster nicht den gesamten Clientbereich der Anwendung füllt, fallen einige Mausereignisse außerhalb des Videofensters. Wenn Sie ein Mausereignis aus dem Videofenster erhalten, sollten Sie es für die DVD-Menünavigation verarbeiten. Mausereignisse von außerhalb des Videofensters sollten nicht verarbeitet werden. Mit der Nachrichtenentwässerung gibt es keine Möglichkeit, zwischen den beiden zu unterscheiden. Darüber hinaus sind die Koordinaten für Mausereignisse aus dem Videofenster relativ zum Clientbereich des Videofensters; Mausereignisse von außerhalb des Videofensters sind jedoch relativ zum Clientbereich der Anwendung.
Fensterloser Modus
Der fensterlose Modus vermeidet die Probleme mit Mausnachrichten ganz. Sie benötigen keine Nachrichtenentwässerung, da die VMR (oder EVR) kein eigenes Fenster im fensterlosen Modus erstellt. Stattdessen wird es direkt in Ihr Anwendungsfenster gezogen. Wenn das Zielrechteck kleiner als der Anwendungsclientbereich ist, berücksichtigt der DVD-Navigator dies bei der Berechnung der DVD-Schaltflächenpositionen. Wenn Sie also eine Mausnachricht erhalten, können Sie die Koordinaten direkt an den DVD-Navigator übergeben, wie im Abschnitt Menünavigation beschrieben.