Timed Text Markup Language

打开保存XML带样式

W3C 制定的字幕和隐藏式字幕 XML 格式,也是广播机构和流媒体服务所要求的格式。DFXP 是它第一个配置文件的名称,许多文件仍然带有这个名字。IMSC、EBU-TT-D 和苹果的 iTT 也都属于 TTML,各自有各自的习惯。

概览

扩展名.ttml
媒体类型application/ttml+xml
规范W3C,Timed Text Markup Language 1(TTML1),推荐标准。TTML2 对其进行了扩展;IMSC 和 EBU-TT-D 是用于分发的子集。
时间精度任意:秒的小数、帧或刻度(tick)
文本编码在 XML 中声明。几乎总是 UTF-8。
样式命名样式和 tts: 属性:字体、字号、颜色、背景、斜体、粗体、下划线、删除线、描边
位置区域(regions):可在画面任意位置放置并设定大小的方框
说话人在文件头中命名的 agent(ttm:agent)
在容器中MP4 中为 stpp(ISO/IEC 14496-30),用于 DASH、CMAF 和 HLS 流

文件的结构

这是一份 XML 文档:文件头列出样式和区域,正文则是一段段的段落,每条字幕对应一段。

<tt xml:lang="en" …>
<head>styles, regions</head>
<body><div>
<p begin="00:00:23.000"
   end="00:00:24.500">
You're a jerk,<br/>Thom.</p>
</div></body>
</tt>
  1. 1 · 根元素

    <tt>,包含 TTML 的命名空间、语言,以及时间所依据的时钟:ttp:frameRate、ttp:tickRate。

  2. 2 · 文件头

    命名的样式、画面上的区域,以及谁在说话。

  3. 3 · 时间

    每段的 begin,以及它的 end 或 dur。

  4. 4 · 文本

    字幕本身。<span> 用于为部分文字设置样式,<br/> 用于换行。

时间

TTML 书写时间的方式比任何其他字幕格式都多:

写法 含义
00:00:23.500 小时、分钟、秒和小数
00:00:23:12 秒之后的帧数:在文件的 ttp:frameRate 下为第 12 帧
23.5s、23500ms、1h 以小时、分钟、秒或毫秒表示的偏移量
564f 帧数
235000000t 刻度,每秒 ttp:tickRate 个

时间从所属的容器开始计算。 段落的 begin 从其所在 <div> 和 <body> 的开始计算;没有自身结束时间的段落,会随它们一起结束。

样式

样式就是一组 tts: 属性。文字依次从所在的区域、正文、div、段落以及外层的 span 中继承样式。每个元素会应用它所引用的样式(style="s1 s2",以及那些样式再引用的样式),然后应用它自身的属性。

属性 效果 在 Subtitld 中
tts:fontStyle="italic" 斜体 保留
tts:fontWeight="bold" 粗体 保留
tts:textDecoration="underline"、"lineThrough" 下划线、删除线 保留
tts:color 文字颜色:颜色名、#rrggbb、#rrggbbaa 或 rgb() 保留,但不保留透明度
tts:displayAlign、tts:textAlign 文字在区域中的位置 保留,映射为九个位置之一
tts:fontFamily、tts:fontSize 字体和字号 不保留
tts:backgroundColor、tts:textOutline 文字后的底框、描边 不保留
<set> 随时间变化的样式 不保留

区域

区域是画面上的一个方框,由 tts:origin 定位,由 tts:extent 设定大小。在区域内,tts:displayAlign 决定文字位于顶部、中部还是底部(before、center、after),tts:textAlign 决定文字靠左、靠右还是居中。

<region xml:id="top"
        tts:origin="10% 10%"
        tts:extent="80% 80%"
        tts:displayAlign="before"/>

Subtitld 会计算文字最终落在哪里,无论区域是以百分比、像素还是单元格度量;并取最接近的九个位置之一,即 SubRip 的 {\an1} 到 {\an9} 所对应的位置。写入文件时,每个使用的位置都是一个同名的区域:bottom、top、top-left……

文件未作说明时。 TTML 自身的默认值会把文字放在区域的左上角,但播放器通常显示在底部并居中,Subtitld 也是如此。对于没有大小和位置的区域,如果它的 textAlign="start",Subtitld 会按居中处理:用 pycaption 写的文件(包括旧版 Subtitld 写的)就是这样,它会把这个设置用在每个区域上。

