Timed Text Markup Language
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 · 根元素
<tt>,包含 TTML 的命名空间、语言,以及时间所依据的时钟:ttp:frameRate、ttp:tickRate。 - 2 · 文件头
命名的样式、画面上的区域,以及谁在说话。
- 3 · 时间
每段的
begin,以及它的end或dur。 - 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
- 每条字幕的文字和换行
- 斜体、粗体、下划线、删除线和颜色
- 字幕在屏幕上的位置
- 说话人,以 agent 的形式保存
- 开始和结束时间,精确到毫秒,并按顺序排列
- 逐行的字体、字号、底框和描边
- 区域精确的大小和位置
- 随时间变化的样式、注音、图片字幕
- 与原文并列的译文、配音、说话人的脸
保存 .usfx 项目即可保留属于 Subtitld 的内容。
打开 TTML 文件
Subtitld 可以打开 .ttml、.dfxp、.itt 和 .xml,并会:
- 无论以何种方式书写的 TTML 都能读取:使用标准命名空间、旧的 DFXP 命名空间,或每个元素前都带
tt:前缀; - 读取各种形式的时间,并按其所在的 div 和 body 计算;
- 按 TTML 的规则应用样式,保留斜体、粗体、下划线、删除线以及白色以外的颜色;
- 把每条字幕放在其区域所显示的位置;
- 把 agent 作为说话人,便于配音,并把文件的
xml:lang作为项目的语言; - 读取文件声明的编码,以及
等 HTML 实体。
不是格式良好的 XML 的文件,会给出出错的行和列。完全不是 TTML 的文件,则会明确告知。
导出 TTML
依次点击 导出,再选择 字幕 和 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 页面。
趣闻
TTML 1.0 于 2010 年 11 月成为 W3C 推荐标准。在此之前,草案以其第一个配置文件命名:分发格式交换配置文件(DFXP)。
旧的命名空间 http://www.w3.org/2006/10/ttaf1 来自 2006 年的草案,当时 TTML 还叫时间文本编写语言(Timed Text Authoring Format)。许多文件至今仍带着它。
2016 年,W3C 因 TTML 获得技术与工程艾美奖,与 HBO、Netflix、Telestream 和 SMPTE 同时获奖。
相关格式
在 Subtitld 中打开它,连同视频一起,在波形上重新打轴。