DMO 基本概念 (Microsoft Media Foundation)
本主題提供與 Windows 媒體編解碼器相關的 DMO 簡短概觀。 如需 DMO 的詳細資訊,請參閱 DirectX 媒體物件。
DMO 是可轉換資料的 COM 物件。 您會將資料傳遞至該資料,並傳回已轉換的資料。 在編解碼器編碼器 DMO 的情況下,您輸入未壓縮的媒體資料,而 DMO 會傳遞壓縮的媒體資料。 使用 DMO 的主要優點是,它們全都實作相同的基底介面 IMediaObject,這可簡化其使用方式,因為不論要執行的轉換類型為何,都可以使用相同的物件。
由於任何種類的資料轉換涉及變數,因此音訊和視訊轉換必須考慮各種可能的媒體組態。 Windows 媒體音訊和視訊編解碼器也支援許多特殊功能,您必須能夠使用 DMO 進行設定。
一般而言,編解碼器 DMO 需要用來壓縮和解壓縮數位媒體的變數資訊會以下列三種方式之一來傳達:
- 在 DMO 上設定輸入類型,以傳達傳遞至編碼器 DMO 之未壓縮媒體的特性,以及您傳遞至解碼器 DMO 的壓縮媒體特性。
- 在 DMO 上設定輸出類型,以傳達編碼器 DMO 所傳遞之壓縮媒體的特性,以及解碼器 DMO 所傳遞之未壓縮媒體的特性。
- 使用 IPropertyBag 介面的方法,設定其他設定,以支援編解碼器 DMO 的各種功能做為屬性。 IPropertyBag 是所有編解碼器 DMO 都支援的標準 COM 介面。
此外,某些編解碼器功能是使用編解碼器 DMO 專屬的其他介面來管理。 這些介面會針對 Codec Objects一節中的每個編解碼器列出。
輸入和輸出類型是輸入和輸出資料流程特有的。 每個資料流程都代表內容的離散標記法。 例如,Windows Media Video 編碼器 DMO 具有單一輸入資料流程和兩個輸出資料流程。 輸入資料流程接受未壓縮的影片範例。 兩個輸出資料流程的第一個會傳遞壓縮的樣本;另一個提供未壓縮的範例。 一個輸出資料流程中的個別範例代表與另一個資料流程中對應樣本相同的內容,但每個資料流程都會以不同的格式傳遞這些樣本。
每個資料流程 (輸入或輸出) 都支援一或多種媒體類型。 媒體類型或格式是由 DMO_MEDIA_TYPE 結構描述。 您可以藉由呼叫 IMediaObject::GetOutputType,查詢輸出資料流程所支援的類型 DMO。 此方法會傳回有效的 (,不過在某些情況下,該資料流程的部分不完整) 輸出類型。 您可以列舉輸出資料流程支援的媒體類型,方法是對 GetOutputType進行重複呼叫,並使用每個呼叫遞增類型參數。 當您傳遞的類型索引超出界限時,方法會傳回 DMO_E_NO_MORE_ITEMS。 您可以使用 IMediaObject::GetInputType 方法,以相同方式列舉輸入格式。
DMO 所列舉的類型只是「慣用」類型,不過,可能會支援其他類型。 您可以呼叫 IMediaObject::SetOutputType來驗證輸出類型。 使用 IMediaObject::SetInputType 來驗證輸入類型。 如果傳遞 的DMO_MEDIA_TYPE 結構無效 , 這兩種方法都會傳回DMO_E_TYPE_NOT_ACCEPTED。 某些 DMO 會要求您在列舉任何輸入類型之前設定輸出類型。 Windows 媒體音訊和視訊編解碼器 DMO 都有具有相依性驗證的輸入和輸出。 也就是說,您設定的輸出類型會設定輸入類型的驗證準則。 另外還有一些屬性,當設定時,請改變有效的輸入和輸出類型。 基於這個理由,您應該先在 DMO 上設定所有所需的屬性,再列舉類型。
當您已設定 DMO 的輸出和輸入類型時,就可以開始處理範例。 每個輸入範例都會使用 呼叫 IMediaObject::P rocessInput傳遞至編解碼器,而當您呼叫 IMediaObject::P rocessOutput時,每個輸出範例都會由編解碼器傳遞。
相關主題