生成筛选器图以写入 ASF 文件

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

创建基于 Windows Media 的内容时,应用程序通常使用以下方案之一:

  • 将内容从其他某种格式转换为 Windows 媒体格式或将其转码。
  • 将非基于 Windows 媒体的内容插入 (本机流格式) ASF 文件中。
  • 捕获实时数据并将其立即编码为 Windows 媒体格式。

对 ASF 文件进行转码

可以通过多种方式使用 WM ASF 编写器 生成文件转码筛选器图。 最简单的方法是将 WM ASF 编写器添加到筛选器图,然后使用 IGraphBuilder::RenderFile 方法自动生成图形。

另一种方法是手动将每个筛选器添加到图形并连接引脚。 添加 WM ASF 编写器后,如果默认配置文件不适用,请使用 IConfigAsfWriter 方法对其进行配置,并将 WM ASF 编写器输入引脚连接到上游筛选器上的相应输出引脚。

下图显示了典型的 WM ASF 编写器转码筛选器图配置。

转码筛选器图

将本机流格式插入 ASF 文件

默认情况下,WM ASF 编写器筛选器在其输入引脚上需要未压缩的音频和视频流,并使用 Windows Media Audio 和 Windows Media Video 编解码器来压缩流。 但是,ASF 文件容器可用于任何类型的数据。 通过将数字媒体数据放入 ASF 文件容器中,可以添加 ASF 提供的功能,例如元数据和数字版权管理 (DRM) ,而无需对内容进行转码。

若要创建包含非基于 Windows Media 的内容的 ASF 文件,应用程序必须在 WM ASF 编写器的筛选图上游压缩流,并通过调用 IConfigAsfWriter2::SetParam 绕过 WM ASF 编写器的压缩机制,如下所示:

pConfigAsfWriter2->SetParam(AM_CONFIGASFWRITER_PARAM_DONTCOMPRESS,TRUE,0)

然后使用所需的配置文件配置筛选器。 输入流的媒体类型必须与配置文件中的格式完全匹配。 在某些情况下,可能需要检查输入流的格式,并创建自定义配置文件来匹配它。

将 WM ASF 编写器连接到上游筛选器时,请使用 IGraphBuilder::ConnectDirect 方法。 请勿使用任何“智能连接”方法(如 IGraphBuilder::Connect 或 IGraphBuilder::RenderFile)来连接筛选器,因为这会禁用筛选器的“绕过压缩”模式。

直接从设备捕获到 ASF 文件

将音频或视频直接捕获到 ASF 文件时,筛选器图将如下所示,具体取决于所使用的捕获设备类型。

Windows 媒体视频捕获图

有关创建视频和音频捕获图的详细信息,请参阅以下主题:

除非已连接所有引脚,否则 WM ASF 编写器将不会运行。 如果使用默认系统配置文件配置 WM ASF 编写器, (不建议) 或任何具有音频和视频流的配置文件,则它将为每个流创建一个输入引脚,并且必须连接其中每个引脚。 例如,如果不打算捕获音频,请确保使用仅视频配置文件配置筛选器,以便不创建音频引脚。

在 DirectShow 中创建 ASF 文件