关于媒体会话

媒体会话公开 IMFMediaSession 接口。 有两种方法可以创建媒体会话,具体取决于应用程序是否支持受保护的内容:

  • 如果应用程序不支持受保护的内容,可以通过调用 MFCreateMediaSession 来创建媒体会话。 此函数在应用程序进程内创建媒体会话。
  • 若要支持受保护的内容,请通过调用 MFCreatePMPMediaSession 创建媒体会话。 此函数在受保护的媒体路径 (PMP) 进程中创建媒体会话。 应用程序接收指向代理对象的指针,该代理对象跨进程边界封送方法调用。 请注意,PMP 媒体会话可用于播放清晰的内容以及受保护的内容。

使用媒体会话的任何应用程序都将遵循以下常规步骤:

  1. 创建拓扑。
  2. 通过调用 IMFMediaSession::SetTopology 将媒体会话上的拓扑排队。
  3. 通过调用 IMFMediaSession::StartIMFMediaSession::P auseIMFMediaSession::Stop 来控制数据流。
  4. 在应用程序退出之前,调用 IMFMediaSession::Close 以关闭媒体会话。
  5. 通过调用 IMFMediaSource::Shutdown 关闭应用程序创建的任何媒体源。
  6. 通过调用 IMFMediaSession::Shutdown 关闭媒体会话。

使用媒体会话时,应用程序不应直接启动、暂停或停止媒体源。 所有状态更改都必须通过调用 IMFMediaSession 方法启动。 媒体源中的状态更改由媒体会话处理。

许多其他详细信息将取决于应用程序的特定功能。

受保护内容

若要播放受保护的内容,必须通过调用 MFCreatePMPMediaSession 在受保护媒体路径 (PMP) 内创建媒体会话。 此函数在 PMP 中创建媒体会话的实例,并返回指向代理对象的指针,该对象跨进程边界封送接口。

在大多数情况下,在 PMP 中使用媒体会话对应用程序是透明的。 但是,应用程序可能需要调用使用户能够播放内容的某些操作。 例如,用户可能需要获取 DRM 许可证。 媒体基础使用 IMFContentEnabler 接口定义这些操作的通用机制。

有关详情,请参阅以下主题:

演示文稿时钟

媒体会话管理演示时钟的所有方面:

  • 创建演示文稿时钟。

  • 选择时间源。

  • 通知媒体接收器有关时钟的信息

  • 根据需要启动、停止和暂停时钟。

  • 关闭时钟。

若要获取指向演示时钟的指针,请在媒体会话上调用 IMFMediaSession::GetClock 。 在媒体会话发送带有MF_TOPOSTATUS_READY标志的 MESessionTopologyStatus 事件之前,演示时钟不会返回有效时间。 在此之前, GetClock 将返回MF_E_CLOCK_NO_TIME_SOURCE。

使用媒体会话的应用程序绝不应启动、停止或暂停演示时钟;更改时钟速率;或关闭时钟。

当应用程序调用 IMFMediaSession::Start 时,媒体会话将启动表示时钟,其起始时间等于 Start 方法中指定的起始位置。 有关媒体会话的详细信息,请参阅 媒体会话

媒体会话