DMO 媒体类型

[与此页面关联的功能 DirectShow 是一项旧功能。 它已被 MediaPlayerIMFMediaEngine媒体基金会中的音频/视频捕获取代。 这些功能已针对Windows 10和Windows 11进行了优化。 Microsoft 强烈建议新代码尽可能使用 MediaPlayerIMFMediaEngineMedia Foundation 中的音频/视频捕获 ,而不是 DirectShow。 如果可能,Microsoft 建议重写使用旧 API 的现有代码以使用新 API。]

媒体类型描述与媒体数据流关联的格式。 本文介绍 DDO 如何处理媒体类型。 它主要用于编写自己的自定义 D 莫的开发人员。

使用 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 支持的main类型。 该注册表项对输入和输出类型具有单独的键,但不区分各个流。

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