配置文件

大多数 TTML 都是按某个配置文件编写的:它是 TTML 的一个子集,并有自己的规则。Subtitld 会把它们每一种都当作 TTML 读取。

配置文件 使用场景 特点
DFXP TTML 最初的配置文件,扩展名为 .dfxp 较旧的文件使用命名空间 http://www.w3.org/2006/10/ttaf1
IMSC 1 通过 DASH、CMAF 和 HLS 进行的流媒体 W3C 为网络字幕和隐藏式字幕制定的配置文件
EBU‑TT‑D 欧洲广播机构的网络播放器 元素常带前缀:<tt:p>
SMPTE‑TT 美国电视的网络隐藏式字幕 SMPTE 的补充规定,用于从广播移植过来的字幕
iTT(.itt) 交付给苹果的 iTunes Store 和 Apple TV 时间以帧表示(ttp:timeBase="smpte")

Subtitld 中的 TTML

保存在 .ttml 中
  • 每条字幕的文字和换行
  • 斜体、粗体、下划线、删除线和颜色
  • 字幕在屏幕上的位置
  • 说话人,以 agent 的形式保存
  • 开始和结束时间,精确到毫秒,并按顺序排列
无处可存
  • 逐行的字体、字号、底框和描边
  • 区域精确的大小和位置
  • 随时间变化的样式、注音、图片字幕
  • 与原文并列的译文、配音、说话人的脸

保存 .usfx 项目即可保留属于 Subtitld 的内容。

打开 TTML 文件

Subtitld 可以打开 .ttml、.dfxp、.itt 和 .xml,并会:

  • 无论以何种方式书写的 TTML 都能读取:使用标准命名空间、旧的 DFXP 命名空间,或每个元素前都带 tt: 前缀;
  • 读取各种形式的时间,并按其所在的 div 和 body 计算;
  • 按 TTML 的规则应用样式,保留斜体、粗体、下划线、删除线以及白色以外的颜色;
  • 把每条字幕放在其区域所显示的位置;
  • 把 agent 作为说话人,便于配音,并把文件的 xml:lang 作为项目的语言;
  • 读取文件声明的编码,以及 &nbsp; 等 HTML 实体。

不是格式良好的 XML 的文件,会给出出错的行和列。完全不是 TTML 的文件,则会明确告知。

导出 TTML

Subtitld 的导出对话框,已选择 TTML,说话人以 agent 的形式写入

依次点击 导出,再选择 字幕 和 TTML 或 DFXP,可以设置以下选项:

  • 文本原文、译文,或两者都要,译文放在下方。
  • 说话人名字不写出;放在文字前(Thom:…);或作为 agent(ttm:agent),这是 TTML 自己的方式。
  • 格式保留,或删除。
  • 偏移时间把所有字幕整体提前或推后相同的时长。
  • 外观白字加黑色描边,或按 Subtitld 预览的效果:它的字体、颜色和半透明底框。

文件为 UTF-8 编码的 TTML 1。时间写作 00:00:23.000,字幕所在的每个位置都是一个区域,格式以 span 的形式写入,换行则为 <br/>。它的 xml:lang 为所写文字的语言。TTML 和 DFXP 生成的文件完全相同,只是扩展名不同。

TTML 还是 WebVTT?

网页上的 <track> 用 WebVTT:浏览器自己就能读取。广播机构、要求使用它的流媒体服务,以及像 dash.js 和 Shaka Player 这样能读取它的播放器,则用 TTML。其余内容请参阅 WebVTT 页面。

趣闻

2010

TTML 1.0 于 2010 年 11 月成为 W3C 推荐标准。在此之前,草案以其第一个配置文件命名:分发格式交换配置文件(DFXP)。

ttaf1

旧的命名空间 http://www.w3.org/2006/10/ttaf1 来自 2006 年的草案,当时 TTML 还叫时间文本编写语言(Timed Text Authoring Format)。许多文件至今仍带着它。

艾美奖

2016 年,W3C 因 TTML 获得技术与工程艾美奖,与 HBO、Netflix、Telestream 和 SMPTE 同时获奖。

相关格式

有 .ttml 需要修正吗?

在 Subtitld 中打开它,连同视频一起,在波形上重新打轴。

下载 Subtitld