生成 HTML track 元素
或者粘贴字幕文本
选项
字幕(subtitles)面向能听到声音、只需要文字的观众 —— 翻译,或同语言的文字稿。听障字幕(captions)面向听不到声音的观众,所以它还会带上声音传达给其他人的信息:音乐、关门声、电话铃响。同一份文件可以承担任一用途,所以这一页直接问你而不是猜测;而且这个值之后无法在元素内部修改。描述、章节与元数据不提供:它们都无法用字幕文件的内容填充。
一个简短的语言标签,例如 en、en-GB 或 pt-BR,标明字幕里文字的语言,而不是视频的语言。声明为字幕(subtitles)的轨道必须给出语言,所以清空这个框会回退到 en,而不是删掉这个属性 —— 又因为所有属性都会打印在输出里,你可以在粘贴之前就看到回退结果。
自由文本:English、English (SDH)、Français。当页面提供多条轨道时,观众就是从这个菜单里选,所以按你受众认得的写法来写。清空这个框会整个去掉该属性,而不是写一个空值,从而把命名交还给播放器;空标签会在菜单里留下一行没有名字的条目。
打开后,视频一开始播放字幕就出现。一个媒体元素只能有一条默认轨道,所以如果页面已经有一条,就保持关闭:第二条自称默认的轨道会让播放器选错,而不做默认只意味着观众需要自己打开。
时间按哪个帧率计算。在格式页面里,这是 MicroDVD 需要的值,因为它把时间存成帧号。在帧率页面里,它是文件当初对应的速率 —— 字幕是按这个版本做的 —— 而页面的第二个框填你要拿它配套的视频速率。常见的有 23.976、24、25、29.97、30、50、59.94 和 60。填错会让整条时间轴偏移;在帧率页面里,偏移是按比例发生的,而不是一个固定的量。
这一页把字幕塞进一个可以直接贴到网页里的元素。产物是一行 track 元素,WebVTT 正文内联在 src 属性的 data URI 里,于是字幕跟着标记走:不需要第二个文件,不需要摆对路径,播放器也不会去找一个不存在的东西。
内联的理由是浏览器对本地文件的处理。轨道是取回来的而不是画出来的,而页面本身从磁盘打开时浏览器会拒绝这个请求,所以存在桌面上的网页里写一条指向 film.vtt 的轨道什么都不会显示——屏幕上没有报错,字幕菜单空着,控制台里多一行几乎没人会打开的记录。data: URI 根本不会被取回,正文就在属性里,因此本地打开也能用。代价是体积:WebVTT 里的每个空格和换行都会变成三个字符,而这里的元素本来就是为了自己就能用。
四个属性来自面板上的框,因为文件里读不出它们。kind 最重要:subtitles 是给听不懂这门语言的观众看的翻译,captions 是同时承载音乐与音效的完整版本。一份满是关门声标注和音符的文件两种都说得通,只有你知道它是为谁做的,所以页面选择问你而不是猜。
两个框清空后的行为不同:清空菜单名称会整个去掉 label,因为它是可选的,省略就是把选择交给播放器;清空语言框不会去掉 srclang,声明为 subtitles 的轨道必须写明语言,空框回落到 en。产物会把每个属性都印出来。WebVTT 进、WebVTT 出时,文件在字幕条之外的内容——WEBVTT 行上的文字、NOTE 与 STYLE 块、逐条设置——都会保留。文件不上传。
示例
一份 SRT 文件,用默认设置
输入
1
00:00:01,000 --> 00:00:03,000
The room is dark.
2
00:00:04,000 --> 00:00:06,000
Nobody came.
输出
<track kind="subtitles" src="data:text/vtt;charset=utf-8,WEBVTT%0A%0A1%0A00%3A00%3A01.000%20--%3E%2000%3A00%3A03.000%0AThe%20room%20is%20dark.%0A%0A2%0A00%3A00%3A04.000%20--%3E%2000%3A00%3A06.000%0ANobody%20came.%0A" srclang="en" label="English" default>
一行输出,整份文件都在里面:%0A 是换行,%20 是空格,WebVTT 就这样躺在 src 属性里,而不是摆在页面旁边的一个文件中。四个属性对应四个框——文字的语言、观众在字幕菜单里选的那一行,以及 default,它让这条轨道自己打开。SRT 的字幕条序号被保留为 cue 标识符。
WebVTT 进,同一份 WebVTT 出
输入
WEBVTT - exported from the editing room
NOTE The first pass was done by hand.
STYLE
::cue { color: #f2f2f2; }
intro
00:00:01.000 --> 00:00:03.000 align:start position:10%
The room is dark.
2
00:00:04.000 --> 00:00:06.000
Nobody came.
输出
<track kind="subtitles" src="data:text/vtt;charset=utf-8,WEBVTT%20-%20exported%20from%20the%20editing%20room%0A%0ANOTE%20The%20first%20pass%20was%20done%20by%20hand.%0A%0ASTYLE%0A%3A%3Acue%20%7B%20color%3A%20%23f2f2f2%3B%20%7D%0A%0Aintro%0A00%3A00%3A01.000%20--%3E%2000%3A00%3A03.000%20align%3Astart%20position%3A10%25%0AThe%20room%20is%20dark.%0A%0A2%0A00%3A00%3A04.000%20--%3E%2000%3A00%3A06.000%0ANobody%20came.%0A" srclang="en-GB" label="English (UK)" default>
WebVTT 文件在字幕条之外带着的东西全都活了下来:WEBVTT 行上的说明、NOTE 块、决定字幕在播放器里长什么样的 STYLE 块、字幕条的名字行,以及逐条设置 align:start position:10%(其中的 %25 是百分号,因为裸百分号不能出现在 URI 里)。进来的 WebVTT 原样出去。两个框写的是 en-GB 与 English (UK),因为这一份是做给英国观众的——文件里并没有说这件事。
常见问题
生成了 HTML track 元素之后,还需要在旁边放一个 .vtt 文件吗?
不需要,这正是这一页的意义。WebVTT 被写成 data: URI 放进 src,元素自带字幕,贴进页面、发给别人或换一个文件夹都还能显示。唯一要小心的是它是一整个属性,只复制其中一段就会破坏 URI,轨道会变成空的。
直接双击打开本地 HTML 文件,生成的 track 元素能用吗?
能用,这也是页面选择内联的原因。页面从磁盘打开时,浏览器会拒绝取回单独的轨道文件,所以指向 film.vtt 的轨道什么都不会显示,连报错都没有;data: URI 根本不会被取回,正文就在属性里,本地和服务器上表现一致。
为什么 HTML track 元素的 src 比原字幕文件长这么多?
因为 URI 里每个非字母数字字符都会变成三个字符:空格是 %20,换行是 %0A。Base64 会短一些,大约只比原文多三分之一,但得到的是一堵读不懂的字符墙;现在你还能在 src 里认出自己的台词。
清空菜单名称框后,为什么生成的 track 元素没有 label 属性?
因为菜单名称在 HTML 里是可选的,省略它不等于没有名字,而是把播放器字幕菜单里显示什么交给播放器,通常就是语言。清空框因此移除属性而不是写一个空值,空的 label 会在菜单里显示成一行空白。
track 元素里的 kind 应该选 subtitles 还是 captions?
看给谁看。subtitles 假定观众听得见声音,只是需要翻译或写出台词;captions 假定观众听不见,因此还要承载音乐、关门声、电话铃这些通过声音传达的信息。同一份文字两种都能用,文件本身看不出你要哪一种。
生成 HTML track 元素时,哪些 track 种类没有提供?
三种:descriptions(为看不见画面的观众描述画面)、chapters(是导航而不是字幕,本站有单独一页)与 metadata(不显示给任何人)。三者都填不进字幕文件的内容,提供它们只会让你做出一个什么都不显示的元素。
字幕进入 HTML track 元素时有哪些内容被改动?
文字、时间与样式不变,WebVTT 文件保留自己的注释、样式、区域块与逐条设置;改变的只是写法:SRT 的 00:00:01,000 会变成 00:00:01.000,开头的 UTF-8 标记会被去掉,因为 data URI 已经声明了编码。