B站视频丢帧,VLC背锅!

近期在B站上传熟肉视频时遇到了一个匪夷所思的问题。

用VLC向视频嵌入字幕

小知识:如果你只想为视频制作字幕,是不需要 Adobe Premier 之类的专业剪辑软件的。

打轴、听译和校对完全可以使用 Aegisub。工作完成后会输出一个 .ass 字幕文件。此时,字幕组可以选择以隐藏式字幕(视频平台的可开关字幕功能)或开放式字幕(“烧”到视频画面上的字幕)发布视频。

隐藏式字幕很简单,一般可在视频平台的投稿页面上传 .srt 字幕文件;开放式字幕则更复杂,因为需要修改视频画面,字幕内嵌工具必定会对视频重新编码、封装。我最后发现问题就是这一步导致的。

据我所知,有两个软件可以向视频里嵌入字幕:VLC 媒体播放器和 Handbrake。我用的是 VLC 媒体播放器。

发现问题

在稿件通过审核后,我发现实际发布的视频有严重的音画不同步。具体是视频最开头丢失了五秒多的画面,而音频没有问题。

我一开始断定这是 B 站后台转码导致的,所以联系了客服。在和 B 站客服交代问题时,我无意间发现了一个诡异的事情:如果把上传的 mp4 文件拖放至网页浏览器里播放,画面开头五秒会冻结在第一帧上,之后的内容播放正常,音画也同步。

回顾以上发现,我们可以看到三个播放器对视频做出了三个不同的行为:

  • VLC:正常播放
  • Bilibili 的 DashPlayer:开头画面缺失
  • 火狐浏览器:开头画面冻结

感觉越来越不像是小破站的问题了呢。看看文件的编解码器信息吧。果不其然……

编解码器信息对比

解决办法

如上图中的左侧窗格所示,用 VLC 嵌入字幕以后,帧率从源视频的 25 变成了 25.003828。也不知道为啥。

需要指出的是,这项“帧率”信息只是存储在 mp4 容器里的元数据。更改它不用重新压制视频。

最后还是祖传妙方解决了问题:

ffmpeg -i .\input.mp4 -c copy .\output_fixed.mp4

以上命令看似只让 ffmpeg 复制音视频流,但 ffmpeg 其实非常智能,能自动纠正 input.mp4 的很多错误。至少 ffmpeg 成功把我的视频纠正回了每秒 25 帧整(见上图右侧)。

得到了修复好的视频文件,我在B站创作中心操作换源,重新通过审核后确认播放正常了。

附注

我刚扒出来去年用同样方法烤的肉,不出意料嵌入字幕后帧率也从 30 变成了 30.013466。区别是那期视频只上传了 YouTube 而没出现任何问题。Interesting…

发布于 January 6, 2024