建置 DVD 篩選圖形
[與此頁面 相關的功能 DirectShow是舊版功能。 它已被 MediaPlayer、 IMFMediaEngine和 Media Foundation 中的音訊/視訊擷取取代。 這些功能已針對Windows 10和Windows 11進行優化。 Microsoft 強烈建議新程式碼盡可能使用 MediaPlayer、 IMFMediaEngine 和 音訊/視訊擷取 ,而不是 DirectShow。 Microsoft 建議盡可能重寫使用舊版 API 的現有程式碼,以使用新的 API。]
如同任何 DirectShow 應用程式,DVD 播放應用程式會從建置篩選圖形開始。 DirectShow 提供下列用於 DVD 播放的元件:
- DVD Graph 產生器。 建構篩選圖形的協助程式物件。 它會公開 IMyGraphBuilder 介面。
- DVD 導覽器 篩選準則。 處理 DVD 播放、流覽和其他命令的 DirectShow 篩選準則。
DVD 播放也需要 MPEG-2 解碼器。 硬體和軟體 MPEG-2 解碼器可從協力廠商取得。 首先,建立 DVD Graph Builder 物件的實例。
IDvdGraphBuilder *pBuild = NULL;
hr = CoCreateInstance(CLSID_DvdGraphBuilder, NULL,
CLSCTX_INPROC_SERVER, IID_IDvdGraphBuilder, (void **)&pBuild);
此時,您可以選取並設定視訊轉譯器,再建置圖形的其餘部分。 下一節會更詳細地說明這個選擇性步驟。 如果您省略此步驟,DVD Graph 產生器會選取預設轉譯器。 接下來,呼叫 IHttpGraphBuilder::RenderHttpVideoVolume 方法來建置圖形。
AM_DVD_RENDERSTATUS buildStatus;
hr = pBuild->RenderDvdVideoVolume(L"Z:\\video_ts", 0, &buildStatus);
第一個參數是包含 DVD 檔案的目錄名稱。 在 DVD 光碟上,這些檔案位於名為 VIDEO_TS 的目錄中。 如果第一個參數為 Null,DVD Graph 產生器會使用包含 DVD 磁片區的第一個磁片磁碟機。
第二個參數包含各種選擇性旗標,可用來選擇 (硬體或軟體) 和其他選項的解碼器類型。
第三個參數是接收狀態資訊的 AM_DVD_RENDERSTATUS 結構。 如果 RenderMyVideoVolume 方法傳回S_FALSE,表示如果您是封閉式) ,則呼叫部分成功 (或部分失敗。 例如,方法可能會無法轉譯子圖形資料流程,即使其他資料流程已成功轉譯也一樣。 如果 RenderMyVideoVolume 方法傳回錯誤碼或值S_FALSE,您可以檢查 AM_DVD_RENDERSTATUS 結構,以取得錯誤的詳細資料。
接下來,藉由呼叫 IHttpGraphBuilder::GetFiltergraph來取得 Filter Graph 管理員的指標。 這個方法會傳回 Filter Graph Manager IGraphBuilder 介面的指標。
IGraphBuilder *pGraph = NULL;
hr = pBuild->GetFiltergraph(&m_pGraph);
使用 IHttpGraphBuilder::GetInterface 方法來擷取 DVD 相關介面,包括下列專案:
- IMyControl2。 控制播放和 DVD 命令
- IMyInfo2。 傳回 DVD 導覽器目前狀態的相關資訊。
- IAMLine21Decoder。 控制項關閉標題顯示。 預設會啟用關閉標題顯示。 若要停用它,請使用 AM_L21_CCSTATE_Off 旗標呼叫 IAMLine21Decoder::SetServiceState 。
- IBasicAudio。 控制音訊音量和平衡。
例如,下列程式碼會傳回 IControl2 介面。
IDvdControl2 *pDvdControl = NULL;
hr = pBuild->GetDvdInterface(IID_IDvdControl2, (void**)&pDvdControl);
建置 DVD 播放篩選圖形的建議方式是讓 DVD Graph Builder 物件自動為您執行。 此方法會在 DVD 範例應用程式中和下方示範。 如果您需要手動建置 DVD 篩選圖形,您可以遵循 DirectShow 檔中其他位置所討論的圖形建置基本規則。 一般而言,您不應該手動新增、移除、連接或中斷 DVD 圖形產生器所建立之圖形中的個別篩選,因為這樣做可能會混淆清除程式碼。
設定視訊轉譯器
DirectShow 提供數個視訊轉譯器篩選器。 在建置圖形之前,您可以選擇您偏好的視訊轉譯器。 呼叫 IHttpGraphBuilder::GetHttpInterface 並要求該轉譯器專屬的介面,以選取轉譯器:
- 重迭混音器篩選: IDDrawExclModeVideo。
- 視訊混合轉譯器 7 (VMR-7) : IVMRFilterConfig。
- 視訊混合轉譯器 9 (VMR-9) : IVMRFilterConfig9。
- 增強的視訊轉譯器 (EVR) :IEVRFilterConfig。
如果您在建置篩選圖形之前要求上述任何介面,DVD Graph 產生器會建立對應的視訊轉譯器。 稍後,當您建置圖形時,DVD Graph 產生器會嘗試使用該轉譯器。 但是,如果無法使用您選取的轉譯器來建置圖形,它可能會切換至另一個轉譯器。 例如,您的 MPEG-2 解碼器可能與 VMR 篩選器不相容,在此情況下,DVD 圖形產生器會預設為重迭混音器。
這些介面也可讓您在轉譯器連接到解碼器之前設定轉譯器。 例如,您可以將 VMR 設定為使用無視窗模式,而不是預設的視窗模式。 如需影片轉譯器的詳細資訊,請參閱 關於 DirectShow 中的影片轉譯主題。
在 Windows XP 和更新版本上,DVD 圖形產生器一律使用視訊 混合轉譯器 7 (VMR-7) ,除非:
- 呼叫端查詢介面只找到 OverlayMixerConfig2,例如 IMixerPinConfig2。 這會傳送提示給 DVD Graph Builder,讓應用程式想要使用重迭混音器,而不是 VMR。 Windows 媒體播放機也有一個對話方塊選項,可強制使用重迭混音器。
- 已安裝的解碼器與 VMR 不相容。 在圖形建置期間,會使用新的 IAMDecoderCaps 介面來檢查解碼器的 VMR 支援。 如果不存在,DVD Graph 產生器將會使用重迭混音器。
- 使用硬體解碼器時,解碼器無法連線到影片 埠管理員 (VPM) 。 如果硬體解碼器無法使用 VPM,則無法使用 VMR,因此 DVD 圖形產生器接著會嘗試使用重迭混音器來建置圖形。
- 已知顯示卡的資源和/或功能不足,無法支援 VMR,但未在驅動程式中正確報告。 (DVD Graph Builder 特別排除某些已知案例。)
- 解碼器和 VMR 之間的連線因故失敗,通常是因為缺少 VRAM 來建立必要的表面。 在這些情況下,DVD Graph 產生器會關閉 VMR 的使用,並嘗試使用重迭混音器來建置圖形。
視窗模式
在視窗模式中, (重迭混音器或 VMR) ,轉譯器會建立自己的視訊視窗。 若要讓此視窗成為應用程式視窗的子系,請使用應用程式的控制碼呼叫 IVideoWindow::p ut_Owner 。 同時呼叫 IVideoWindow::p ut_WindowStyle 來設定轉譯器視訊視窗上的WS_CHILD和WS_CLIPSIBLINGS樣式。 若要從轉譯器的視訊視窗取得滑鼠訊息,請使用應用程式視窗的控制碼呼叫 IVideoWindow::p ut_MessageDrain 。 這個方法會設定「訊息清空」— 視訊視窗會將它收到的任何滑鼠訊息轉送至訊息清空視窗。
pVideoWindow->put_Owner((OAHWND)hwnd);
pVideoWindow->put_WindowStyle(WS_CHILD | WS_CLIPSIBLINGS);
pVideoWindow->put_MessageDrain((OAHWND)hwnd) ;
訊息清空會使選取 DVD 功能表按鈕稍微複雜。 假設視訊視窗未填滿應用程式的整個工作區,某些滑鼠事件會落在視訊視窗外。 當您從視訊視窗 內 取得滑鼠事件時,您應該處理 DVD 功能表導覽。 不應處理來自視訊視窗 外部 的滑鼠事件。 當訊息清空時,就無法區分這兩者。 此外,來自視訊視窗的滑鼠事件的座標會相對於視訊視窗的工作區;但是,來自視訊視窗外部的滑鼠事件相對於應用程式的工作區。
無視窗模式
無視窗模式可避免滑鼠訊息完全發生問題。 您不需要清空訊息,因為 VMR (或 EVR) 不會在無視窗模式中建立自己的視窗。 相反地,它會直接繪製到您的應用程式視窗。 如果目的地矩形小於應用程式工作區,DVD 導覽器會在計算 DVD 按鈕位置時納入考慮。 因此,當您收到滑鼠訊息時,您可以將座標直接傳遞至 DVD 導覽器,如功能表導覽一節中所述。
相關主題