使用影片顯示控制件

[此頁面所述的元件, 增強的視訊轉譯器是舊版功能。 它已被透過 MediaPlayerIMFMediaEngine 元件公開的簡單視頻轉譯器(SVR)所取代。 若要播放視訊內容,您應該將數據傳送到其中一個元件,並允許它們具現化新的視訊轉譯器。 這些元件已針對 Windows 10 和 Windows 11 優化。 Microsoft 強烈建議新程式代碼盡可能使用 MediaPlayer 或較低層級 的 IMFMediaEngine API 在 Windows 中播放視訊媒體,而不是 EVR。 Microsoft 建議將使用舊版 API 的現有程式代碼重寫為盡可能使用新的 API。]

IMFVideoDisplayControl 介面可控制增強式視訊轉譯器 (EVR) 如何在應用程式視窗內顯示視訊。 此介面可用於 DirectShow 或媒體基礎。 在內部,視訊顯示控件是由EVR的預設演示者所提供。 如果您撰寫自定義演示者,則可以提供相同的介面或定義自定義介面。

取得 IMFVideoDisplayControl 介面指標的正確方式取決於您使用的是 EVR 或媒體基礎版本的 DirectShow 版本。 對於媒體基礎 EVR,也取決於您是直接使用 EVR,還是透過媒體會話使用它(更典型)。

若要取得IMFVideoDisplayControl 介面的指標,請執行下列動作:

  1. 取得 IMFGetService 介面的指標。

    • 如果您使用 DirectShow EVR 篩選條件,請在篩選上呼叫 QueryInterface

    • 如果您直接使用 EVR 媒體接收器,請在媒體接收上呼叫 QueryInterface

    • 如果您使用媒體會話,請在媒體會話上呼叫 QueryInterface

  2. 如果您使用媒體會話,請等候媒體會話傳送 具有狀態值為 MF_TOPOSTATUS_READY 的MESessionTopologyStatus 事件。 (否則請略過此步驟。

  3. 呼叫 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

視窗訊息

在播放期間,您的應用程式應該回應特定視窗訊息,如下所示:

不同於 DirectShow 中的影片混合轉譯器 (VMR) 篩選器,您不需要在收到WM_DISPLAYCHANGE訊息時通知 EVR。

增強式視訊轉譯器