为什么字幕看得越久,偏差越大

如果字幕开头是对的,之后慢慢提前或落后,那么整体平移是没用的:它是为一个以不同速度播放的电影版本制作的。下面说明如何判断你遇到的是哪种问题,以及每种问题怎么修复。

更新于

字幕不同步有两种情况,修复方法正好相反。一种是固定的差距:从第一个场景到最后一个场景,每一行都晚半秒。另一种会越来越大:开头几行没问题,到电影中段偏了好几秒,到结尾描述的已经是另一个场景了。第一种是延迟。第二种是速度不同,而它是下载来的字幕最常见的问题,远比第一种多。

延迟还是逐渐偏差:你遇到的是哪一种

记下开头附近字幕偏了多少,然后往后跳半小时再看一次。

  • 两次的差距一样。这是延迟。任何播放器的字幕延迟设置都能修复:设置一次,整部电影就都对了。
  • 第二次的差距更大。这是逐渐偏差。延迟设置修复不了,因为它把每一行移动相同的量,而误差却在不断增大。

逐渐偏差从何而来

电影以每秒 24 帧拍摄。这个帧率有两个版本在流通,还有第三个数字是因为过去的欧洲电视而出现的:

  • 23.976(24000/1001)是为北美电视制作的视频播放电影的帧率,也是如今大多数资源使用的帧率。
  • 25 是欧洲 PAL 电视使用的帧率。电影直接加快百分之四播放,所以一部两小时的电影会短大约五分钟。
  • 精确的 24 是电影院使用的帧率。不过大多数蓝光电影仍然是 23.976。

字幕文件就是一张时间列表。按 25 fps 的版本对好时间轴,再放到 23.976 fps 的版本上播放,第一行之后的每一行都会提前一点,提前的量是电影已播放时长的百分之四。

电影播放到25 fps 字幕配 23.976 fps 视频
1 分钟提前 2.5 秒
10 分钟提前 25 秒
30 分钟提前 1 分 14 秒
60 分钟提前 2 分 27 秒
90 分钟提前 3 分 41 秒

按 23.976 fps 版本对好时间轴的字幕放到 25 fps 的版本上,则方向相反,越来越晚,幅度相同。而 23.976 和 24 之间相差千分之一:一小时结束时大约三秒半,小到在最后一个场景之前都不会被注意到。

如何修复逐渐偏差

最好的办法:为你这个版本制作的字幕

按与你的视频相同的资源对好时间轴的字幕,根本不需要修复。OpenSubtitles 可以按文件本身而不是文件名找到这样的字幕:它根据文件大小以及文件开头和结尾各 64 KB 计算出一个指纹,返回大家为这个文件上传的字幕。没有匹配结果时,找资源名与你的一致、帧率也相同的字幕,大多数字幕网站都会在每个文件旁边标出帧率。

转换字幕文件的帧率

没有更好的字幕时,就拉伸你手上的这份。这是一次性的修改,能永久修好文件:

  • Subtitle Edit(Windows,免费):Synchronization › Change frame rate,从 25 改为 23.976;如果字幕是落后的,就反过来改。它的 Point sync 可以根据你手动对上的两行字幕完成同样的事,还能同时修复延迟。

或者在观看时拉伸

  • mpv 可以用 --sub-speed 实时拉伸字幕时间。对于 23.976 fps 视频上的 25 fps 字幕,就是 --sub-speed=25/23.976。
  • VLC 在 Tools › Track Synchronization 中有字幕速度设置。

这些设置只在本次会话中有效(如果写进配置文件,则对所有文件都有效),所以转换文件通常是更好的修复方法。

Frame Player 能帮上什么

Frame Player 中的字幕搜索:第一个结果是按文件本身找到的,无需调整即可使用;第二个是为 25 fps 制作的,在下载前就被标了出来。

  • 它首先按文件搜索。字幕面板向 OpenSubtitles 查找为你这个副本制作的字幕,并标明结果是来自这种匹配,还是来自按片名搜索,因为按片名匹配到的可能是另一个资源,时间轴就值得检查一下。
  • 帧率不同会在下载前标出。如果某个结果是为与你的视频不同的帧率制作的,面板会把它标出来,这样你就不会选中那个会越来越不同步的字幕。
  • 它会提出让字幕适配你的视频。下载一个为不同帧率制作的字幕后,面板会询问是否拉伸它以匹配视频。它只询问而不直接拉伸,因为字幕网站上的帧率只是上传者自己填写的。
  • 字幕菜单可以手动拉伸任何字幕:25 → 23.976、23.976 → 25 或 24 → 23.976。这适用于你原本就有的字幕文件,以及视频内部那些没人说明是按什么帧率制作的字幕轨。它适用于文本字幕;基于图像的字幕(PGS、VobSub)无法拉伸。
  • 你设置的速度和延迟会为这个文件保存,并且只为这个文件保存,所以下次打开时字幕仍然是对的,也不会影响到下一集。
  • 种子内的字幕会自动加载,并与正在播放的那一集匹配。

先修正速度,再用延迟消除剩下的差距。如果你想让字幕文件本身在所有播放器中都是对的,用 Subtitle Edit 转换一次仍然能永久解决。

常见问题

为什么字幕开头是对的,后面就错了?

因为它是按另一个以不同速度播放的电影版本对的时间轴。最常见的情况是,为 25 fps 资源制作的字幕,放在 23.976 fps 的资源上播放。两者开头一致,之后偏差约为播放时长的百分之四,一小时结束时就是两分半钟。

字幕延迟设置能修复吗?

只有在偏差始终不变时才行。延迟把每一行移动相同的量,所以面对逐渐累积的偏差,它只是把字幕对得上的那个点从电影开头挪到了中间某处。

23.976 是什么意思?

电影以每秒 24 帧拍摄。为北美电视制作的视频以 24000/1001,即约 23.976 帧播放,如今大多数资源都保留了这个帧率。欧洲的 PAL 电视以 25 帧播放电影,快了百分之四,为这些版本制作的字幕也带着这个速度。

字幕开头晚、结尾早,怎么办?

那是逐渐偏差和固定延迟同时存在。先修正速度(找适合你这个资源的字幕,或者转换帧率),然后再用延迟消除剩下的差距。

随便打开点什么。下次从你停下的地方接着看。

$ brew install --cask risenxxx/tap/frame-player

版本 1.38.1macOS 版已通过公证Windows 版未签名,SmartScreen 会拦截一次