PMP 媒体会话

应用程序可以在名为 受保护的媒体路径(PMP)进程的单独进程中创建 媒体会话。 PMP 过程的主要目的是使用数字权限管理(DRM)启用对受保护内容的播放。 默认情况下,PMP 进程在受保护的环境(PE)内创建。 只有受信任的签名组件才能在 PE 中加载。 PMP 进程的次要好处是,它将应用程序进程与媒体管道隔离开来。 有关 PMP 过程的详细信息,请参阅 受保护的媒体路径

若要在 PMP 进程中创建媒体会话,请调用 MFCreatePMPMediaSession 函数。 (可选)可以传入 MFPMPSESSION_UNPROTECTED_PROCESS 标志。 如果设置了此标志,则 PMP 进程在未受保护的进程中创建,而不是 PE 进程。 不受保护的进程不能用于 DRM 播放,但确实为你提供了进程隔离的好处。

MFCreatePMPMediaSession 函数返回指向媒体会话的代理对象的指针。 应用程序通过代理与媒体会话通信。

pmp 进程内媒体会话的插图

默认情况下,当应用程序创建拓扑时,会在应用程序进程中创建媒体源。 在 PMP 进程中创建媒体源的代理。 媒体源可以使用 IMFPMPHost 接口在 PMP 进程中创建对象。 例如,为了支持 DRM,媒体源会创建一个名为 输入信任机构(ITA)的对象。 必须在 PMP 进程中创建 ITA。 (有关 ITA 的详细信息,请参阅 受保护的媒体路径。)若要使用 IMFPMPHost 接口,请执行以下作:

  1. 媒体源必须实现 IMFPMPClient 接口。
  2. 在拓扑解析过程中,媒体会话代理在媒体源上调用 IMFPMPClient::SetPMPHost 方法。
  3. 媒体源调用 IMFPMPHost::CreateObjectByCLSID 在 PMP 进程中创建对象。 该对象必须具有已注册的 CLSID。 此外,若要在 PE 内部加载,对象必须受信任且经过数字签名。 有关对受保护的媒体组件进行代码签名的信息,请参阅 Windows Vista 中受保护媒体组件的白皮书 代码签名

下图显示了在应用程序过程中创建的媒体源。

应用程序过程中媒体源的插图。

另一种替代方法是在 PMP 会话中创建媒体源。

  1. 创建媒体会话时设置 MF_SESSION_REMOTE_SOURCE_MODE 属性。 配置属性是在 MFCreatePMPMediaSession 函数的 pConfiguration 参数中指定的。

  2. 在媒体会话上调用 MFGetService,以获取指向 IMFPMPHost 接口的指针。 服务标识符 MF_PMP_SERVICE

  3. 使用类标识符 CLSID_MFSourceResolver 调用 IMFPMPHost::CreateObjectByCLSID,以在 PMP 进程中创建源解析程序。 该方法返回指向源解析程序的代理的指针。

  4. 调用 IMFSourceResolver::BeginCreateObjectFromURLIMFSourceResolver::BeginCreateObjectFromByteStream 来创建媒体源。

    注意

    在这种情况下,必须使用这些方法的异步版本,因为同步版本不可远程处理。

     

下图显示了 PMP 进程中创建的媒体源。

pmp 进程中媒体源的插图。

如何播放受保护的媒体文件

媒体会话

受保护的媒体路径