IMSC 中的时序

在构建 IMSC 文档时,每个定义的文本片段都必须包含时序信息,以指定它应该何时出现。有多种方法可以描述字幕应该何时开始和停止显示,每种方法都有其优缺点。本文将解释这些不同的方法。

如果您还没有阅读 IMSC 文档中的时序 部分,您应该先阅读,然后再返回这里 - 它包含关于如何描述时序事件的初始概述。

描述时序的不同方式

在 IMSC 文档中描述时间表达式值主要有三种方法。

  • 秒.小数:指定简单的秒值。这是最简单的方法;我们之前已经在文章系列中看到过它的使用。
  • HH:MM:SS.小数:指定更复杂的时间,格式为 HH:MM:SS。这类似于只使用秒,是 IMSC 文件中最常见的时序表达式之一。
  • :以帧数而不是秒数指定开始和结束时间。这是 IMSC 文件中使用的另一种最常见的时序表达式。这种方法的优势在于帧号直接对应于视频文件中的帧号。

秒.小数

xml
<p begin="1s" end="2s">Hello, I am Mork from Ork</p>

这种描述 IMSC 文档中 beginend 值的方法非常简单 - 您只需包含一个带“s”(秒)后缀的数字即可。它不需要用户声明对应媒体的帧率。这些值必须映射到文本同步的视频帧。小数值将始终向上舍入到最接近的视频帧。

HH:MM:SS.小数

xml
<p begin="00:00:01.00" end="00:00:02.00">Hello, I am Mork from Ork</p>

这种描述 IMSC 文档中 begin 和 end 值的方法本质上与使用秒相同,只是您将这些值表示为小时、分钟和秒。这使您可以轻松设置更长、更精确的时间。

xml
<tt xmlns="http://www.w3.org/ns/ttml"
  xml:lang="en"
  ttp:frameRate="24"
  ttp:frameRateMultiplier="1000 1001">
  <body>
    <div>
      <p begin="24f" end="48f">Hello, I am Mork from Ork</p>
    </div>
  </body>
</tt>

此方法要求在 IMSC 文档的根元素中声明 frameRateframeRateMultiplier 属性。帧率描述视频一秒钟有多少帧。乘数应用于 frameRate 以声明视频的一秒钟与一实时秒的比较方式。

让我们更详细地解释一下。

frameRateMultiplier 源于与非整数帧率(如 23.98fps(与整数帧率如 24fps 相反))相关的难题。24fps 表示视频的每秒钟有 24 帧,而这秒钟与实时秒相同。23.98fps 表示视频的每秒钟有 24 帧,而这秒钟比实时秒稍长。frameRateMultiplier 定义了每帧的持续时间与实时的比较。

想象一下,您有一个秒表,并计时自己观看电影。如果这部电影以 24fps 的速度播放,那么当您的媒体播放器显示您已经观看了一个小时的电影时,您的秒表会显示 01:00:00.00。现在,如果这部电影以 23.98fps 的速度播放,那么当您的媒体播放器显示您已经观看了一个小时的电影时,您的秒表现在会显示 01:00:03.6(1 小时 × (24/23.98))。

明白了吗?

要描述 23.976fps 的帧率,将使用以下 frameRateframeRateMultiplier

xml
<tt xmlns="http://www.w3.org/ns/ttml"
  xml:lang="en"
  ttp:frameRate="24"
  ttp:frameRateMultiplier="1000 1001">

这实际上是在说,24 帧的每秒钟应该以 (24 * (1000/1001)) 或 23.98fps 的速度播放。

现在声明了 23.98 的帧率,您可以用帧或 f 来描述时序表达式。

xml
<p begin="24f" end="48f">Hello, I am Mork from Ork</p>

使用这种方法的优势在于,时序表达式帧号与媒体资产的帧号相同。86400f 的值是视频文件中第 86400 帧。

注意:您可以在 将视频时间码映射到 IMSC 中找到对这些值的更多解释。