自定義混音器

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

本主題描述如何為增強式視訊轉譯器 (EVR) 撰寫自定義混音器。 您可以使用自訂混音器搭配 Media Foundation EVR 媒體接收或 DirectShow EVR 篩選器。 如需混音器和演示者的詳細資訊,請參閱 增強式視訊轉譯器

混音器是媒體基礎轉換 (MFT),具有一或多個輸入(參考數據流加上子數據流)和一個輸出。 輸入數據流會從上游接收樣本。 輸出數據流會將範例傳遞給演示者。 EVR 負責在混音器上呼叫 IMFTransform::P rocessInput,而演示者負責呼叫 IMFTransform::P rocessOutput

EVR 混音器至少必須實作下列介面:

介面 描述
IMFTransform 提供基底 MFT 功能。
IMFTopologyServiceLookupClient 可讓混音器從EVR取得介面。
IMFVideoDeviceID 可讓混音器從EVR取得介面。
IMFAttributes 用來將 MF_SA_D3D_AWARE 屬性公開至 EVR。

 

或者,MFT 可以實作下列任何介面:

介面 描述
IEVRTrustedVideoPlugin 播放受保護內容的必要專案。
IMFGetService 將 IMFVideoMixerBitmap IMFVideoProcessor介面公開至應用程式。
IMFQualityAdvise 可讓品質管理員調整影片品質。
IMFVideoMixerBitmap 可讓應用程式將靜態位圖混合到影片。
IMFVideoPositionMapper 地圖 輸出視訊畫面上的座標,以輸入視訊畫面上的座標。
IMFVideoProcessor 向應用程式公開一些 DXVA 視訊處理功能。

 

使用混音器進行格式交涉的運作方式如下:

  1. EVR 會在參考數據流上設定媒體類型。

  2. EVR 會以MFVP_MESSAGE_INVALIDATEMEDIATYPE訊息在演示者上呼叫 IMFVideoPresenter::P rocessMessage。

  3. 演示者會在混音器的輸出數據流上設定媒體類型。

  4. EVR 會在子數據流上設定媒體類型。

如果參考數據流上的媒體類型變更,混音器的其他媒體類型就不再有效。 混音器的IMFTransform::P rocessOutput方法接著會失敗並傳回MF_E_TRANSFORM_STREAM_CHANGE 演示者目前不應該執行任何動作。 EVR 會再次起始格式交涉程式。

當任何輸入數據流到達數據流結尾時,EVR 會在混音器上呼叫 IMFTransform::P rocessMessageMFT_MESSAGE_NOTIFY_END_OF_STREAM

混音器會使用 EVR 的 IMediaEventSink 介面,將下列事件傳送至 EVR。 此介面記載於 DirectShow SDK 檔中。

事件 描述
EC_SAMPLE_NEEDED 混音器需要新的輸入範例。

 

在串流開始之前,EVR 可能會在混音器上呼叫 ProcessOutput 混音器不應該讓這些呼叫失敗。 相反地,它應該以黑色圖元填滿輸出介面。 混音器應該會繼續以色彩填滿輸出範例,直到收到 MFT_MESSAGE_NOTIFY_BEGIN_STREAMING 訊息或 呼叫 ProcessInput 方法為止。 如果混音器收到 MFT_MESSAGE_NOTIFY_END_STREAMING 訊息,它應該切換回色彩填滿模式。

實作 IMFVideoDeviceID

IMFVideoDeviceID 介面包含一個方法 GetDeviceID,它會傳回裝置 GUID。 裝置 GUID 可確保演示者和混音器使用相容的技術。 如果裝置 GUID 不相符,EVR 就無法初始化。

標準混音器和演示者都使用 Direct3D 9,裝置 GUID 等於IID_IDirect3DDevice9。 如果您想要將自定義演示者與標準混音器搭配使用,則演示者的裝置 GUID 必須IID_IDirect3DDevice9。 如果您取代這兩個元件,您可以定義新的裝置 GUID。

實作 IMFTopologyServiceLookupClient

混音器必須實作 IMFTopologyServiceLookupClient 介面。 串流開始之前,EVR 會呼叫 IMFTopologyServiceLookupClient::InitServicePointers,並傳入 EVR 之 IMFTopologyServiceLookup 介面的指標。 混音器會使用此指標從EVR取得介面指標。

混音器至少必須查詢下列介面:

當 EVR 呼叫 IMFTopologyServiceLookupClient::ReleaseServicePointers 時,混音器必須釋放從呼叫 InitServicePointers 取得的任何指標。

混合器屬性

混音器應該支援下列屬性。

屬性 描述
MF_SA_D3D_AWARE 指定混音器是否支援 DirectX 視訊加速 (DXVA)。
MF_SA_REQUIRED_SAMPLE_COUNT EVR 應該為每個混音器串流配置的視訊範例數目。 此屬性適用於個別數據流;使用IMFTransform::GetInputStreamAttributes回的屬性存放區。

 

在EVR上設定混音器

若要在EVR上設定自定義混音器,請呼叫IMFVideoRenderer::InitializeRenderer DirectShow EVR 篩選器和 EVR 媒體接收都會實作此方法。

EVR Activation 物件。 如果您使用 EVR 啟用物件,您可以在 EVR 啟用物件上設定下列其中一個屬性,以提供自訂混音器:

屬性 描述
MF_ACTIVATE_CUSTOM_VIDEO_MIXER_ACTIVATE 混音器之啟用物件的指標。 啟用對象必須實 作IMFActivate 介面。
MF_ACTIVATE_CUSTOM_VIDEO_MIXER_CLSID 混音器的 CLSID。

 

增強式視訊轉譯器