创建和配置 ASF 流

每个 ASF 文件都包含一个或多个流。 ASF 配置文件对象表示 ASF 流的集合。 若要进行 ASF 编码,必须创建和配置要编码的流。

应用程序可以使用 ASF 配置文件对象执行以下任务:

  • 添加或删除流。
  • 获取流的配置设置。
  • 配置有效负载扩展。
  • 添加、删除或修改 ASF 互斥对象。

本主题包含以下各节:

创建新流

ASF 配置文件对象必须包含至少一个 ASF 流的配置设置。 每个流都由一个流配置对象表示,该对象公开 IMFASFStreamConfig 接口。 流配置对象中的信息对应于 ASF 文件头中的流属性对象和扩展流属性对象。 (请参阅 ASF 文件结构。)

若要将流添加到 ASF 配置文件,请执行以下步骤:

  1. 创建一个空流配置对象。
  2. 根据应用程序的要求配置流。
  3. 将流添加到配置文件。

若要为配置文件创建流,请调用 IMFASFProfile::CreateStream 创建一个空流配置对象并接收 ppIStream 参数中的指针。 CreateStream 需要知道要创建的流的类型。 ASF 文件中最常用的流类型是音频和视频流。 在媒体基础中,流类型由公开 IMFMediaType 接口的媒体类型对象表示。 媒体类型的主要类型定义数字媒体流的类别,例如音频或视频。 子类型定义主要类型的格式。 可以使用流配置对象更改由 CreateStream 设置的初始媒体类型。 若要检索流的媒体类型,请调用 IMFASFStreamConfig::GetMediaType 或检索主要类型调用 IMFASFStreamConfig::GetStreamType 可以通过调用 IMFASFStreamConfig::SetMediaType,将流的初始媒体类型替换为新的已配置媒体类型。

如果应用程序通过调用 MFCreateASFProfileFromPresentationDescriptor 从有效的演示描述符创建配置文件, 该函数将自动为每个流设置流配置对象,并在配置文件上设置它们。 流媒体类型基于与演示描述符关联的流描述符进行设置。

分配流编号

必须为所有类型的流分配一个流编号。 流编号不需要按顺序分配,但必须介于 1 到 127 的范围内。 若要分配流编号,请调用 IMFASFStreamConfig::SetStreamNumber 若要获取流编号调用,请调用 FASFStreamConfig::SetStreamNumber

注意

流编号不同于流索引,后者在使用 IMFASFProfile::GetStream 获取配置文件中的流时使用。 流索引是由配置文件对象分配给流的编号。 流索引范围介于 0 到 IMFASFProfile::GetStreamCount 检索到的流编号减 1 之间。 还可以通过调用 IMFASFProfile::GetStreamByNumber,按流编号从配置文件中获取流。

 

设置泄漏存储桶值

表示流的每个流配置对象必须具有关联的泄漏存储桶值、比特率和缓冲区窗口值。

这些值通过 MF_ASFSTREAMCONFIG_LEAKYBUCKET1 属性和 MF_ASFSTREAMCONFIG_LEAKYBUCKET2 属性提供给应用程序。 对于文件编码,实际值取决于编码的类型,由编码器决定。 如果已配置编码器,并且已在编码器上设置输出类型,则应用程序必须查询编码器以获取泄漏存储桶参数并设置这些属性中的值。

如果使用管道层组件并配置 ASF 媒体接收器的流,很可能没有已配置的编码器。 在这种情况下,必须查询编码器媒体后类型协商,并在 ASF 媒体接收器的属性存储的 MFPKEY_ASFSTREAMSINK_CORRECTED_LEAKYBUCKET 属性中设置更新的值。 编码属性存储是通过与配置文件关联的 ContentInfo 对象检索的。 更新的值将自动反映在流的泄漏存储桶属性值中。 有关泄漏存储桶以及如何从编码器获取泄漏存储桶值的常规信息,请参阅泄漏存储桶缓冲区模型

有效负载扩展

流的媒体数据由 ASF 多路复用器作为媒体样本添加到 ASF 数据对象。 这些媒体示例可以包含有效负载扩展数据:SMPTE 时间代码数据、非方形像素纵横比、样本持续时间以及视频关键帧(如果样本包含)。 有关支持的有效负载扩展类型的列表,请参阅 ASF 有效负载扩展 GUID

必须将流配置为接受有效负载扩展,以便在样本生成期间,多路复用器可以将补充数据添加到该流的每个样本中。

若要获取在流上设置的有效负载扩展总数,请调用 IMFASFStreamConfig::GetPayloadExtensionCount,然后通过调用 IMFASFStreamConfig::GetPayloadExtension 枚举列表。 若要为流添加有效负载扩展,请调用 IMFASFStreamConfig::AddPayloadExtension 这将向为流生成的单个媒体样本添加补充数据。

若要删除与流关联的现有有效负载扩展,请调用 IMFASFStreamConfig::RemoveAllPayloadExtensions

将流添加到配置文件

配置流后,调用 IMFASFProfile::SetStream 将流添加到配置文件。

若要删除配置文件中的现有流,请调用 IMFASFProfile::RemoveStream

必须通过调用 IMFASFContentInfo::SetProfile 在 ContentInfo 对象上设置已配置的配置文件。 如果更改现有流,则必须再次将其添加到配置文件,然后在 ContentInfo 对象上设置配置文件。

ASF 配置文件

媒体基础中的 ASF 支持

WMContainer ASF 组件