Share via


DMO 媒體類型

[與此頁面相關的功能 DirectShow是舊版功能。 它已被 MediaPlayerIMFMediaEngineMedia Foundation 中的音訊/視訊擷取取代。 這些功能已針對Windows 10和Windows 11進行優化。 Microsoft 強烈建議新程式碼盡可能使用 MediaPlayerIMFMediaEngine音訊/視訊擷取 ,而不是 DirectShow。 Microsoft 建議使用舊版 API 的現有程式碼盡可能重寫為使用新的 API。

媒體類型描述與媒體資料流程相關聯的格式。 本文說明 DMO 如何處理媒體類型。 它主要適用于撰寫自己的自訂 DMO 的開發人員。

媒體類型是使用 DMO_MEDIA_TYPE 結構來定義。 此結構包含下列資訊:

  • 主要類型是全域唯一識別碼 (GUID) ,可定義廣泛的類別,例如音訊或視訊。
  • 子類型是一種 GUID,可定義類型的更特定層面。 例如,在影片中,子類型包括 16 位 RGB、24 位 RGB、UYVY、DV 編碼視訊等等。
  • 格式區塊是完整指定格式的次要結構。 格式區塊的配置取決於資料類型。 例如,PCM 音訊會使用 WAVEFORMATEX 結構。 影片會使用各種其他結構,包括 VIDEOINFOHEADERVIDEOINFOHEADER2。 格式區塊的配置是由格式類型 GUID 來識別。 例如,FORMAT_WaveFormatEx會指定 一個 WAVEFORMATEX 結構。

第一次建立 DMO 時,資料流程沒有媒體類型。 在 DMO 可以處理任何資料之前,用戶端必須為每個資料流程設定媒體類型。 從用戶端在 DMO 上設定媒體類型的觀點來看,會說明此程式。

登錄中的媒體類型

DMO 可以藉由呼叫 DMORegister 函式,將它支援的媒體類型清單新增至登錄。 應用程式可以使用這項資訊來搜尋符合特定格式的 DMO。 登錄中的資訊並非完整。 一般而言,您只會包含 DMO 支援的主要類型。 登錄專案具有輸入和輸出類型的個別索引鍵,但不會區分個別資料流程。

DMORegister函式會使用DMO_PARTIAL_MEDIATYPE結構來描述媒體類型。 這個結構包含 DMO_MEDIA_TYPE 結構中找到的資訊子集,也就是主要類型和子類型。 它不包含格式區塊,因為格式區塊通常會包含太細微而無法包含在登錄中的資訊,例如視訊影像的高度和寬度。

慣用媒體類型

應用程式建立 DMO 之後,它可以查詢 DMO 中支援的媒體類型。 針對每個資料流程,DMO 會建立一份媒體類型清單, (可能是空的) ,依喜好設定順序排序。 IMediaObject::GetInputTypeIMediaObject::GetOutputType方法會列舉慣用的類型。 當應用程式在其他資料流程上設定媒體類型時,資料流程的慣用類型可能會動態變更。 例如,設定輸入類型之後,慣用的輸出類型清單可能會變更,反之亦然。 不過,DMO 不需要動態更新其慣用的類型。 應用程式無法假設接收的每個類型都是有效的。 基於這個理由, IMediaObject::SetInputTypeIMediaObject::SetOutputType 方法支援旗標來測試特定類型。

GetInputTypeGetOutputType方法都會傳回DMO_MEDIA_TYPE結構。 DMO 可以將此結構中的部分資訊保留空白,以指出一系列的類型。 主要類型或子類型可以是GUID_Null,而格式區塊可以是空的 (零個位元組) 。 如果格式區塊是空的,則格式類型必須GUID_Null。

在應用程式設定所有 DMO 的輸入類型之後,DMO 通常應該為每個輸出資料流程傳回至少一個完整類型。 完整的輸出類型有助於測試,而應用程式可以使用它作為合理的預設值。 DMO 測試應用程式依賴此行為。 (請參閱 使用 DMOTest Application.)

設定媒體類型

應用程式會使用 SetInputTypeSetOutputType 方法,在指定的資料流程上測試、設定或清除類型。 應用程式必須完整指定類型。 DMO 會驗證它是否可以接受建議的類型。 答案可能取決於已在其他資料流程上設定的類型。 DMO_SET_TYPEF_CLEAR旗標會清除資料流程的類型,讓應用程式可以「返回」並嘗試另一個組合。

示範案例

下列範例描述一些典型的案例,以說明上一節中所做的重點。

  • 影片解碼器。 在典型的視訊解碼器中,輸入類型部分決定輸出類型。 例如,這兩個數據流通常必須具有相同的畫面播放速率和影像尺寸。 在設定輸入類型之前,一個選項不會定義任何慣用的輸出類型。 另一個選項是列舉一組不完整的類型,省略格式區塊。 使用子類型來指出支援的未壓縮類型,例如 16 位 RGB、24 位 RGB 等等。 此外,影片解碼器通常不支援在輸入類型之前設定輸出類型。 一般案例是從已知的輸入格式解碼,因此這項限制是合理的。
  • 音訊解碼器。 音訊解碼器可能支援一組有限的固定輸出格式。 在此情況下,在已知輸入格式之前,它可能會建立慣用輸出格式的清單。
  • 壓縮機。 在大部分情況下,視訊壓縮程式無法在應用程式設定輸入格式之前完整指定其慣用的輸出格式,反之亦然。 相反地,DMO 應該傳回沒有格式區塊的不完整類型。 針對音訊和視訊壓縮,應用程式通常需要設定各種輸出參數,例如位元速率。 不過,在設定輸入類型之後,由於先前提及的原因,壓縮器應該至少傳回一個完整的輸出類型。

撰寫 DMO