本文图有些多😣

写在前面

为了重新利用一台闲置的Lumia旧手机,决定压制一些老电影放到旧手机上观看,受限于旧手机的性能吃紧也不支持外挂字幕,遂开始折腾起StaxRip,自己动手学习视频压制;

本文仅记录添加硬字幕相关的步骤,其他选项的调整和导出参数等等适当省略

用到的工具和文档和其他链接🤔

StaxRip

https://github.com/staxrip/staxrip

Vapoursynth

https://github.com/vapoursynth/vapoursynth

hardcoding an .ass sub doesn't work. Github - issue

https://github.com/staxrip/staxrip/issues/159

NVEncC_Options

https://github.com/rigaya/NVEnc/blob/master/NVEncC_Options.en.md#--vpp-subburn-param1value1param2value2

StaxRip是什么?

StaxRip是多个工具如x265, NVEnc, mkvmerge, ffmpeg等的gui,还可以通过VapourSynth脚本对视频画面进行处理,如裁剪视频黑边,超分/降采样,加硬字幕,降噪、锐化、调色等。

准备工作

初打开软件设置可能会发现如下问题:设置中的部分文本不能显示

只有选项框而文本不见了

不过这个文本显示的问题好像只在我的设备上出现,因为我没有看到过其他人有反馈类似的问题,如果你也不幸遇到了,这里提供一个我的解决办法:

打开StaxRip后在顶栏找到Tools,找到Tools-Settings-User Interface-UI Fallback选项,设置为 True ,正常显示如下:

文本正常显示🥳

方法一

单击StaxRip主界面中间左侧的AVS Filiters一栏空白处,按下图选择更改为Vapoursynth

AVS Filiters 会变为 VS Filiters,如下图

我们只会用到Source Resize Subtitle三个滤镜,其他可以先删除

接下来按Ctrl + H快捷键添加硬字幕滤镜,也可以通过菜单栏添加:

添加字幕滤镜

添加字幕时会弹出如下选项框:

选择第一项TextSubMod ,为什么不选第二个因为在我的设备上不能成功加上字幕,原因我也没搞清楚/鬼脸

到这里字幕应该就成功加上了,顶栏上有个Preview,可以预览视频中字幕是否成功加上,其他如输出分辨率,编码等等根据个人需求调整,还需要注意的一点是,如果你用的是n卡,选择了nvidia优化的h264编码,请按下图将编码器选择为Avisynth/Vapoursynth(可以选NVEnc Hardware吗?可以,请看方法二)

接下来导出,不出意外的话。你可以得到一部带硬字幕的视频

存在什么问题吗?

有,太慢了!

以这样一部重庆森林为例:按上面的方式输出一部480p的视频,在我的设备上(12700kf,3080ti)花了大概十五分钟,那如何能更快呢?答案是NVEnc

方法二

方法二来源于这里,StaxRip项目下的一个Issue

到添加硬字幕滤镜前都与方法一相同,额其实也就只有更改为vapoursynth这一步/捂脸,为什么要改为vapoursynth因为:

目前来看VapourSynth正在全面取代AviSynth,越来越多的字幕组开始使用VapourSynth进行视频处理。滤镜数量上也已经可以满足大部分需求,还有官方的包管理器,还跨平台,还对多核心支持更出色...

VapourSynth为什么还取代不了AviSynth? - 妹空酱的回答 - 知乎 https://www.zhihu.com/question/24085804/answer/1398820638

为了使用NVEnc编码,我们不能通过Vapoursynth来添加字幕滤镜,原因如下(来自StaxRip原作者的回答):

The decoding encoding scheme you are applying, is an almost direct link between HW decoder and encoder. So Almost all filters of AviSynth and Vapoursynth will not work, like color correction, noise filtering, and the subtitle filter. This is why it is recommended to use AviSynth/VapourSynth decoder.

Besides, the HW decoder cannot decode all the formats that the Avisynth/Vapoursynth decoders do.
And I am surprised it can decode 10 bits... You must have a very recent nvidia chip.

翻译一下:nv优化过的编解码器方案为提高效率几乎是编码器与硬件之间的直接链接,这导致Vapoursynth几乎所有的滤镜(包括字幕滤镜)失去了效果,所以不能像方法一那样通过字幕滤镜来添加字幕,幸运的是,仍然有其他方式:

subburn参数

如上图:找到这个Subburn参数,顾名思义:subtitle burn in,如何使用呢?请看文档,你也可以在这里找到文档:

帮助文档

文档原文这一段比较长,就不放图了,最简单的用法如下:

注意!原文档是这样写的:

--vpp-subburn filename="subtitle.sup"

如果你直接这样写上去,通过下面的代码高亮你可以明显的看到有问题

即便你改成这样:

运行的时候仍然会报错找不到字幕文件,解决办法是,将字幕文件放到一个没有空格或者中文的路径下,去掉引号直接filename=路径 ,如下:

最后:

不出意外的话,你也可以得到一部带有硬字幕的影片,体积甚至要稍小一些,还是以上面的重庆森林为例,这次只花了两分半✌️

  • 方法二只能处理UTF-8格式的字幕文件,不然运行的时候会疯狂输出subburn: Failed to decode subtitle最后输出的视频也是没有字幕的
log👆
  • 字幕样式会严格按照ass文件中定义的样式来渲染,如何改ass字幕的样式就不在本文讨论范围了,可以看看这篇文章,如果是srt格式的字幕想要以特定样式渲染可以通过TextFile(方法一中在我的设备上无效的方式)的style属性定义样式,完整文档在这里
  • Staxrip也有保存预设的功能,将以上的步骤保存为一个预设的话,下次加硬字幕仅需加载视频文件,加载字幕文件两步;staxrip也支持执行多个任务,批量操作还是非常方便。但是不得不说的是整个软件的操作逻辑确实值得优化🤦,初看上去还是挺懵的;

最后

笔者还是学生,课余时间接触一下视频压制,上文如有错误欢迎指正,非常感谢