[此頁面所述的元件,增強式視訊轉譯器,是舊版功能。 它已被透過 MediaPlayer 和 IMFMediaEngine 元件公開的簡單視訊轉譯器(SVR)取代。 若要播放視訊內容,您應該將數據傳送到其中一個元件,並允許它們具現化新的視訊轉譯器。 這些元件已針對 Windows 10 和 Windows 11 優化。 Microsoft強烈建議新程式代碼盡可能使用 MediaPlayer 或較低層級 IMFMediaEngine API 在 Windows 中播放視訊媒體,而不是 EVR。 Microsoft建議使用舊版 API 的現有程式代碼,盡可能改寫成使用新的 API。]
IMFVideoDisplayControl 介面可控制增強式視訊轉譯器 (EVR) 如何在應用程式視窗中顯示視訊。 此介面可用於 DirectShow 或媒體基礎。 在內部,視訊顯示控件是由EVR的預設演示者所提供。 如果您撰寫自定義演示者,則可以提供相同的介面或定義自定義介面。
正確取得 IMFVideoDisplayControl 介面指標的方法,取決於您使用的是 EVR 的 DirectShow 版本還是 Media Foundation 版本。 對於 Media Foundation EVR,這也取決於您是直接使用 EVR,還是透過 Media Session 使用它(這更為常見)。
若要取得 IMFVideoDisplayControl 介面的指標,請執行下列動作:
取得 的 IMFGetService 介面指標。
如果您使用 DirectShow EVR 濾鏡,請在濾鏡上呼叫 QueryInterface。
如果您直接使用 EVR 媒體匯集器,請在媒體匯集器上呼叫 QueryInterface。
如果您使用媒體會話,請在媒體會話上呼叫 QueryInterface。
如果您使用媒體會話,請等候媒體會話傳送 MESessionTopologyStatus 事件,其狀態值為 MF_TOPOSTATUS_READY。 (否則請略過此步驟。
呼叫 IMFGetService::GetService,以取得 IMFVideoDisplayControl 介面。 服務標識碼是MR_VIDEO_RENDER_SERVICE。
您可以使用 IMFVideoDisplayControl 介面來執行下列工作:
設定裁剪視窗。
設定來源和目的地矩形。
更新視訊視窗以回應視窗訊息。
啟用或停用全螢幕模式。
裁剪視窗
應用程式必須提供EVR繪製影片的視窗。 若要設定裁剪視窗,請使用應用程式視窗的句柄呼叫 IMFVideoDisplayControl::SetVideoWindow。
如果您透過其啟用物件建立EVR媒體接收器,則不需要此步驟。 開啟物件會自動呼叫 SetVideoWindow,使用您在 MFCreateVideoRendererActivate 函式中提供的視窗句柄。
來源和目的地矩形
在播放期間,演示者會取得一部分的複合影片影像,並將它繪製到視訊視窗的區域。 複合影像的部分是 來源矩形,而視訊視窗的區域是 目的矩形。
來源矩形是使用標準化座標來定義,其中點 (0.0, 0.0) 會對應至影片左上角,而 (1.0, 1.0) 會對應至影片右下角。 來源矩形可以是這個矩形內的任何區域。 目的地矩形是以像素指定,相對於視窗的用戶區域。 默認來源矩形是整個影像,而預設目的地矩形是空的矩形。
若要設定來源和目的地矩形,請呼叫 IMFVideoDisplayControl::SetVideoPosition。
如果您透過其啟用物件建立EVR媒體接收器,則不需要此步驟。 啟動物件會自動將目標矩形設定為視窗整個客戶區域。 不過,如果您想要變更來源矩形或設定不同的目的地矩形,您應該呼叫 SetVideoPosition。
視窗訊息
在播放期間,您的應用程式應該回應特定視窗訊息,如下所示:
WM_PAINT:呼叫 IMFVideoDisplayControl::RepaintVideo 重繪影片。 此外,避免在播放視訊時繪製目的地矩形,因為這可能會導致閃爍。
WM_SIZE:您可能需要呼叫 SetVideoPosition 來調整目的地矩形的大小。
不同於 DirectShow 中的影片混合轉譯器 (VMR) 篩選器,您不需要在收到WM_DISPLAYCHANGE訊息時通知 EVR。
相關主題