Sequencer 源事件
当 Sequencer Source 播放一系列文件时,媒体会话通常会发送在正常播放期间发送的所有相同事件,这些事件列在 媒体会话事件中。 应用程序使用媒体会话的 IMFMediaEventGenerator 接口获取这些事件。
此外,还有一些特定于播放列表段的事件。
事件 | 说明 |
---|---|
MENewPresentation | 向应用程序发出预滚动下一个拓扑的信号。 为了在两个连续的演示文稿之间提供无缝转换,排序器源会提前加载下一个拓扑。 当活动拓扑仍在播放时,只要源中存在可用的后续拓扑,排序器源就会为下一个拓扑发送此事件。 此事件的此事件数据是下一个拓扑的表示描述符。 应用程序负责在媒体会话上设置相应的拓扑,如 使用 Sequencer 源中所述。 |
MEEndOfPresentationSegment | 当媒体会话播放完当前段(如果该段后跟另一段)时,序列器源将引发此事件。 (如果当前段是最后一个段,则 sequencer 源将改为引发 MEEndOfPresentation 事件。) 媒体会话将此事件转发到应用程序。 通常,在媒体会话开始处理下一段之后,应用程序会收到 MEEndOfPresentationSegment ,但媒体接收器仍在为上一段提供样本。 |
MESessionTopologyStatus,状态 MF_TOPOSTATUS_SINK_SWITCHED。 | 媒体会话在转换到排序器源中的下一个拓扑并且媒体接收器已完成播放上一个拓扑时引发此事件。 此事件包含指向下一个拓扑的指针。 |
示例 1:在不跳过的情况下播放
当涉及 Sequencer 源时,从媒体会话获取的事件数可能会令人困惑,特别是因为与一个段关联的事件通常与下一段的事件交错。
在第一个示例中,应用程序将三个段(S1、S2 和 S3)排队。 第三个段具有 SequencerTopologyFlags_Last 标志,表示它是序列中的最后一个段。 每个事件对应的段在括号中提供。 还会列出应用程序的 SetTopology 调用,以使操作顺序更清晰。
- 应用程序调用 IMFMediaSession::SetTopology (S1)
- MESessionTopologySet (S1)
- MESessionTopologyStatus: MF_TOPOSTATUS_READY (S1)
- MENewPresentation (S2 预滚动)
- 应用程序调用 IMFMediaSession::SetTopology (S2)
- MESessionTopologyStatus: S1) (开始MF_TOPOSTATUS_STARTED_SOURCE
- MESessionTopologySet (S2)
- MEEndOfPresentationSegment (S1) 结束
- MESessionTopologyStatus: MF_TOPOSTATUS_ENDED (S1)
- MESessionTopologyStatus: MF_TOPOSTATUS_SINK_SWITCHED (过渡到 S2)
- MESessionTopologyStatus: MF_TOPOSTATUS_READY (S2)
- MESessionTopologyStatus: S2) 开始MF_TOPOSTATUS_STARTED_SOURCE (
- MENewPresentation (S3 预滚动)
- 应用程序调用 IMFMediaSession::SetTopology (S2)
- MESessionTopologySet (S3)
- MEEndOfPresentationSegment (S2) 结束
- MESessionTopologyStatus: MF_TOPOSTATUS_ENDED (S2)
- MESessionTopologyStatus: MF_TOPOSTATUS_SINK_SWITCHED (过渡到 S3)
- MESessionTopologyStatus: MF_TOPOSTATUS_READY (S3)
- MESessionTopologyStatus: S3) MF_TOPOSTATUS_STARTED_SOURCE (开始
- MEEndOfPresentation (S3 结尾;最后一段)
- MESessionTopologyStatus: MF_TOPOSTATUS_ENDED
- MESessionEnded
此列表不包括你可能收到的每个事件。 (例如,它省略了每当会话功能更改时发送的 MESessionCapabilitiesChanged 事件。应用程序通常在整个演示文稿中接收多个 MESessionCapabilitiesChanged 事件。) 此处列出的事件显示了从一个段到下一段的转换。 最重要的事件是 MENewPresentation(向应用程序发出预滚动下一个拓扑的信号)和 MEEndOfPresentationSegment,它向除最后一个段) 之外的段 (结束发出信号。
由于 Media Foundation 中的事件是异步的,并且未使用方法调用进行序列化,因此确切顺序可能会有所不同。 例如,在应用程序调用适用于 S2 的 SetTopology 之前,可能会收到 S1 的MF_TOPOSTATUS_STARTED_SOURCE。
此外,可能不会在此处列出每个事件。 例如,除非最后一个段具有SequencerTopologyFlags_Last标志,否则不会发送 MEEndOfPresentation 和 MESessionEnded 事件。
最后,此列表不指示时间的流逝。 从“S1 开始”到“S1 结束”的时间是 S1 的整个持续时间,可能为几秒钟或数小时,具体取决于源。
示例 2:使用段跳过播放
在此示例中,应用程序将相同的段排队,但在播放段 1 时跳到段 3。 在这种情况下,将发送以下事件:
- 应用程序调用 IMFMediaSession::SetTopology (S1)
- MESessionTopologySet (S1)
- MESessionTopologyStatus: MF_TOPOSTATUS_READY (S1)
- MENewPresentation (S2 预滚动)
- 应用程序调用 IMFMediaSession::SetTopology (S2)
- MESessionTopologyStatus: S1) (开始MF_TOPOSTATUS_STARTED_SOURCE
- MESessionTopologySet (S2)
- 应用程序调用 IMFMediaSession::Start (跳到 S3)
- MENewPresentation (S3 预滚动)
- 应用程序调用 IMFMediaSession::SetTopology (S3)
- MESessionStarted
- 已取消 MEEndOfPresentationSegment (S1)
- MESessionTopologyStatus: MF_TOPOSTATUS_ENDED (S1)
- MESessionTopologySet (S3)
- MESessionTopologyStatus: MF_TOPOSTATUS_SINK_SWITCHED (过渡到 S2)
- MESessionTopologyStatus: MF_TOPOSTATUS_READY (S2)
- MESessionTopologyStatus: MF_TOPOSTATUS_STARTED_SOURCE (S2)
- MEEndOfPresentationSegment (S2 已取消)
- MESessionTopologyStatus: MF_TOPOSTATUS_ENDED (S2)
- MESessionTopologyStatus: MF_TOPOSTATUS_SINK_SWITCHED (过渡到 S3)
- MESessionTopologyStatus: TOPOSTATUS_READY (S3)
- MESessionTopologyStatus: MF_TOPOSTATUS_STARTED_SOURCE (S3)
当应用程序调用 Start 跳到段 3 时,排序器源将取消仍在播放的段 1。 此段的 MEEndOfPresentationSegment 事件包含 MF_EVENT_SOURCE_TOPOLOGY_CANCELED 属性,指示段因取消而结束。 然后,由于段 2 已预先滚动,该段将启动,但随后立即取消。 段 2 的 MEEndOfPresentationSegment 事件还包含 MF_EVENT_SOURCE_TOPOLOGY_CANCELED 属性。 然后,会话可以切换到第 3 段并正常播放。
相关主题