关于 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 Media 格式 SDK)中使用的格式结构相比,属性具有多种优势。
表示“不知道”或“不在乎”值更容易。 例如,如果你正在编写视频转换,你可能事先知道转换支持的 RGB 和 YUV 格式,但不知道视频帧的尺寸,直到你从视频源获取它们。 同样,你可能不关心某些详细信息,例如视频初选。 使用格式结构时,每个成员都必须填充 一些 值。 因此,使用零来指示未知值或默认值已变得很常见。 如果另一个组件将零视为合法值,这种做法可能会导致错误。 使用属性时,只需省略未知或与组件无关的属性。
随着要求随时间的变化,通过在结构末尾添加其他数据来扩展格式结构。 例如, WAVEFORMATEXTENSIBLE 扩展 了 WAVEFORMATEX 结构。 这种做法容易出错,因为组件必须将结构指针强制转换为其他结构类型。 可以安全地扩展属性。
已定义相互不兼容的格式结构。 例如,DirectShow 定义 VIDEOINFOHEADER 和 VIDEOINFOHEADER2 结构。 属性彼此独立设置,因此不会出现此问题。
相关主题