创建 ASF 文件接收器

ASF 文件接收器是媒体基础提供的 IMFMediaSink 的实现,应用程序可以使用该实现将 ASF 媒体数据存档到文件中。 有关 ASF 媒体接收器的对象模型和一般用法的信息,请参阅 ASF 媒体接收器

有两种方法可以创建 ASF 文件接收器的实例。 可以调用 MFCreateASFMediaSinkMFCreateASFMediaSinkActivate

如果调用 MFCreateASFMediaSink,则必须为输出文件指定字节流,接收器将在编码会话期间写入 ASF 内容。 指定的字节流必须具有可查找和可写功能,否则 MFCreateASFMediaSink 调用将失败并显示E_FAIL错误代码。 此调用创建进程内文件接收器对象,并返回指向文件接收器的 IMFMediaSink 接口的指针。

如果调用 MFCreateASFMediaSinkActivate,则必须指定文件接收器将向其写入媒体数据的输出文件的 URL。 在这种情况下,文件接收器在内部创建字节流。 函数返回指向文件接收器的 IMFActivate 接口的指针。 功能

当编码拓扑设计如下时,请考虑 MFCreateASFMediaSinkActivate 而不是 MFCreateASFMediaSink

  • 编码拓扑适用于受保护媒体路径 (PMP) ,文件接收器用于进程外。

  • 拓扑的输出节点是使用返回的指向文件接收器的激活对象的指针创建的,应用程序将按流号跟踪文件接收器中的流。

    注意

    可以通过调用 IMFActivate::ActivateObject 来激活文件接收器。 但是,无需明确激活 对象。 媒体会话跟踪激活对象,并在编码会话期间自动激活文件接收器。

     

  • 流信息在 ContentInfo 对象中配置。 下一个子部分中的剖面。

创建 ASF 文件接收器后,必须在生成拓扑之前对其进行配置。 文件接收器需要知道以下信息才能生成输出文件。

  • 基本流信息
  • 编码模式信息
  • 元数据

文件接收器实现 ASF ContentInfo 对象 并公开 IMFASFContentInfo 接口,以便应用程序可以使用它来设置与流和编码相关的信息。 根据调用以创建文件接收器的函数,可通过两种方法获取对 IMFASFContentInfo 接口的引用。

  • 如果调用 MFCreateASFMediaSink 函数,则应用程序必须通过在返回的文件接收器上调用 IMFMediaSink::QueryInterface 来查询 IMFASFContentInfo 接口。
  • 如果选择调用 MFCreateASFMediaSinkActivate,此函数希望在调用之前具有完全配置的 ContentInfo 对象。 为此,需要通过调用 MFCreateASFContentInfo 来创建一个空的 ContentInfo 对象,然后使用所有必需的信息对其进行配置。 将配置的 ContentInfo 对象传递给 MFCreateASFMediaSinkActivate ,以接收指向接收器激活对象的指针。 不能通过使用返回的激活对象激活文件接收器,然后更改任何流或编码信息。

有关配置接收器流和特定属性的信息,请参阅以下主题:

ASF 媒体接收器

管道层 ASF 组件

媒体基础中的 ASF 支持