序列呈现时间

本主题介绍 Sequencer Source 如何处理播放期间的演示时间。

概述

Sequencer 源支持两种不同的模式:播放列表序列和编辑序列。

在编辑序列中,应用程序在开始播放之前提前指定每个段的持续时间。 在播放列表序列中,应用程序不会提前指定持续时间。 (事实上,持续时间可能未知。)

在这两种情况下,都可以指定段的媒体开始时间和媒体停止时间。 这些时间指定源文件中段开始和结束的位置。 例如,假设源文件的长度为 90 秒。 如果要剪裁前 10 秒和最后 10 秒,可以指定以下值:

  • 媒体启动:10 秒
  • 媒体停止:80 秒

若要指定媒体开始时间,请在源节点上设置 MF_TOPONODE_MEDIASTART 属性。 若要指定媒体停止时间,请在源节点上设置 MF_TOPONODE_MEDIASTOP 属性。

若要创建编辑序列,请在创建媒体会话时设置 MF_SESSION_GLOBAL_TIME 属性。 否则,媒体会话需要播放列表序列。 在编辑序列中,每个段拓扑都必须具有 MF_TOPOLOGY_PROJECTSTART 属性和 MF_TOPOLOGY_PROJECTSTOP 属性。

播放列表序列

在播放列表序列中,演示时钟从零开始,然后跨段边界继续。 本机源提供时间戳等于媒体时间的示例。 管道将时间戳转换为正确的演示时间,如下所示:

  • 新时间戳 = 媒体时间 + 偏移量 • 媒体开始

offset 的值是上一段结束的表示时间。 对于第一个段,偏移量为零。 下面是有关如何计算这些时间戳转换的两个示例:

  • 示例 1:假设 S1) (第一个段长 10 秒,S2) (第二段的媒体开始时间为零。 本机源使用媒体时间作为其时间戳,因此 S2 中的第一个示例的时间戳为零。 偏移量是 S1) 持续时间 (10 秒,因此调整后的时间戳为:0 + 10 ≤ 0 = 10 秒。
  • 示例 2:假设段 S1 的长度为 10 秒,而 S2 的媒体启动时间为 5 秒。 S2 中的第一个样本的时间戳为 5 秒, (媒体时间) 。 偏移量为 10 秒,因此调整后的时间戳为:5 + 10 ≤ 5 = 10 秒。

源节点下游的所有管道组件都接收带有调整时间戳的样本。 拓扑中的源节点可以具有不同的媒体开始时间,因此会针对拓扑的每个分支单独计算调整。

当演示文稿切换到下一段时,演示时钟不会停止或重置,并且演示时间单调增加。 在新段开始之前,媒体会话向应用程序发送 MESessionNotifyPresentationTime 事件。 事件指定段相对于呈现时钟的开始时间和偏移量的值。 当新段启动时,管道会在序列器源上调用 Start ,其值VT_EMPTY。 Sequencer 源发送一个 MESourceStarted 事件,没有开始时间。

为了查找,应用程序指定段标识符加上段内的时间偏移量。 查找后,呈现时钟从 偏移量开始。 下面是该过程的工作原理示例:

  • 示例 3:应用程序寻求段 S3,段偏移量为 10 秒。 演示时钟从 10 秒开始, (段偏移量) 。 偏移量不包括段 S1 和 S2 的持续时间。 Sequencer 源发送一个开始时间等于段偏移量 10 秒的 MESourceStarted 事件。

在查找后,如果播放继续到下一段,则转换的工作方式与前面的示例一样,只不过偏移量不包括跳过的段。

下面是影响示例时间戳方式的一些进一步详细信息:

  • 解码器可能需要超出媒体停止时间的数据。 管道从源中提取解码器所需的尽可能多的数据,然后剪裁解码器的输出样本。
  • 转换可能会缓冲数据。 例如,音频效果可能需要执行此操作。 当段结束时,转换中最后一个样本的时间戳早于段的结尾,因为转换会阻碍一些数据。 下一段开始时,第一个样本上的时间戳略早于段的开头。 时间戳中没有间隙,因此到达媒体接收器的数据是连续的。 当最后一段结束时,管道会清空转换,因此不会丢失任何数据。
  • 源可能需要比媒体启动时间稍早一点启动,以便选取上一个关键帧。 因此,调整后,第一个样本的呈现时间可能为负值。

编辑序列

在编辑序列中,应用程序通过设置 MF_TOPOLOGY_PROJECTSTARTMF_TOPOLOGY_PROJECTSTOP 属性来提前指定段边界。 管道以几乎与播放列表序列相同的方式计算时间戳调整:

因此,编辑序列中的呈现时间始终相对于演示文稿的开头,即使应用程序查找另一段也是如此。

媒体会话

Sequencer 源