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