如何为 Two-Pass Windows Media 编码创建拓扑

管道层上的某些 Windows Media 编码器和媒体基础支持双重编码模式。 应用程序必须配置和设置类似于单次编码的编码拓扑,但在 2 次传递编码模式下,应用程序必须运行编码会话两次。 在第一次传递时,编码器收集有关流内容的信息。 在第二次传递时,通过使用在第一次传递上收集的信息,生成最终输出文件。 通过两次处理流的样本,双传递编码可优化编码过程并生成更高质量的编码文件。 无法对实时流使用双传递编码模式。

Media Foundation 支持以下双通编码模式:

为双传递编码构建编码拓扑类似于单传递模式。 以下列表显示了主要差异。

  • 编码器配置必须包括设置为 2 的 MFPKEY_PASSESUSED 属性和设置为 VARIANT_TRUE 的 MFPKEY_VBRENABLED 属性。 这会将编码器的功能筛选为双传递模式。 如果使用激活对象,请将这些属性传递给 MFCreateWMAEncoderActivateMFCreateWMVEncoderActivate
  • 对于第一次传递,请在输出节点中使用虚拟媒体接收器,因为在此传递中生成的样本不会添加到最终文件。
  • 对于第二次传递,请在编码器中查询所需的后编码属性,并将虚拟媒体接收器节点替换为设置了这些属性的 ASF 媒体接收器。

有关设置编码拓扑的详细信息,请参阅 教程:单通道 Windows Media 编码

以下过程总结了使用双传递编码模式在 ASF 容器中对 Windows Media 内容进行编码的步骤。

  1. 使用源解析程序为指定的 创建媒体源。

  2. 枚举媒体源中的流。

  3. 创建 ASF 媒体接收器,并根据需要编码的媒体源中的流添加流接收器。

  4. 创建媒体接收器。

  5. 为输出文件中的流创建 Windows Media 编码器。

  6. 使用 2-pass 编码属性配置编码器。

  7. 通过连接源、编码器和媒体接收器来生成部分编码拓扑。

  8. 实例化媒体会话并在媒体会话上设置拓扑。

  9. 通过控制媒体会话并从媒体会话获取所有相关事件来运行第一个编码传递。

  10. 关闭并关闭编码会话。

  11. 根据编码类型查询编码器中的以下属性:

    编码类型 属性名称
    不受约束的可变比特率编码 MFPKEY_PASSESUSED
    MFPKEY_VBRENABLED
    MFPKEY_BAVG
    MFPKEY_RAVG
    受峰值约束的可变比特率编码 MFPKEY_PASSESUSED
    MFPKEY_VBRENABLED
    MFPKEY_BAVG
    MFPKEY_RAVG
    MFPKEY_BMAX
    MFPKEY_RMAX

     

  12. 创建 ASF 文件接收器,并根据要包含在最终输出文件中的流添加所需的流接收器。

  13. 在文件接收器上设置步骤 11 中检索到的编码器属性。

  14. 将输出节点中的媒体接收器替换为新创建的文件接收器。

  15. 实例化媒体会话,并在媒体会话上设置更新的拓扑。

  16. 通过控制媒体会话并从媒体会话获取所有相关事件来运行第二个编码传递。

  17. 等待媒体会话中的 MEEndOfPresentation 事件,并在事件处理程序中从编码器获取编码属性值,并在文件接收器上设置它们。 有关详细信息,请参阅 教程:单通道 Windows 媒体编码中的“更新文件接收器中的编码属性”。

  18. 关闭并关闭编码会话。

管道层 ASF 组件