關於 MFT
媒體基礎會 (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 將不會再接受任何輸入。
例如,假設您使用視訊解碼器來解碼包含主要畫面格和差異畫面格的視訊資料流程。 一開始,MFT 需要一些輸入,才能解碼任何畫面。 用戶端會呼叫 ProcessInput 來傳遞第一個畫面。 假設第一個框架是一個差異框架 (如下圖所示,如預測框架) 的 'P'。 解碼器會保留在這個畫面上,但除非取得下一個主要畫面格,否則無法產生任何輸出。
用戶端會繼續呼叫 ProcessInput ,最後到達下一個主要畫面格 (顯示于下一個圖表中,做為程式碼內框架) 的 'I'。 現在解碼器有足夠的畫面格可開始解碼。 此時會停止接受輸入,而且用戶端必須呼叫 ProcessOutput 以取得已解碼的畫面格。
用戶端最簡單的方法是替代 對 ProcessInput 和 ProcessOutput的呼叫。 基本 MFT 處理模型主題會描述更複雜的演算法。
相關主題