共用方式為


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

[與此頁面相關聯的功能,DirectShow是舊版功能。 它已被 MediaPlayerIMFMediaEngine和媒體基金會中的 音訊/視訊擷取取代。 這些功能已針對 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 (上游)