DMO 媒體類型
[與此頁面相關聯的功能,DirectShow是舊版功能。 它已被 MediaPlayer、imfMediaEngine 取代,並在媒體基金會 音訊/視訊擷取。 這些功能已針對 Windows 10 和 Windows 11 進行優化。 Microsoft強烈建議新程式代碼盡可能在媒體 基礎中使用 MediaPlayer、IMFMediaEngine 和 音訊/視訊擷取,而不是 DirectShow。 Microsoft建議使用舊版 API 的現有程式代碼,盡可能改寫成使用新的 API。]
媒體類型描述與媒體數據流相關聯的格式。 本文說明 DMO 如何處理媒體類型。 它主要適用於撰寫自己的自定義 DMO 的開發人員。
媒體類型是使用 DMO_MEDIA_TYPE 結構來定義。 此結構包含下列資訊:
- 主要類型 是定義廣泛類別的全域唯一標識碼 (GUID),例如音訊或視訊。
- 子類型 是一種 GUID,可定義型別更具體的層面。 例如,在影片中,子類型包括16位 RGB、24 位 RGB、UYVY、DV 編碼視訊等等。
- 格式區塊 是完整指定格式的次要結構。 格式區塊的配置取決於數據類型。 例如,PCM 音訊會使用 的波 結構。 視訊會使用各種其他結構,包括 VIDEOINFOHEADER 和 VIDEOINFOHEADER2。 格式區塊的配置是由格式類型 GUID 來識別。 例如,FORMAT_WaveFormatEx會指定 的波 結構。
第一次建立 DMO 時,數據流沒有媒體類型。 在 DMO 可以處理任何數據之前,客戶端必須為每個數據流設定媒體類型。 在 DMO 上設定媒體類型時,會從客戶端的觀點來描述此程式。
登錄 中的 媒體類型
DMO 可以藉由呼叫 DMORegister 函式,將它支援的媒體類型清單新增至登錄。 應用程式可以使用這項資訊來搜尋符合特定格式的 DMO。 登錄中的資訊並非完整。 通常,您只會包含 DMO 支援的主要類型。 登錄專案具有輸入和輸出類型的個別機碼,但不會區分個別數據流。
DMORegister 函式會使用 DMO_PARTIAL_MEDIATYPE 結構來描述媒體類型。 此結構包含 DMO_MEDIA_TYPE 結構中找到的資訊子集,也就是主要類型和子類型。 它不包含格式區塊,因為格式區塊通常包含的資訊太細微而無法包含在登錄中,例如視訊影像的高度和寬度。
慣用媒體類型
在應用程式建立 DMO 之後,它可以查詢 DMO,以取得其支援的媒體類型。 針對每個數據流,DMO 會建立依喜好設定順序排列的媒體類型清單(可能為空白)。 IMediaObject::GetInputType 和 IMediaObject::GetOutputType 方法會列舉慣用的類型。 當應用程式在其他數據流上設定媒體類型時,數據流的慣用類型可能會動態變更。 例如,在設定輸入類型之後,慣用輸出類型的清單可能會變更,反之亦然。 不過,DMO 不需要動態更新其慣用的類型。 應用程式無法假設它收到的每一種類型都是有效的。 因此,IMediaObject::SetInputType 和 IMediaObject::SetOutputType 方法支援旗標來測試特定類型。
GetInputType 和 GetOutputType 方法都會傳回 DMO_MEDIA_TYPE 結構。 DMO 可以將此結構中的部分資訊保留空白,以指出類型範圍。 主要類型或子類型可以是GUID_NULL,而格式區塊可以是空的(零個字節)。 如果格式區塊是空的,則格式類型必須GUID_NULL。
當應用程式設定所有 DMO 的輸入類型之後,DMO 通常應該為每個輸出數據流傳回至少一個完整類型。 完整的輸出類型有助於測試,應用程式可以使用它作為合理的預設值。 DMO 測試應用程式依賴此行為。 (請參閱使用 DMOTest 應用程式 。
設定媒體類型
應用程式會使用 SetInputType 和 SetOutputType 方法來測試、設定或清除指定數據流上的類型。 應用程式必須完整指定類型。 DMO 會驗證是否可以接受建議的類型。 答案可能取決於已在其他數據流上設定的類型。 DMO_SET_TYPEF_CLEAR旗標會清除數據流的類型,讓應用程式可以「退後」並嘗試另一個組合。
範例案例
下列範例說明一些典型案例,以說明上一節中提出的要點。
- 視訊譯碼器。 在典型的視訊譯碼器中,輸入類型部分決定輸出類型。 例如,通常這兩個數據流都必須具有相同的幀速率和影像尺寸。 在設定輸入類型之前,一個選項不會定義任何慣用的輸出類型。 另一個選項是列舉一組不完整的類型,省略格式區塊。 使用子類型來表示支援的未壓縮類型,例如16位 RGB、24 位 RGB 等等。 此外,視訊譯碼器通常不支援在輸入類型之前設定輸出類型。 一般案例是從已知的輸入格式譯碼,因此這項限制是合理的。
- 音訊譯碼器。 音訊譯碼器可能支援一組有限的固定輸出格式。 在此情況下,在已知輸入格式之前,它或許可以建立慣用輸出格式的清單。
- 壓縮機。 在大部分情況下,除非應用程式設定輸入格式,否則視訊壓縮器無法完整指定其慣用的輸出格式,反之亦然。 相反地,DMO 應該傳回沒有格式區塊的不完整類型。 針對音訊和視訊壓縮,應用程式通常需要設定各種輸出參數,例如比特率。 不過,在設定輸入類型之後,壓縮機應該至少傳回一個完整的輸出類型,原因先前所述。
相關主題