Sequencer 源事件

Sequencer 源 播放一系列文件时,媒体会话通常会发送在正常播放期间发送的所有相同事件,并在 媒体会话事件列出。 应用程序使用媒体会话的 IMFMediaEventGenerator 接口获取这些事件。

此外,还有一些特定于播放列表段的事件。

事件 描述
MENewPresentation 向应用程序发出预注册下一个拓扑的信号。
若要在连续两个演示文稿之间提供无缝转换,序列器源会提前加载下一个拓扑。 当活动拓扑仍在播放时,序列器源会发送此事件以供下一个拓扑使用,前提是源中提供了后续拓扑。
此事件的此事件数据是下一个拓扑的表示描述符。 应用程序负责在媒体会话上设置相应的拓扑,如 使用 Sequencer 源中所述。
MEEndOfPresentationSegment 当媒体会话完成播放当前段(如果该段后跟另一段)时,序列器源将引发此事件。 (如果当前段是最后一段,则序列器源将改为引发 MEEndOfPresentation 事件。
媒体会话将此事件转发到应用程序。 通常,应用程序在媒体会话开始处理下一段后收到 MEEndOfPresentationSegment,但当媒体接收器仍在为上一段提供示例时。
MESessionTopologyStatus,状态为 MF_TOPOSTATUS_SINK_SWITCHED 媒体会话在转换到序列器源和媒体接收器中的下一个拓扑已完成播放以前的拓扑时引发此事件。 此事件包含指向下一个拓扑的指针。

 

示例 1:不跳过播放

涉及序列器源时,从媒体会话获取的事件数可能会令人困惑,特别是因为与一个段关联的事件通常与下一段的事件交错。

在第一个示例中,应用程序将三个段(S1、S2 和 S3)排入队列。 第三个段具有 SequencerTopologyFlags_Last 标志,表示它是序列中的最后一段。 每个事件对应的段在括号中给出。 还会列出应用程序的 SetTopology 调用,以便更清楚地执行作顺序。

此列表不包括可能收到的每个事件。 (例如,它会省略 MESessionCapabilitiesChanged 事件,每当会话功能发生更改时发送该事件。应用程序通常在整个演示文稿中接收多个 MESessionCapabilitiesChanged 事件。此处列出的事件是显示从一个段转换到另一段的事件。 最重要的事件是 MENewPresentation,它指示应用程序预注册下一个拓扑,MEEndOfPresentationSegment,后者指示段的末尾(最后一段除外)。

由于 Media Foundation 中的事件是异步的,并且不是使用方法调用序列化的,因此确切的顺序可能会有所不同。 例如,可以在应用程序调用 S2 SetTopology 之前收到 S1 的 MF_TOPOSTATUS_STARTED_SOURCE

此外,可能不会在此处列出每个事件。 例如,除非最后一段具有 SequencerTopologyFlags_Last 标志,否则不会发送 MEEndOfPresentationMESessionEnded 事件。

最后,此列表不指示时间的流逝。 从“S1 开始”到“S1 结束”的时间是 S1 的整个持续时间,根据源,S1 的持续时间可能是几秒钟或数小时。

示例 2:使用段跳过播放

在此示例中,应用程序对相同的段进行排队,但在第 1 段播放时跳到第 3 段。 在这种情况下,将发送以下事件:

当应用程序调用 开始 跳到段 3 时,序列器源将取消仍在播放的段 1。 此段的 MEEndOfPresentationSegment 事件包含 MF_EVENT_SOURCE_TOPOLOGY_CANCELED 属性,指示该段因取消而结束。 然后,由于段 2 已预先滚动,因此该段已启动,但随后立即取消。 第 2 段的 MEEndOfPresentationSegment 事件还包含 MF_EVENT_SOURCE_TOPOLOGY_CANCELED 属性。 然后,会话可以切换到第 3 段并正常播放。

关于 Sequencer 源

Sequencer 源