在 ContentInfo 对象中设置属性

创建 ASF 文件时,ContentInfo 对象需要知道媒体内容的特征,以便使用正确的值填充各种标头对象。

内容配置设置是包含在配置文件中的流设置,并指定媒体接收器的流标识符、媒体类型和泄漏存储桶参数。 通过调用 IMFASFContentInfo::SetProfile 在 ContentInfo 对象上设置配置文件后,这些值将反映在生成的 ASF 标头对象中。 有关这些设置的信息,请参阅 创建和配置 ASF 流

使用编码器设置配置 ContentInfo 对象

数字媒体音频或视频数据很复杂,占用大量内存。 在大多数情况下,在添加到 ASF 文件之前,将使用编码器压缩音频和视频。 在 Media Foundation 中,编码器实现为 媒体基础转换 (MRT,) 一个输入和输出。 必须根据输入流的媒体类型和压缩流的编码类型选择输出媒体类型。

在编码会话之前,必须根据编码类型设置相关属性来配置编码器。

配置编码器后,必须使用编码器值配置 ContentInfo 对象,因为 ASF 多路复用器和 ASF 媒体接收器(使用填充的 ContentInfo 对象初始化)使用泄漏桶值等设置来生成 ASF 数据包。 这些值不会保存在最终的 ASF 标头对象中。 编码设置以属性的形式公开。 若要使用编码器属性配置 ContentInfo 对象,请执行以下操作:

  1. 通过直接查询 IPropertyStore 接口的编码器 (IMFTransform 接口) ,获取指向编码器属性存储的指针。
  2. 调用 IMFASFContentInfo::GetEncodingConfigurationPropertyStore。 若要设置特定于流的属性,请在 wStreamNumber 参数中指定流标识符;对于文件级属性,请传递 0。 ppIStore 参数接收指向 IPropertyStore 接口的指针。 收到的属性存储为空。
  3. 在编码器上调用 IPropertyStore::GetValue ,并通过指定属性键常量获取属性值。 有关编码属性的完整列表,请参阅 编解码器编程参考
  4. 对 ContentInfo 对象调用 IPropertyStore::SetValue ,以在属性存储中设置所需的属性。
  5. 对要设置的每个属性重复步骤 3 和 4。

可以通过调用 MFCreateASFMediaSinkActivate,使用激活对象创建 ASF 媒体接收器。 新媒体接收器对象基于媒体接收器特定的设置进行配置,这些设置可在 ContentInfo 对象的属性存储中设置。 下表显示了 ASF 媒体接收器属性常量。

属性 说明
MFPKEY_ASFMEDIASINK_BASE_SENDTIME 发送时间指示何时释放泄漏存储桶中的有效负载。 此属性值指示第一次发送时间。 多路复用器使用此值计算生成的数据包的后续发送时间,并确保数据稳定地流经泄漏的存储桶。
MFPKEY_ASFMEDIASINK_AUTOADJUST_BITRATE BOOL 值指示多路复用器是否需要自动调整比特率,以确保数据不会溢出泄漏的存储桶。
MFPKEY_ASFMEDIASINK_DRMACTION 这表示用于文件生成的 ASF 媒体接收器 DRM 操作。 在此版本中,仅支持 DRM 转码。
MFPKEY_ASFSTREAMSINK_CORRECTED_LEAKYBUCKET 当编码器决定要使用的缓冲区窗口和比特率时,必须设置此属性。 若要设置这些值,请使用 IWMCodecLeakyBucket 接口。 必须为 ASF 文件中的每个流设置此值。

 

为新文件编写 ASF 标头对象