欢迎光临散文网 会员登陆 & 注册

ASS特效/转码/压制折腾笔记

2022-02-01 00:17 作者:童年是个风筝  | 我要投稿


就像我昨天发的一条动态一样,在皇牌空战零、皇牌空战七和僚机计划中,我个人认为最难的就是我今天才刚刚做完字幕的皇牌空战零。

在字幕听译上,这期评测的难度相较于其他的两个绝对是最轻松的,因为YouTube那边早就有人贡献了英文字幕,所以我只需要对着字幕文件里的英文翻译就行了。

然而,这份本来只需要三天甚至更少时间就能完成的字幕,我却花了差不多四天才拖拖拉拉、急急忙忙的,到大年初一前的晚上才得以输出渲染这个视频。这其中当然有我摸鱼,以及家里随着新年的到来越来越繁忙的原因;但最主要的还是折腾字幕特效的兼容性问题。

字幕特效?

对,没错,这字幕不是普通字幕,是有特效的

怎么说呢,各位可以看一下下面这张视频截图:

特效字幕在原视频中显示的样子

这个字幕至少有以下几个特征:

  1. 字幕的位置:字幕的位置处于顶部中间位置,不同于普通的底部中间位置。字幕的位置是特殊且固定的。

  2. 字幕的颜色:字幕的不同部分都有不同的颜色,且各个部分/单元的颜色均互相独立

  3. 字幕的样式(没体现出来):也就是粗体、斜体、下划线、删除线之类。这些样式也都是独立的

遇到这种情况时,我第一个想到的就是字幕可能以何种格式储存——而我想到的就是ASS格式。

SubStation Alpha(或 Sub Station Alpha),简称SSA,是由 CS Low(亦作 Kotus)创建、比传统字幕(如SRT)更加强大先进的字幕文件格式。

Advanced SubStation AlphaASS)是一种比SSA更先进的字幕脚本格式。基于SSA 4.00+编码构建。ASS的主要变化就是在SSA编写风格的基础上增添更多的效果和指令。

反正我对这玩意的印象就是:它支持这种特效。它很强。我有99.99%的信心这字幕就是基于ASS格式渲染的。

你这ASS文件有问题啊

于是首先我Google了下几个YouTube视频字幕下载网站。可它们要么只支持基础的SRT/TXT格式,要么就是支持ASS,但是基本上都是这样的:

(代码识别和配色我随便找了个)

如果你对ASS很熟悉的话,你应该就看得出来,这个ASS文件和SRT/TXT文件一点区别都没有:它根本就没有定义视频中的特效样式(例如上图中的顶部居中),只有一个默认的底部居中的名为“Default”的样式规则。

而这还不是最糟糕的,最糟糕的在于,这里的ASS字幕内容都包含HTML代码,用于定义字体的颜色和样式(斜体、粗体等)。乍一看并不是什么大问题,因为这些HTML代码都是完全等价于ASS特效代码的,然而,HTML代码并不是ASS特效代码,许多播放器都不认这些HTML代码,而是把它们也当成纯文本处理

由于我以前都是用Arctime打字幕,而Arctime也支持ASS,因而我就去翻了下ArcTime的文档,发现了这样一段话:

在制作一些课程类字幕的时候,往往需要强调字幕中的部分文字,让他们呈现不同的颜色或样式。

通过Arctime当然也可以做到。由于Arctime是基于ASS渲染的,所以呢也支持ASS的效果代码。这个案例中,我们使用的是“样式替换代码”,看看它的结构。

所谓样式代码的简单入门

于是我就去查了下这个“样式替换代码”究竟是什么来头,发现了一个不错的介绍相关样式代码的PDF: https://pan.baidu.com/share/link?shareid=277387751&uk=755966686

这个样式代码在某些方面和HTML代码有类似之处,例如:

原来的HTML代码+文字

转换后就是这样:

尽管看起来很复杂,但这行代码的意思基本就是这样:

“将这里之后的文字颜色都设为#D82036” + “Grun 1<<” + “强制换行” + “将这里之后的文字颜色都设为#FEFEFE” + “将之后的文字都设为斜体” + “Absolute misery” + “取消设为斜体” + “将这里之后的文字颜色都设为#D82036” + “将之后的文字都设为斜体” + “>>” + “取消设为斜体”

