提供 VMR-9 的自訂Allocator-Presenter
[與此頁面相關的功能 DirectShow是舊版功能。 它已被 MediaPlayer、 IMFMediaEngine和 Media Foundation 中的音訊/視訊擷取取代。 這些功能已針對Windows 10和Windows 11進行優化。 Microsoft 強烈建議新程式碼盡可能使用 MediaPlayer、 IMFMediaEngine 和 音訊/視訊擷取 ,而不是 DirectShow。 Microsoft 建議使用舊版 API 的現有程式碼盡可能重寫為使用新的 API。
若要搭配視訊混合轉譯器 9 使用自訂配置器呈現器 9 (VMR-9) 篩選,請執行下列步驟:
實作支援 IVMRSurfaceAllocator9 和 IVMRImagePresenter9 介面的類別。
針對IVMRFilterConfig9介面,在 VMR-9 篩選上呼叫QueryInterface。
呼叫 IVMRFilterConfig9::SetRenderingMode 方法,並傳入 VMR9Mode_Renderless 旗標。
IVMRSurfaceAllocatorNotify9介面的 VMR-9 篩選準則上的QueryInterface。
呼叫 IVMRSurfaceAllocatorNotify9::AdviseSurfaceAllocator 方法,並傳入配置器-簡報者的 IVMRSurfaceAllocator9 方法的指標。
呼叫配置器簡報者的 IVMRSurfaceAllocator9::AdviseNotify 方法,並傳入 VMR-9 篩選準則的 IVMRSurfaceAllocatorNotify9 介面指標。
在您的 IVMRSurfaceAllocator9::AdviseNotify實作中,呼叫 IVMRSurfaceAllocatorNotify9::SetD3Device 傳入 Direct3D 裝置的指標,以及視訊出現所在監視器的控制碼。
在 IVMRSurfaceAllocator9::InitializeDevice 方法的實作中,建立符合 InitializeDevice 方法中指定參數的 Direct3D 介面。 您可以選擇性地使用 VMR-9 篩選器的 IVMRSurfaceAllocatorNotify9::AllocateSurfaceHelper 方法來配置這些介面。 將表面指標儲存在陣列中。
注意
如果您想要讓 VMR-9 將視訊畫面繪製到紋理表面,請將 VMR9AllocFlag_TextureSurface 旗標新增至 VMR9AllocationInfo 結構。 如果裝置不支援原生視訊格式的紋理,您可能需要建立個別的紋理表面,然後將視訊畫面從視訊表面複製到紋理。
在串流期間,VMR-9 會藉由呼叫 IVMRSurfaceAllocator9::GetSurface 方法,從配置器呈現器取得表面。 VMR-9 會依介面陣列內的索引指定介面, (步驟 8) 。
當 VMR-9 呼叫 IVMRImagePresenter9::P resentImage 方法時顯示映射。 參數包含 Direct3D 介面的指標,其中包含視訊影像。
如果 Direct3D 裝置隨時遺失,配置器簡報者必須還原裝置並重新建立表面。 例如,如果顯示模式變更,或使用者將視窗移至另一個監視器,裝置可能會遺失。 如果 Direct3D 裝置變更,請呼叫 VMR-9 篩選器的 IVMRSurfaceAllocatorNotify9::ChangeD3DDevice 方法。
串流停止時,VMR-9 會呼叫 IVMRSurfaceAllocator9::TerminateDevice 方法。 配置器簡報者應該釋放其所有 Direct3D 資源。
VMR-7 和 VMR-9 之間的一些差異在於自訂配置器簡報者管理的方式:
- VMR-9 篩選器的 AllocateSurfaceHelper 方法可供配置介面時使用的配置器簡報者使用。 這個方法讓自訂配置器簡報者將任何呼叫轉送到預設配置器簡報者不需要。 基於這個理由,不會發佈 VMR-9 篩選器預設配置器簡報者的 CLSID。
- 不同于 VMR-7,VMR-9 不提供特殊的 DirectDraw 獨佔模式配置器-簡報者。 IVMRSurfaceAllocatorNotify9::AllocateSurfaceHelper方法會使這個物件不必要。
- 針對交錯視訊,VMR-9 一律會在影片呈現影像之前取消交錯影片。 配置器簡報者在顯示影像之前,不再負責取消交錯影像。
相關主題