Mkv Auto Subset
ASS字幕字体子集化 MKV批量提取/生成
TAGNAME=master FONT_DIR="/usr/share/fonts/truetype" #字体目录 CACHE_DIR="${HOME}/.mkvtool/caches" #缓存目录 OTHER_DIR="" #其他目录(可选,示例见下节.) docker pull ac79b0c6/mkvtool:${TAGNAME} #拉取/更新镜像 docker run --rm -it -v ${FONT_DIR}:/fonts -v ${CACHE_DIR}:/root/.mkvtool/caches ${OTHER_DIR} ac79b0c6/mkvtool:${TAGNAME} #运行镜像
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 #运行镜像
apt install fonttools #Debian/Ubuntu apk add py3-fonttools #Alpine brew install fonttools #macOS pip install fonttools #Use pip
apt install mkvtoolnix #Debian/Ubuntu apk add mkvtoolnix #Alpine brew install mkvtoolnix #macOS
mkvtool -a2p -apc -pr 1920*1080 -pf 23.976 ...xxx... #-a2p: 启用ass转pgs(依赖ass2bdnxml) #-apc: 使pgs字幕与子集化后的ass字幕共存(该选项会影响混流行为) #-pr: 设置pgs字幕的分辨率(例如"720p,1080p,2k"或者类似"720*480") #-pf: 设置pgs字幕的帧率(例如"23.976, 24, 25, 30, 29.97, 50, 59.94, 60"或者类似"15/1")
mkvtool -no ...xxx... #-no: 当存在"-no"参数时将不覆盖已有文件
mkvtool -ncks ...xxx... #检查模式:在字体子集化前检查对应字体文件是否确实包含所需要的字形,如有遗失会提醒. #严格模式:如目标字体文件未包含所需的全部字形则会跳过匹配. #-ncks: 当存在"-ncks"参数时将禁用严格模式 #-nck: 当存在"-nck"参数时将禁用检查模式
mkvtool -i path #path: 字体文件路径,输出字体文件包含的所有名称和族信息.
mkvtool -t "-" ...xxx... #-t: 当"-t"参数不为空时,将在子集化输出目录创建测试视频. #当"-t"的值为"-"时,将创建和字幕等长的空视频(依赖ffmpeg). #-b: 当存在"-b"参数时,会将ass字幕烧录进视频(依赖ffmpeg). #-e: 启用烧录模式时,指定编码器,如"libx264","h264_qsv","nvenc_h264"等,默认为"libx264".
mkvtool -n ...xxx... #-n: 当存在"-n"参数时将仅创建字体的子集化版本.不对字体名称进行修改.
mkvtool -mks ...xxx... #-mks: 启用MKS格式输出
mkvtool -cc -s input #从${input}获取字体信息并创建缓存 #可选"-cp"参数:指定缓存文件的保存目录. #可选"-clean"参数:清空缓存目录.
mkvtool -l -s input #从${input}目录获取 mkvtool -l -f file #从${file}文件获取 #可选"-cfc"参数:当"-cfc"存在时,将从字体缓存中复制需要的字体到指定目录. #可选"-co"参数:指定字体复制的目标目录. #可选"-cp"参数:指定要使用的缓存目录.
mkvtool -s bangumi #从${bangumi}文件夹抽取所有mkv文件的字幕和字体, #遇到ass字幕就自动进行子集化, #输出替换字幕和字体后的新mkv文件. #-data参数默认值为"${workdir}/data",指定提取mkv的输出文件夹. #-dist参数默认值为"${workdir}/dist",指定重组后mkv的输出文件夹.
mkvtool -d -f file.mkv #单个文件 mkvtool -d -s bangumi #文件夹 #可选"-n"参数:当"-n"存在时,只抽取内容,不进行子集化操作. #可选"-data"参数,指定输出文件夹,默认输出到"${workdir}/data".
mkvtool -q -f file.mkv #单个文件,会直接输出是否需要子集化 mkvtool -q -s bangumi #文件夹,会将需要子集化的文件列表输出至"${workdir}/list.txt".
mkvtool -m -s bangumi -data data -dist dist #-data参数默认值为"${workdir}/data",字幕和字体的数据文件夹. #-dist参数默认值为"${workdir}/dist",重组后mkv的输出文件夹. #假设bangumi文件夹里的目录结构如下所示: #bangumi # |-- S01 # ||-- abc S01E01.mkv # ||-- abc SxxExx.mkv # |-- SP.mkv # |-- xx.mkv #那么对应的data文件夹的目录结构应该是如下的所示: #data # |-- S01 # ||-- abc S01E01 # |||-- ... # |||-- subsetted # |||-- xxx.sub # ||-- abc SxxExx # |||-- ... # |||-- subsetted # |||-- xxx.sub # |||-- ... # |-- SP # |||-- ... # |||-- subsetted # |||-- xxx.sub # |||-- ... # |-- xx # |||-- ... # |||-- subsetted # |||-- xxx.sub # |||-- ... #*奇淫巧技:指定一个没有任何内容的data文件夹,将输出一个"干净"的mkv文件.
mkvtool -c -s bangumi #可选"-clean"参数:当"-clean"存在时,将清空原有的字幕和字体(默认为追加). #bangumi文件夹里的目录结构应如下所示: #bangumi # |-- v # ||-- aaa.mkv # ||-- bbb.mp4 # ||-- ccc.avi # |-- s # ||-- aaa.ass # ||-- aaa.srt # ||-- aaa.sup # ||-- aaa.xxx # ||-- bbb.xxx # ||-- ccc.xxx # |-- f # ||-- abc.ttf # ||-- def.ttc # ||-- ghi.otf # ||-- ... #若遇到ass字幕会自动进行子集化操作. #成品会放在"${bangumi}/o"文件夹中.
mkvtool -a aaa.ass -a bbb.ass -af fonts -ao output [-ans] #"-a"参数为ass字幕文件路径,可复用. #"-af"参数为字体文件夹路径,默认值为"${workdir}/fonts". #"-ao"参数为子集化成品输出路径,默认值为"${workdir}". #*当"-ans"参数存在时输出文件夹为"${output}",否则为${output}/subsetted". #*由于会预先清空${output}文件夹,为了安全请慎用"-ans".
-sl:字幕语言.格式为语言缩写如"chi","jpn","eng"等,默认值为"chi". -st:字幕标题.该字幕在播放器里显示的标题,默认值为空.
抽取出来的字幕长得像是如下的样子: a_b_c.d a:轨道编号(在"-c"模式里,这里应该和视频文件的文件名相同.) b:字幕语言代码 c:字幕标题 d:字幕文件后缀名 那么,请体会在"-c"模式中,以下的命名方式所带来的便利: |-- v ||-- aaa.mp4 |-- s ||-- aaa_chi_简体中文.ass ||-- aaa_chi_繁體中文.srt ||-- aaa_jpn_日本語.sup ||-- aaa_eng_English.srt