简体中文

视频和字幕·字幕工具包

字幕时间码比较:SRT 逗号、VTT 点和 SMPTE 帧

· 背景

字幕 时间码 帧速率

一个瞬间以三种方式编写,即逗号时间码、点时间码和基于帧的时间码
原始 ToolAcre 矢量图

字幕作品中出现了三种书写时间的方式:SRT 的 HH:MM:SS,mmm、WebVTT 的 HH:MM:SS.mmm 和 SMPTE 的 HH:MM:SS:FF。这篇文章解释了它们的含义、它们如何转换以及转换出错的地方。

同一时刻以三种方式编写 - 快速浏览编辑器在一个项目中遇到的时间码

一个项目可以让编辑者以三种方式同时编写相同的内容。字幕文件使用小时、分钟、秒以及毫秒前的逗号。网络字幕文件在相同位置使用点。编辑决策列表使用帧编号而不是分数。这三者都命名了同一时刻,并且只有其中之一可以在不了解有关材料的任何其他信息的情况下阅读。

最后一点是最重要的。其中两种表示法是绝对的,一种不是绝对的,当忽略差异时,它们之间的转换会以特定方式失败。

带逗号的毫秒:SRT — 欧洲小数习惯,已成为格式规则

SRT 写入小时、分钟、秒、逗号和精确的三位数毫秒。逗号是欧洲惯例中的小数点分隔符,它通过使用而不是通过规范成为格式规则,因为 SubRip 没有标准文档来修复它。价值没有一点是欧洲的;只有标点符号是。

这里的解析器通过将右侧找到的任何数字填充到三来读取毫秒,因此以一位数字结尾的时间戳被读取为数百毫秒而不是单位。这很重要,因为手工或松散转换器写入的文件并不总是提供三位数字,并且将单个尾随数字读取为单位将使提示提前几乎一秒。

带点的毫秒:WebVTT — 相同的值,不同的分隔符,以及为什么它对解析器很重要

WebVTT 使用点写入相同的值,并允许完全省略小时字段,因此两个字段的形式是有效的,而 SRT 需要三个字段。对于解析器来说,这些是真正不同的语法,这就是为什么文件可以仅因标点符号而被拒绝,尽管文件中的每个数字都是正确的。

真实文件不断地混合两者,因此解析器接受任一分隔符,无论文件声称是什么格式。该容差仅针对输入。输出时,分隔符由目标格式选择,逗号代表 SRT,点代表 WebVTT,因此转换后的文件是规范的,而不是任何不规则内容的副本。

帧:SMPTE 时间码 — HH:MM:SS:FF,其对帧速率和丢帧复杂性的依赖

SMPTE 时间码用帧编号替换小数部分,给出小时、分钟、秒和帧。与其他两个不同的是,它不能单独解释:第十二帧是每秒二十五帧与每秒三十帧的不同时刻,因此没有声明速率的基于帧的时间码是不完整的,而不仅仅是模糊的。

丢帧增加了第二个复杂因素。每秒 29.97 帧的素材被视为三十帧,并且为了使计数与时钟保持一致,在大多数分钟开始时会跳过两个帧编号,每十分钟除外。帧不会丢失;只有标签是。丢帧时间码是一种计数约定,将其视为普通帧计数会产生在整个程序中不断增长的错误。

将帧转换为毫秒 - 算术和舍入产生小但真实的错误

将帧转换为毫秒是除以帧速率,四舍五入是产生小误差的地方。帧索引除以速率并乘以千很少会达到整毫秒,并且结果必须四舍五入才能存储。内部提示被保存为从零开始计数的整毫秒,因此每次转换到该表示形式都会循环一次。

一次四舍五入是无害的。需要注意的错误是重复转换:文件从帧到毫秒,以不同的速率返回到帧并再次前进,每次都会累积舍入,并且这些错误不会消除。从权威来源转换一次,而不是通过多个工具传递文件。

工作示例:在 25 fps 和 29.97 丢帧时的一个提示 — 将两者转换为毫秒并进行比较

在 1 分 30 秒 12 帧处获取一个提示。在每秒二十五帧的情况下,十二帧是十二五分之二秒,准确地说是四百八十毫秒,因此瞬间是九万四百八十毫秒。

在 29.97 丢帧处,相同的标签是不同的时刻。计算帧数:名义上的 30 秒的 90 秒给出了 2700 帧,再加上 12 秒,减去第一分钟丢弃的两个标签,即 2710 帧。除以真实速率三万除以一千零一,瞬间约为九万四百二十四毫秒。两个时间码看起来几乎相同,但相差大约五十六毫秒,该时间码小到足以通过审查,大到足以在严格的提示上可见。

这不包括什么 - 超出 99 的时间、容器元数据中的负时间和时间码

这涵盖了字幕文件携带的时间码符号。它不涵盖超过 99 的小时字段,某些系统将其用于卷轴识别而不是经过的时间,并且它不涵盖负时间,这两种字幕格式都无法表达;产生 1 的移位被钳位为零。

存储在容器元数据中的时间码也超出范围。视频文件可以携带一个起始时间码,该时间码会偏移其中的所有内容,因此与节目正确的字幕文件可能会在文件中显示错误,并且无论检查多少字幕时间戳都无法揭示这一点。

要点:了解您正在读取的时钟 — Subtitle Toolkit 如何在 SRT 和 WebVTT 时间码之间准确转换

知道您正在读取哪个时钟。逗号和点是为不同解析器编写的相同值,它们之间的转换应该改变标点符号,而不改变其他任何内容。帧计数是一种不同类型的数字,没有其速率就毫无意义,并且当速率是丢帧速率时会产生误导。

使用工具包在 SRT 和 WebVTT 之间进行转换,并比较前后的时间戳:分隔符应该更改,而数字不应更改。如果移动了某个数字,则文件会在某处经历基于帧的步骤,这就是要检查的转换。