使用影片混音器控制件
[此頁面所述的元件, 增強的視訊轉譯器是舊版功能。 它已被透過 MediaPlayer 和 IMFMediaEngine 元件公開的簡單視頻轉譯器(SVR)所取代。 若要播放視訊內容,您應該將數據傳送到其中一個元件,並允許它們具現化新的視訊轉譯器。 這些元件已針對 Windows 10 和 Windows 11 優化。 Microsoft 強烈建議新程式代碼盡可能使用 MediaPlayer 或較低層級 的 IMFMediaEngine API 在 Windows 中播放視訊媒體,而不是 EVR。 Microsoft 建議將使用舊版 API 的現有程式代碼重寫為盡可能使用新的 API。]
EVR 混音器提供數個介面,應用程式可用來控制混音器處理影片的方式。 這些介面可用於 DirectShow 或 Media Foundation。
介面 | 描述 |
---|---|
IMFVideoMixerBitmap 介面 | Alpha 會將靜態位圖影像混合到影片中。 |
IMFVideoMixerControl 介面 | 控制 EVR 如何混合視訊子流。 |
IMFVideoProcessor 介面 | 控制色彩調整、影像篩選和其他視訊處理功能。 此介面可讓您存取圖形驅動程式所實作的功能,因此確切的功能將取決於使用者的圖形驅動程式。 |
取得這些介面指標的正確方式取決於您使用的是EVR或媒體基礎版本的 DirectShow 版本。 針對媒體基礎 EVR,也取決於您是直接使用 EVR,還是透過 媒體會話使用它。 (通常應用程式會透過媒體會話使用 EVR,而不是直接使用)。
若要取得這些介面的指標,請執行下列動作:
取得EVR上 IMFGetService 介面的指標。
如果您使用 DirectShow EVR 篩選條件,請在篩選上呼叫 QueryInterface 。
如果您直接使用 EVR 媒體接收器,請在媒體接收上呼叫 QueryInterface 。
如果您使用媒體會話,請在媒體會話上呼叫 QueryInterface 。
如果您使用媒體會話,請等候媒體會話傳送 具有狀態值為 MF_TOPOSTATUS_READY 的MESessionTopologyStatus 事件。 (如果您未使用媒體會話,請略過此步驟。
呼叫 IMFGetService::GetService 以取得混音器介面。 使用服務標識碼MR_VIDEO_MIXER_SERVICE。
Alpha 將點陣圖混合到影片
您可以使用 IMFVideoMixerBitmap 介面,在播放期間將靜態位圖混合至視訊。 您可以將點陣圖儲存在 Direct3D 介面中,指定為 IDirect3DSurface9 指標,或使用 GDI 位陣圖。
如果您使用 Direct3D 表面做為位圖,表面可以包含每圖元 Alpha 數據,這會在混音器 Alpha 混合影像時使用。 或者,您可以定義色彩索引鍵,也就是在點陣圖中顯示的單一色彩。 此外,您也可以指定將套用至整個影像的 Alpha 值。 您也可以設定來源矩形來裁剪點陣圖,以及將點陣圖定位在視訊框架中的目的地矩形。
若要設定位圖,請呼叫IMFVideoMixerBitmap::SetAlphaBitmap。 這個方法會採用指定位圖和Alpha混合參數的 MFVideoAlphaBitmap 結構的指標。 如需範例程式代碼,請參閱 SetAlphaBitmap 方法的參考主題。
設定位圖之後,您可以呼叫 IMFVideoMixerBitmap::UpdateAlphaBitmapParameters 來更新混合參數,包括來源和目的地矩形。 更新會在下一個視訊畫面上生效。 影片必須播放,才能進行更新。 您可以使用此方法在點陣圖上執行簡單的動畫。 (如果您需要更複雜的效果,請考慮撰寫自定義的 EVR 混音器。
若要清除位圖,請呼叫IMFVideoMixerBitmap::ClearAlphaBitmap。
控制子數據流
EVR 可以將一或多個視訊子串流混合到主要視訊串流。 若要控制子串流混合,請使用 IMFVideoMixerControl 介面。
呼叫 IMFVideoMixerControl::SetStreamOutputRect ,以設定子數據流在複合式視訊框架中的位置。
呼叫 IMFVideoMixerControl::SetStreamZOrder 來設定子數據流的 z 順序。 EVR 會依其迭置順序值的順序繪製視訊串流,從零開始。 主要視訊串流一律以 z 順序排列。
視訊處理器 設定
EVR 混音器會使用 DirectX 影片加速 (DXVA) 在輸入數據流上執行視訊處理。 確切的處理功能取決於圖形驅動程式。 視訊處理功能是使用 DXVA2_VideoProcessorCaps 結構來描述。 一組特定的功能稱為 視訊處理模式,每個模式都是由 GUID 識別。 如需預先定義的 GUID 清單,請參閱 IDirectXVideoProcessorService::GetVideoProcessorDeviceGuids。 驅動程式可能會定義其他廠商特定的 GUID,代表不同的功能組合。
若要尋找支援模式和每個模式的功能,請執行下列動作:
呼叫 IMFGetService::GetService 以取得混音器之 IMFVideoProcessor 介面的指標。
呼叫 IMFVideoProcessor::GetAvailableVideoProcessorModes。 這個方法會傳回 GUID 陣列,以識別可用的視訊處理器模式。 此清單會以遞減質量順序傳回,此模式的品質最高會先出現在清單中。 清單可能會根據視訊的格式而變更。
針對清單中的每個 GUID,呼叫 IMFVideoProcessor::GetVideoProcessorCaps 以尋找對應視訊處理器模式的功能。 方法會將 功能的描述填入DXVA2_VideoProcessorCaps 結構。
若要選取模式,請呼叫 IMFVideoProcessor::SetVideoProcessorMode。 否則,EVR 會在串流開始時自動選取模式。 在此情況下,您可以呼叫 IMFVideoProcessor::GetVideoProcessorMode 來尋找選取的模式。
DXVA2_VideoProcessorCaps 結構中的大部分字段都描述低階驅動程序行為,而且對一般應用程式並不感興趣。 下列欄位最有可能感興趣:
DeviceCaps。 此欄位指出是否在硬體或軟體中執行視訊處理,以及圖形驅動程式是否為較舊的 DXVA 1.0 驅動程式。
DeinterlaceTechnology。 此欄位提供一些指示,指出來源視訊交錯時,您可以預期的去交錯品質層級。
ProcAmpControlCaps。 此欄位會指定可用的色彩調整控制件。 如需可能的色彩調整清單,請參閱 ProcAmp 設定。 如果驅動程式無法執行色彩調整,此欄位為零。
VideoProcessorOperations。 此欄位包含描述其他視訊處理功能的旗標。 具有特殊重要性的兩個旗標是DXVA2_VideoProcess_SubStreams旗標和DXVA2_VideoProcess_SubStreams旗標。 至少有一個旗標必須存在,EVR 才能將子數據流混合到參考視訊串流。 如果兩個旗標都不存在,EVR 會限制為一個視訊串流。
NoiseFilterTechnology。 此欄位表示圖形驅動程序支援哪些雜訊篩選器。 如果驅動程式不支持雜訊篩選,則值會DXVA2_NoiseFilterTech_Unsupported。
DetailFilterTechnology。 此欄位表示圖形驅動程序支援哪些詳細資料篩選。 如果驅動程式不支持雜訊篩選,則值會DXVA2_DetailFilterTech_Unsupported。
色彩調整和影像篩選
圖形驅動程式可能支援色彩調整(也稱為 程式放大 或只是 ProcAmp)和影像篩選。 GPU 執行時,可以即時進行色彩調整和影像篩選,而不需要 CPU 額外負荷。
若要使用這些功能,請執行下列步驟:
如上一節所述,選取視訊處理模式。
呼叫 IMFVideoProcessor::GetVideoProcessorCaps 來尋找如上一節中所述的視訊處理功能。 方法會填入 描述功能DXVA2_VideoProcessorCaps 結構,包括驅動程式是否支援色彩調整和影像篩選。
針對驅動程序支援的每個色彩調整,呼叫 IMFVideoProcessor::GetProcAmpRange 以尋找該設定可能的值範圍。 這個方法也會傳回設定的預設值。 呼叫 IMFVideoProcessor::GetProcAmpValues 以尋找設定的目前值。 這些值沒有指定的單位。 由驅動程式決定值的範圍。
呼叫 IMFVideoProcessor::SetFilteringValue 來設定色彩調整值。
如果驅動程式支援影像篩選,則每個篩選類型(雜訊和詳細數據)都支援色度和 luma 中的三個設定:層級、半徑和閾值。 (請參閱DXVA 影像篩選 設定。)針對每個設定,呼叫IMFVideoProcessor::GetFilteringRange 以取得可能的值範圍,並呼叫IMFVideoProcessor::GetFilteringValue 以取得目前的值。
若要變更影像篩選設定,請呼叫IMFVideoProcessor::SetFilteringValue。
相關主題