ASS字幕字体子集化 ASS转PGS MKV批量提取/生成
- 这里说的字幕特指ass(ssa)这种带有特效的文本字幕;
- ass字幕会引用一些字体,这些字体在播放器所在的系统里可能有安装,也可能没有;
- 为了实现在任意地方都能有完整的视觉体验,可以把字幕以及字幕里所引用的字体文件一起打包进mkv文件里;
- 以上的操作存在一个问题,有些字幕会引用很多字体,这些字体文件体积动辄几十MB,而字幕只用到了其中的几个字而已;
- 比如一个番剧本体200M,但打包了字体文件后变成400M了,这像画吗?
- 综上所述,子集化的目的就是把字体拆包,找出字幕用到的那部分字形并重新打包;
- 好处不仅限于节约存储空间,加快缓冲速度;
- 想想看:在一个只有30Mbps上传的网络环境下,要看上面那个光字体就200M的番剧,这河里吗?
- 用C重新实现了字幕处理功能
- 不再依赖基于Python的FontTools工具进行子集化
- 不再依赖ass2bdnxml工具进行ASS转PGS
- 不再强制需要其他的工具依赖:
- MKVToolNix:涉及抽取/混流操作时,依然需要
- FFmpeg:涉及生成测试视频时,依然需要
- 丧失了方便地跨平台编译的能力
- 目前只自动化提供Windows,macOS,Linux三个平台的amd64及arm64架构的执行文件
- 其他平台请自行编译
- 从Dockerhub获取
FONT_DIR="/usr/share/fonts/truetype" #字体目录 CACHE_DIR="${HOME}/.mkvtool/caches" #缓存目录 OTHER_DIR="" #其他目录(可选,示例见下节.) docker pull ac79b0c6/mkvtool #拉取/更新镜像 docker run --rm -it -v ${FONT_DIR}:/fonts -v ${CACHE_DIR}:/root/.mkvtool/caches ${OTHER_DIR} ac79b0c6/mkvtool #运行镜像
- 手动构建&运行
git clone https://github.com/MkvAutoSubset/MkvAutoSubset.git #克隆项目 cd MkvAutoSubset #进入项目目录 sh docker/rebuild.sh #构建镜像 cp docker/run.sh docker/run_my.sh #拷贝一份自己的运行脚本 vi docker/run_my.sh #修改自己的运行脚本(可选) sh docker/run_my.sh #运行镜像
- docker/run_my.sh的修改说明
- FONT_DIR: 字体文件目录
- CACHE_DIR: 缓存目录
- OTHER_DIR: 其他目录(可选)
- 示例:“-v ${HOME}/work:/work”
- 从Dockerhub获取:
TAGNAME=next #使用next分支的镜像
DIST_DIR="${HOME}/mkvtool_dist" #编译结果目录
docker pull ac79b0c6/mkvtool-builder:${TAGNAME} #拉取/更新镜像
docker run --rm -it -v ${DIST_DIR}:/dist ac79b0c6/mkvtool-builder:${TAGNAME} #运行镜像
- 手动构建&运行:
git clone https://github.com/MkvAutoSubset/MkvAutoSubset.git #克隆项目
cd MkvAutoSubset #进入项目目录
sh builder-docker/run.sh #构建并运行镜像
- 请确保已经安装了go,gcc,vcpkg,dotnet
- 以上项目都在PATH环境变量里
- 将vcpkg的路径添加到环境变量 VCPKG_ROOT
- 运行根目录的编译脚本
- 成品在build目录下
-
- mkvtool-cli:命令行版本可执行文件
- mkvtool-gui:GUI版本可执行文件
- mkvtool.so:可用于二次开发的动态链接库 SDK调用文档
- 注意:mkvtool-gui 需要和 mkvtool.so 在同一目录下才能正常运行,另外 libHarfBuzzSharp 和 libSkiaSharp 也是 mkvtool-gui 的依赖库,要使用GUI版本这些文件也需要在同一目录下.
- 前置操作同上
-
cd MkvAutoSubset/mkvtool go mod tidy VCPKG_ROOT="${HOME}/vcpkg" #你的vcpkg路径 export VCPKG_DEFAULT_TRIPLET="x64-linux-release" #你的vcpkg triplet三元组 export VCPKG_BUILD_TYPE="Release" ${VCPKG_ROOT}/vcpkg install fribidi freetype[core,zlib,png] harfbuzz[core,experimental-api] ${VCPKG_ROOT}/vcpkg install libass #安装依赖 PATH_ROOT="${VCPKG_ROOT}/installed/${VCPKG_DEFAULT_TRIPLET}" H_PATH="${PATH_ROOT}/include" L_PATH="${PATH_ROOT}/lib" export CGO_CFLAGS="-I${H_PATH} -DHB_EXPERIMENTAL_API -Os" export CGO_LDFLAGS="-L${L_PATH} -static -lass -lfreetype -lm -lz -lfontconfig -lpng -lfribidi -lharfbuzz -lharfbuzz-subset -lexpat" go build #编译
- MKVToolNix - 用于提取/混流字幕和字体
apt install mkvtoolnix #Debian/Ubuntu apk add mkvtoolnix #Alpine brew install mkvtoolnix #macOS
- FFmpeg - 用于生成测试视频/烧录字幕
apt install ffmpeg #Debian/Ubuntu apk add ffmpeg #Alpine brew install ffmpeg #macOS
- 从 这里 下载并安装MKVToolNix
- 从 这里 下载并安装ffmpeg
- 保证以上两个依赖项的相关可执行文件(mkvextract.exe,mkvmerge.exe,ffmpeg.exe)在 path 环境变量里