简体中文

视频和字幕·字幕工具包

为什么字幕文件在 VLC 中播放但在 HTML5 轨道元素中失败

· 工作原理

字幕 webvtt 浏览器处理

一个字幕文件到达两个解析器,宽松的显示每个提示,严格的显示提示被丢弃的间隙
原始 ToolAcre 矢量图

桌面玩家很宽容;浏览器的 track 元素不是。这篇文章解释了 HTML5 标题解析器如何读取 WebVTT 文件、它默默丢弃的错误以及如何准备两者都接受的文件。

相同的文件在 VLC 中工作并且在网页上不显示任何内容 - 两个解析器,两个容差级别

在桌面播放器中正确播放且在网页上不显示任何内容的字幕文件在两者之间没有变化。改变的是读者带来的宽容程度。桌面播放器旨在显示用户向其拖动的任何内容,以便它们猜测、修复和跳过。 HTML5 track 元素实现了一个规范,而接受猜测的规范不会是一个。

两者的差异都不是错误。这是两种具有不同义务的设计,实际结果是桌面播放器无法很好地测试文件是否可以在网络上运行。

track 元素如何加载字幕文件 - 请求、MIME 类型、跨源轨道的 CORS 和 WEBVTT 标头检查

track 元素将字幕文件作为普通资源获取,这意味着它与任何其他请求遵循相同的规则。它必须使用 WebVTT 媒体类型提供,并且无论其内容如何,​​作为纯文本提供的文件都会被拒绝。托管在另一个源上的轨道需要跨源标头和视频元素上的跨源属性,如果没有它们,在进行任何解析之前获取都会失败。

然后是标题检查。 WebVTT 文件必须以 WEBVTT 签名开头,前面可以选择字节顺序标记,没有它的文件不是 WebVTT 文件。这是重命名为 VTT 扩展名的 SRT 文件不显示任何内容的最常见原因:重命名更改了扩展名,而不是第一行。

逐个提示解析 — 浏览器如何处理格式错误的时间码或意外的行,以及为什么失败是无声的

在该点之后的解析是逐个提示的,而失败模式则让它变得混乱。解析器无法读取的块将被丢弃并继续解析。没有异常,没有控制台错误,也没有视觉指示;提示根本不会出现。九百个时间码中有四个格式错误的文件几乎可以完美播放,其中有四个沉默时刻,看起来像是缺少翻译而不是格式错误。

这就是为什么该症状通常被报告为间歇性的。没有什么是断断续续的。相同的提示每次都会失败,但由于周围的提示起作用,该文件看起来大致有效,并且故障归因于内容而不是解析。

桌面播放器的宽大处理 - 为什么 VLC 和其他人接受技术上无效的文件

桌面玩家故意采取相反的立场。他们接受两种毫秒分隔符,容忍丢失的索引行,从内容而不是扩展名推断格式,修复顺序,并跳过他们无法使用的内容而不抱怨。将文件拖到播放器上的用户希望电影有字幕,而不是验证报告。

工具包解析器在输入上采用同样宽松的传统,接受可选的时间、分隔符和块不规则的文件。不同之处在于它之后所做的事情:它将它所容忍的每一个错误记录为一个定位问题,并写回一个规范的形状,而不是保留它所接受的不规则性。

工作示例:具有三个常见错误的文件 - 在浏览器中测试它并查看哪些提示消失

取一个存在三个错误的文件:它缺少 WEBVTT 标头,一个提示的秒字段为 75,以及一个提示在开始之前就结束了。在桌面播放器中播放文件时,不可能的几秒会被修复或安静地跳过,并且反向提示会闪烁或被丢弃。观众看到字幕。

在轨道元素中,丢失的标头立即结束;没有显示任何提示,因为该文件从未被接受为 WebVTT。添加标题和图片变化:大多数提示出现,七十五秒的提示在解析过程中被丢弃,反向提示被解析但从未显示,因为它没有持续时间可显示。验证在加载页面之前命名,报告不可能的时间码和在开始之前结束的提示,每个都按编号。

这不包括什么 - 使用 ::cue 进行样式设置、定位设置和实时字幕

这涵盖了提示是否加载,而不是它们的外观。通过提示伪元素进行样式设置、时间码行上的定位和对齐设置、区域定义和垂直文本都是单独的问题,只有在文件解析后才有意义。不显示任何内容的文件不是样式问题,样式也无法解决它。

实时和流媒体字幕也不在此范围内。与自适应流一起交付的分段字幕轨道有自己的交付模型,并且轨道元素加载的静态文件并不是它们到达播放器的方式。

要点:为最严格的解析器做好准备 — 字幕工具包的转换和清理如何生成轨道元素接受的文件

准备使用最严格的解析器而不是最宽容的解析器,因为严格的解析器是您的受众使用的解析器。正确转换为 WebVTT,以便写入签名行而不是假定的签名行,使用正确的媒体类型为其提供服务,并在文件位于另一台主机上时添加跨域标头。

在发货前运行转换并阅读报告的问题。转换器使用格式所需的分隔符写入规范时间戳,连续重新编号提示并报告它必须容忍的错误,这是在浏览器中默默消失的提示列表。然后重新加载页面并将提示计数与源进行比较,而不是相信字幕出现。