關於 Microsoft Media Foundation) 的媒體類型 (

媒體類型描述媒體資料流程的格式。 在 Microsoft Media Foundation 中,媒體類型是以 IMFMediaType 介面表示。 這個介面會繼承 IMFAttributes 介面。 媒體類型的詳細資料會指定為屬性。

若要建立新的媒體類型,請呼叫 MFCreateMediaType 函式。 此函式會傳回 IMFMediaType 介面的指標。 媒體類型一開始沒有屬性。 若要設定格式的詳細資料,請設定相關的屬性。

如需媒體類型屬性的清單,請參閱 媒體類型屬性

主要類型和子類型

任何媒體類型的兩個重要資訊片段是主要類型和子類型。

  • 主要類型是 GUID,定義媒體資料流程中資料的整體類別。 主要類型包括視訊和音訊。 若要指定主要類型,請設定 MF_MT_MAJOR_TYPE 屬性。 IMFMediaType::GetMajorType方法會傳回此屬性的值。
  • 子類型會進一步定義格式。 例如,在視訊主要類型中,RGB-24、RGB-32、YUY2 等等都有子類型。 在音訊中,有 PCM 音訊、IEEE 浮點音訊等等。 子類型提供比主要類型更多的資訊,但不會定義格式的所有專案。 例如,視訊子類型不會定義影像大小或畫面播放速率。 若要指定子類型,請設定 MF_MT_SUBTYPE 屬性。

所有媒體類型都應該有主要類型 GUID 和子類型 GUID。 如需主要類型和子類型 GUID 的清單,請參閱 媒體類型 GUID

為何屬性?

屬性具有數個優點,優於先前技術中使用的格式結構,例如 DirectShow 和 Windows 媒體格式 SDK。

  • 表示「不知道」或「不小心」值比較容易。 例如,如果您要撰寫視訊轉換,您可能事先知道轉換支援哪些 RGB 和 YUV 格式,但不是視訊畫面的維度,直到您從視訊來源取得它們為止。 同樣地,您可能不在意特定詳細資料,例如影片主要資料。 使用格式結構時,每個成員都必須填入 一些 值。 因此,通常會使用零來表示未知或預設值。 如果另一個元件將零視為合法值,這個做法可能會造成錯誤。 使用屬性時,您只需省略與元件無關或未知的屬性。

  • 隨著需求隨著時間而變更,在結構結尾新增其他資料來擴充格式結構。 例如, WAVEFORMATEXTENSIBLE 會擴充 其其 STRUCTUREATEX 結構。 這個做法很容易發生錯誤,因為元件必須將結構指標轉換成其他結構類型。 屬性可以安全地擴充。

  • 已定義相互不相容的格式結構。 例如,DirectShow 會定義 VIDEOINFOHEADERVIDEOINFOHEADER2 結構。 屬性會彼此獨立設定,因此不會發生此問題。

媒體類型屬性

媒體類型