媒體基礎轉換 (MFT) 提供一般模型來處理媒體數據。 MFT 用於譯碼器、編碼器和數位訊號處理器(DSP)。 簡言之,在媒體來源和媒體匯入端之間的媒體傳輸流程中,任何東西都是 MFT。
對大部分的應用程式而言,MFT 數據處理的詳細數據會由媒體基礎架構的較高層級隱藏。 許多媒體基礎應用程式永遠不會直接呼叫媒體基礎轉換器 (MFT)。 不過,您當然可以直接在應用程式中裝載 MFT。
MFT 是從首次引入的「DirectX 媒體物件」(DMO)轉換模型進化而來。 事實上,建立支援這兩個模型的轉換相當容易。 相較於 DMO,MFT 的必要行為會更清楚指定,因此更容易撰寫正確的實作。 此外,MFT 可以支持硬體加速的視訊處理。
本主題提供 MFT 處理模型的簡短概觀,著重於整體設計,而不是特定的方法呼叫。 如需更詳細的逐步描述,請參閱 基本 MFT 處理模型。
流
MFT 具有輸入數據流和輸出數據流。 輸入數據流會接收數據,而輸出數據流會產生數據。 例如,譯碼器有一個輸入數據流,其會接收編碼的數據,以及一個輸出數據流,這會產生譯碼的數據。
MFT 上的資料流不會表示為不同的 COM 物件。 相反地,每個數據流都有指定的數據流標識符,而IMFTransform介面中的方法會採用數據流標識元作為輸入參數。
某些 MFT 有固定數目的數據流。 例如,譯碼器和編碼器通常只有一個輸入和輸出。 其他 MFT 有動態數目的數據流。 如果 MFT 支援動態數據流,用戶端可以新增輸入數據流。 用戶端無法新增輸出數據流,但 MFT 可能會在處理期間新增或移除輸出數據流。 例如,多任務器通常允許用戶端新增輸入數據流,並具有多任務數據流的一個輸出。 解多工器是多工器的反向功能,它具有一個輸入端,但根據輸入數據流的內容,可以有動態數量的輸出端。 下圖顯示多工器與解多工器之間的差異。
媒體類型
第一次建立 MFT 時,沒有任何數據流具有已建立的格式。 在 MFT 可以處理數據之前,客戶端必須設定資料流的格式。 例如,使用譯碼器時,輸入格式是原始來源檔案中使用的壓縮格式,而輸出格式是未壓縮的格式,例如 PCM 音訊或 RGB 視訊。 數據流格式會使用 媒體類型來描述。
根據 MFT 的內部狀態,它可能會為每個資料流提供可能的媒體類型清單。 當您設定媒體類型時,可以使用此清單作為提示。 在一個數據流上設定媒體類型可以變更另一個數據流的可能類型清單。 例如,譯碼器通常無法在用戶端設定輸入類型之前提供任何輸出類型。 輸入類型包含譯碼器需要傳回可能輸出類型清單的資訊。
若要在數據流上設定媒體類型,請呼叫 IMFTransform::SetInputType 或 IMFTransform::SetOutputType。 若要取得數據流的可能媒體類型清單,請呼叫 IMFTransform::GetInputAvailableType 或 IMFTransform::GetOutputAvailableType。
處理數據
用戶端在數據流上設定媒體類型之後,MFT 便準備好處理數據。 若要發生這種情況,用戶端會在提供輸入資料給 MFT 和從 MFT 取得輸出資料之間交替:
- 若要將輸入資料提供給 MFT,請呼叫 IMFTransform::P rocessInput。
- 若要從 MFT 提取輸出資料,請呼叫 IMFTransform::P rocessOutput。
ProcessInput 方法會取得用戶端所配置的媒體範例指標。 媒體範例包含一或多個緩衝區,而每個緩衝區都包含要處理的 MFT 輸入數據。
ProcessOutput 方法支援兩種不同的配置模型:MFT 會配置輸出緩衝區,或用戶端配置輸出緩衝區。 有些 MFT 支援這兩種配置模型,但 MFT 不需要同時支援這兩種配置模型。 例如,MFT 可能需要用戶端配置輸出緩衝區。 IMFTransform::GetOutputStreamInfo 方法會傳回輸出數據流的相關信息,包括 MFT 支援的配置模型。
MFT 的設計目的是盡可能緩衝處理最少的數據,以將管線中的延遲降到最低。 因此,在任何指定時間,MFT 都可以發出下列其中一個條件:
- MFT 需要更多輸入數據。 在此狀態下,MFT 無法產生輸出,直到客户端至少調用 ProcessInput 一次。
- MFT 不會再接受任何輸入,直到用戶端至少呼叫 ProcessOutput 一次。
例如,假設您使用視訊譯碼器來譯碼包含關鍵幀和差值幀的視訊流。 一開始,MFT 需要一些輸入,才能將任何畫面譯碼。 用戶端會呼叫 ProcessInput 來傳遞第一個畫面。 假設第一個幀是差分幀(在下圖中顯示為預測幀的 'P')。 譯碼器會保留這個框架,但無法產生任何輸出,直到取得下一個關鍵畫面為止。
用戶端會繼續呼叫 ProcessInput,並最終到達下一個關鍵幀(如下圖所示為內部編碼幀的 'I')。 現在譯碼器有足夠的畫面可以開始譯碼。 此時會停止接受輸入,客戶端必須呼叫 ProcessOutput,以取得解碼後的幀。
用戶端最簡單的方法是交替呼叫 ProcessInput 和 ProcessOutput。 基本 MFT 處理模型主題會說明更複雜的演算法。
相關主題