Share via


處理視訊轉譯器的格式變更

[與此頁面相關的功能 DirectShow是舊版功能。 它已被 MediaPlayerIMFMediaEngineMedia Foundation 中的音訊/視訊擷取取代。 這些功能已針對Windows 10和Windows 11進行優化。 Microsoft 強烈建議新程式碼盡可能使用 MediaPlayerIMFMediaEngine音訊/視訊擷取 ,而不是 DirectShow。 Microsoft 建議使用舊版 API 的現有程式碼盡可能重寫為使用新的 API。

本節描述解碼器篩選或轉換篩選如何處理視訊轉譯器的格式變更。

影片轉譯器篩選

當舊的 影片轉譯器 篩選連線時,它需要符合主要監視器顯示格式的 RGB 格式。 如果 DirectDraw 無法使用,這可讓您使用 GDI 進行轉譯。 播放開始時,視訊轉譯器可能會切換為 DirectDraw 相容格式。 為了證明上游篩選是否可以支援新的格式,影片轉譯器會在上游篩選的輸出針腳上呼叫 IPin::QueryAccept 。 如果上游篩選準則接受新的格式, QueryAccept 方法會傳回S_OK。 影片轉譯器會藉由將具有新格式的媒體類型附加至配置器所傳回的下一個媒體範例,來切換格式。 上游篩選準則應該在每個範例上呼叫 IMediaSample::GetMediaType 來檢查格式變更。 影片轉譯器可能會在串流期間隨時在原始格式和新格式之間來回切換。 第一個格式變更之後,它不會呼叫 QueryAccept 。 上游篩選準則接受新的格式之後,它必須能夠來回切換。

上游篩選準則可以從 QueryAccept傳回S_FALSE來拒絕格式變更。 在此情況下,影片轉譯器會繼續使用 GDI 與原始格式。

影片混合轉譯器篩選

視訊混合轉譯器篩選 (VMR-7 和 VMR-9) 會與系統上圖形硬體支援的任何格式連線。 VMR-7 一律會使用 DirectDraw 進行轉譯,並在上游篩選連線時配置基礎 DirectDraw 介面。 VMR-9 一律會使用 Direct3D 進行轉譯,並在上游篩選連線時配置基礎 Direct3D 介面。

圖形硬體可能需要比影像寬度更大的表面進階。 在此情況下,VMR 會呼叫 QueryAccept來要求新的格式。 它會以視訊格式報告BITMAPINFOHEADER之 biWidth成員中的表面步幅。 如果上游篩選未從 QueryAccept傳回S_OK,VMR 會拒絕格式,並嘗試使用上游篩選所公告的下一個格式進行連線。 VMR 會將具有新格式的媒體類型連結至第一個媒體範例。 第一個範例之後,格式會維持不變;當圖形正在執行時,VMR 將不會切換格式。

增強的視訊轉譯 (EVR)

EVR 一律使用 Direct3D 進行轉譯。 如果需要較大的表面步幅,EVR 會使用與 VMR 相同的 QueryAccept 機制。

QueryAccept (上游)