自定義混音器
[此頁面所述的元件, 增強的視訊轉譯器是舊版功能。 它已被透過 MediaPlayer 和 IMFMediaEngine 元件公開的簡單視頻轉譯器(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 視訊處理功能。 |
使用混音器進行格式交涉的運作方式如下:
EVR 會在參考數據流上設定媒體類型。
EVR 會以MFVP_MESSAGE_INVALIDATEMEDIATYPE訊息在演示者上呼叫 IMFVideoPresenter::P rocessMessage。
演示者會在混音器的輸出數據流上設定媒體類型。
EVR 會在子數據流上設定媒體類型。
如果參考數據流上的媒體類型變更,混音器的其他媒體類型就不再有效。 混音器的IMFTransform::P rocessOutput方法接著會失敗並傳回MF_E_TRANSFORM_STREAM_CHANGE。 演示者目前不應該執行任何動作。 EVR 會再次起始格式交涉程式。
當任何輸入數據流到達數據流結尾時,EVR 會在混音器上呼叫 IMFTransform::P rocessMessage 與 MFT_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。 |
相關主題