方案处理程序和Byte-Stream处理程序

本主题介绍源解析程序如何创建媒体源的内部详细信息。 如果要为 Media Foundation 实现自定义媒体源,并且希望通过源解析程序向应用程序提供媒体源,请阅读本主题。

源解析程序可以从 URL 或字节流 ((即 IMFByteStream 指针) )创建媒体源。 为此,它使用称为 处理程序的帮助程序对象。 对于 URL,源解析程序使用 方案处理程序。 对于字节流,它使用 字节流处理程序

方案处理程序采用 URL 作为输入,并创建媒体源或字节流。 如果创建字节流,则源解析程序会将该流传递给字节流处理程序,后者将创建媒体源。 下图演示了此过程。

显示源解析过程的示意图

方案处理程序

当应用程序调用 IMFSourceResolver::CreateObjectFromURL 或其异步等效项 BeginCreateObjectFromURL 时,将使用方案处理程序。

源解析程序在注册表中查找方案处理程序。 方案处理程序按 URL 方案在以下键下列出:

HKEY_CURRENT_USER
   Software
      Microsoft
         Windows Media Foundation
            SchemeHandlers
               <scheme>
                  {00000000-0000-0000-0000-000000000000} = REG_SZ
HKEY_LOCAL_MACHINE
   Software
      Microsoft
         Windows Media Foundation
            SchemeHandlers
               <scheme>
                  {00000000-0000-0000-0000-000000000000} = REG_SZ

其中 <scheme> 是处理程序要分析的 URL 方案。 方案包括尾随“:”字符;例如“http:”。

若要注册新的方案处理程序,请添加一个条目,其名称为方案处理程序的 CLSID,采用规范字符串形式: {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}。 条目的值是包含处理程序的简短说明的字符串 (REG_SZ) ,例如“我的方案处理程序”。条目的重要部分是 CLSID。 源解析程序通过使用此 CLSID 调用 CoCreateInstance 来创建处理程序。

方案处理程序公开 IMFSchemeHandler 接口。 如果源解析程序找到与 URL 方案匹配的方案处理程序,则源解析程序调用 IMFSchemeHandler::BeginCreateObject,传入原始 URL。 方案处理程序将打开 URL 并尝试分析内容。 此时,方案处理程序有两个选项:

  • 创建媒体源。
  • 创建字节流。

如果它创建媒体源,则源解析程序会将媒体源返回到应用程序。 如果创建字节流,则源解析程序会尝试查找适当的字节流处理程序,如下一部分所述。

Byte-Stream处理程序

当应用程序调用 IMFSourceResolver::CreateObjectFromByteStream 或其异步等效项 BeginCreateObjectFromByteStream 时,将使用字节流处理程序。 方案处理程序返回字节流时也使用它们,如前所述。

与方案处理程序一样,字节流处理程序在注册表中列出。 它们按文件扩展名或 MIME 类型列出, (或两者都) ,在以下键下列出:

HKEY_CURRENT_USER
   Software
      Microsoft
         Windows Media Foundation
            ByteStreamHandlers
               <ExtensionOrMimeType>
                  {00000000-0000-0000-0000-000000000000} = REG_SZ
HKEY_LOCAL_MACHINE
   Software
      Microsoft
         Windows Media Foundation
            ByteStreamHandlers
               <ExtensionOrMimeType>
                  {00000000-0000-0000-0000-000000000000} = REG_SZ

其中 <ExtensionOrMimeType> 是文件扩展名或 MIME 类型。 文件扩展名包括初始的“.”字符;例如“.wmv”。

文件扩展名是应用程序提供的 URL 的一部分。 MIME 类型可以通过字节流上的 MF_BYTESTREAM_CONTENT_TYPE 属性获得。

若要注册新的字节流处理程序,请以规范字符串形式添加名称为处理程序 CLSID 的条目。 条目的值是包含处理程序的简短说明的字符串 (REG_SZ) ,例如“我的Byte-Stream处理程序”。源解析程序调用 CoCreateInstance 以从 CLSID 创建处理程序。 可以在多个扩展或 MIME 类型下注册相同的处理程序。

字节流处理程序公开 IMFByteStreamHandler 接口。 如果源解析程序找到匹配的字节流处理程序,它将调用 IMFByteStreamHandler::BeginCreateObject。 此方法的输入是指向字节流的指针,以及原始 URL(如果可用)。 字节流处理程序从字节流读取,直到分析足够的数据来创建媒体源。

源冲突解决程序