作为有一定编程经验的爱好者,我不难看出以下的转换关系:

对于<font>中的颜色,转换为“{\1c&H<b><g><r>&}”(其中RGB均为十六进制两个字符)。例如“<font color="#D82036">”就是“{\1c&H3620D8&}”。在ASS特效中,RGB的排列是倒过来的,也就是BGR。

对于<i></i>(斜体)、<b></b>(粗体)等这样的代码,其被称为“普通代码”或“覆写代码”(Override tags)。其必须写在大括号里(这样的一对:{})。

拿斜体来说,这玩意的对应规则就是这样:<i>转为{\i1},</i>转为{\i0}。可以发现,这种代码与HTML类似,都是成对出现的。

开始折腾

首先我写了一小段Python代码,其可快速完成HTML到特效代码的转换。

有兴趣的可以在这里看看: https://gist.github.com/sctop/ac717c03881bef2858cffb0041587e49

整体写的挺烂的,但是能跑就行。总的来说实现了以下功能:

  • 对斜体和粗体的转换

  • 对<font>标签中的颜色代码转换

  • 一定程度上可用的自动换行

在这过程中加了几个样式,有类似需求的朋友可以自行取走:

接着用Arctime做了一些注释文本,导出后手动调整了一会样式。

注意:ASS中的字幕,时间点可以重合,layer不能重合,否则可能导致行为异常;ASS的字幕不要求顺序,只要字幕和时间点对应好即可。

导出

本来这个视频是十一点多就该发出去的,然而因为导出问题颇费了一些多余的时间。

我首先尝试的是VLC导出,主要是因为Google出了一个YouTube教程视频,教你用VLC的流导出功能变相实现渲染。

然后我一如既往的上了腾讯云的服务器,32核64G,结果导出一看视频直接损坏,虽然大小是差不多的。我反复导出了好几次仍然不行。

注意:VLC实际上是支持的,但是我严重怀疑可能是我服务器因为是临时开临时用的,相关编码器和library环境没配置好导致导出失败。我之前在上面用必剪的时候也是出现视频无法预览和导出的问题。我后来用我电脑同时跑渲染,最后是能播放的。

接着,我又将目光转向了PotPlayer的视频录制功能。但是因为服务器天生对音频支持不佳,PotPlayer的视频录制功能GG。

绝境时,我又查了一下关于“硬嵌入ASS字幕”的方法,一篇标题为“Hardsub .ass file into any video just using VLC 2.2.1”(仅使用VLC 2.2.1硬嵌入.ass文件到任意视频中)的Reddit帖子,其中的方法在这里复述如下,供各位自取:

  1. 打开VLC播放器,右上“媒体”->“转换/保存...”

  2. 在“文件选择”下添加视频文件,然后勾选“使用字幕文件”,选择你的ASS字幕

  3. 单击“转换/保存”按钮

  4. 在“设置”下勾选“显示输出”,然后选择文件目标位置

  5. 单击配置文件选项旁的“扳手”图标,切换到“字幕”选项卡,勾选“字幕”及“将字幕覆盖在视频上”

  6. 单击“开始”

请注意这个方法相当于把视频全部播放一遍,也就是说这一过程的持续时间与视频的时长相等。发帖的Reddit网友表示也不知道为什么,但至少这样能用。

能用吗?

还是不行。在我投稿上去后,我发现VLC的视频疑似在B站转码后会导致音视频轨道错位,开头约3~4秒左右的视频被吃掉了。

我没有发现这个问题的原因是因为我当时在本地播放时完全正常的。

另:YTB大部分视频目前均为AVC1格式。

我后面觉得可能是编码问题(VLC输出仍然是avc1),于是重新开了台机子把VLC输出的视频转换成H265(因为avc1本质上也是H264的一种,如果用ffmpeg编码H264的话可能还是一样编码)。后面投就投上去了,播放也正常。(此内容修改于2022/02/01)

结束

然后视频就整完了。然后能放。

在云服务器内将渲染好的视频文件上传放到同一地域下的COS存储桶内,然后再在家里的机子这边下载回来就好。

因为我是腾讯云COS早期用户,所以我有每月50G存储、10G外网下行的福利;除了服务器租赁几乎没有成本。


希望能给你有所帮助。


ASS特效/转码/压制折腾笔记的评论 (共 条)

分享到微博请遵守国家法律