在 DirectShow 中使用 WDDM 擷取
[與此頁面相關的功能 DirectShow是舊版功能。 它已被 MediaPlayer、 IMFMediaEngine和 Media Foundation 中的音訊/視訊擷取取代。 這些功能已針對Windows 10和Windows 11進行優化。 Microsoft 強烈建議新程式碼盡可能使用 MediaPlayer、 IMFMediaEngine 和 音訊/視訊擷取 ,而不是 DirectShow。 Microsoft 建議使用舊版 API 的現有程式碼盡可能重寫為使用新的 API。
本主題適用于 Windows Vista 和更新版本。
某些視訊卡具有整合式視訊擷取功能。 在這些卡片上,擷取的視訊畫面會放在 VRAM) (的視訊記憶體中。 在 Windows Vista 之前,在 VRAM 中仍沒有處理畫面的標準機制。 相反地,資料必須複製到系統記憶體、處理中,然後複製到 VRAM 以供顯示。 在 Windows Vista 中,DirectShow 現在支援將 VRAM 中的視訊畫面保留在處理管線中的機制,從擷取到顯示。
KsProxy 篩選準則會藉由查詢驅動程式中的 KSPROPERTY_PREFERRED_CAPTURE_SURFACE 屬性,判斷驅動程式是否支援 VRAM 表面擷取。 (這個屬性記載于 Windows 驅動程式套件檔。) 如果驅動程式支援 VRAM 表面擷取,KsProxy 會配置特殊的媒體範例,以保存 Direct3D 介面的指標。
接下來,KsProxy 會判斷下游篩選是否支援 DirectX 影片加速 (DXVA) 2.0,如下所示:
- KsProxy 會查詢 IMFGetService 介面的下游輸入針腳。
- 如果針腳公開IMFGetService,KsProxy 會呼叫IDirect3DDeviceManager介面的IMFGetService::GetService。 服務識別碼MR_VIDEO_ACCELERATION_SERVICE。
這兩個介面都會記載于媒體基礎 SDK 檔中。
如果下游篩選不支援 DXVA 2.0,KsProxy 會配置額外的系統記憶體緩衝區。 它會使用此緩衝區,將視訊畫面從 VRAM 複製到系統記憶體。 媒體範例的 IMediaSample::GetPointer 方法會傳回這個系統記憶體緩衝區的指標。
不過,如果下游篩選器支援 DXVA 2.0,則 KsProxy 不會配置系統記憶體緩衝區。 在此情況下, GetPointer 方法會傳回E_NOTIMPL。 相反地,下游篩選準則應該直接存取樣本的 Direct3D 表面。 下游篩選有兩種方式可取得介面的指標,兩者都相等:
- 查詢IMFGetService介面的範例,並針對IDirect3DSurface9介面呼叫GetService。 服務識別碼MR_BUFFER_SERVICE。
- 查詢 IMediaSample2Config 介面的範例,並呼叫 IMediaSample2Config::GetSurface。
相關主題