b8b41e3c 发表于 2022-4-26 11:55:37

mkvtool:一个ass字幕子集化/mkv文件处理一条龙工具

本帖最后由 b8b41e3c 于 2024-10-8 15:53 编辑

是一个自用为主的超级缝合怪
v5版本已发布,更易用的命令行风格.
v5.5.0版本已发布,性能更好,无需FontTools以及自带ASS转PGS.(仅自动化提供Windows,macOS,Linux的amd64及arm64架构的可执行文件.)
从v5.5.9起,将以字幕用到的所有字体文件为单位,取出这些字体文件的共用字体名作为子集化后的新字体名,以解决一些奇葩字幕因为子集化后分配了错误的新名字而导致"缺字"的问题.
从v5.6.3起,将默认对字体名混用的字幕报错,可用--no-font-check-strict来忽略.

下载:
https://github.com/MkvAutoSubset/MkvAutoSubset/releases
GUI版本:
https://github.com/MkvAutoSubset/MkvAutoSubset/releases/download/gui/mkvtool-win64.zip
Docker:
https://github.com/MkvAutoSubset/MkvAutoSubset?tab=readme-ov-file#docker%E9%95%9C%E5%83%8F%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8E
Win64的所有依赖:
https://github.com/MkvAutoSubset/MkvAutoSubset/releases/download/win64_assets/win64_assets.zip
(用法:下载并解压,运行"install.bat")

什么叫字幕字体子集化
[*]这里说的字幕特指ass(ssa)这种带有特效的文本字幕;
[*]ass字幕会引用一些字体,这些字体在播放器所在的系统里可能有安装,也可能没有;
[*]为了实现在任意地方都能有完整的视觉体验,可以把字幕以及字幕里所引用的字体文件一起打包进mkv文件里;
[*]以上的操作存在一个问题,有些字幕会引用很多字体,这些字体文件体积动辄几十MB,而字幕只用到了其中的几个字而已;
[*]比如一个番剧本体200M,但打包了字体文件后变成400M了,这像画吗?
[*]综上所述,子集化的目的就是把字体拆包,找出字幕用到的那部分字形并重新打包;
[*]好处不仅限于节约存储空间,加快缓冲速度;
[*]想想看:在一个只有30Mbps上传的网络环境下,要看上面那个光字体就200M的番剧,这河里吗?



主要功能

1. 列出.ass字幕实际用到的字体(在建立了字体缓存的情况下可以复制对应字体到指定目录)
2. 根据ass字幕内容对字体进行子集化
3. ass字幕转pgs
4. 从mkv文件导出字幕和字体
5. 将字幕和字体封装进mkv
6. 查看一个字体包含的字体名和族名
7. 生成测试用视频(可指定源亦可生成空白视频,字幕可内封亦可烧录.)



详细使用方法请看:
https://github.com/MkvAutoSubset/MkvAutoSubset


关于字幕解析的说明

1. 支持\b \i \r \fn以及style里的bold,italic
2. 支持字体fallback,例:不存在的时候会fallback到

关于字幕默认轨道的说明

1. v4.3.2以前的版本,根据mkvmerge的版本,可能会出现有多轨字幕时,输出的mkv文件里所有的字幕轨道都被设置成默认轨道.这个问题在v4.3.2得到解决.
2. 处理方式是如果字幕文件名不以"#"开头,将去掉该字幕默认轨道的标志.换而言之,如果一个mkv里的字幕的文件名都不以"#"开头,那么这个mkv文件就没有默认的字幕轨道.

温馨提醒

这个工具近期因为如上的字幕解析修改过解析器的部分,希望能有更多的样本测试健壮性,请大家多多反馈。
另提供sdk,欢迎二开(比如做个gui版本,原有的已弃坑,仅更新依赖库.),也欢迎pr。


详情:
https://github.com/MkvAutoSubset/MkvAutoSubset/tree/master/mkvlib/c

另应楼下要求提供一个ass2mks的脚本,虽然我并不喜欢这种东西。

StarRingChild 发表于 2022-4-26 14:25:32

本帖最后由 StarRingChild 于 2022-4-26 14:41 编辑

mkv 里要封装有字幕和字体才行是吗,像这种文件结构,字幕和字体单独存放,而且视频还是 MP4 就没法用吗。我觉得其实也可以导出子集化之后的 mks 文件,最好不要动视频文件。

├── Amagi Brilliant Park - 01.mp4
├── Amagi Brilliant Park - 02.mp4
├── Amagi Brilliant Park - 03.mp4
├── Amagi Brilliant Park - 04.mp4
├── Amagi Brilliant Park - 05.mp4
├── Amagi Brilliant Park - 06.mp4
├── Amagi Brilliant Park - 07.mp4
├── Amagi Brilliant Park - 08.mp4
├── Amagi Brilliant Park - 09.mp4
├── Amagi Brilliant Park - 10.mp4
├── Amagi Brilliant Park - 11.mp4
├── Amagi Brilliant Park - 12.mp4
├── Amagi Brilliant Park - 13.mp4
├── Amagi Brilliant Park - 14.mp4
├── Amagi Brilliant Park - Subs
│   ├── Amagi Brilliant Park - 01.ass
│   ├── Amagi Brilliant Park - 02.ass
│   ├── Amagi Brilliant Park - 03.ass
│   ├── Amagi Brilliant Park - 04.ass
│   ├── Amagi Brilliant Park - 05.ass
│   ├── Amagi Brilliant Park - 06.ass
│   ├── Amagi Brilliant Park - 07.ass
│   ├── Amagi Brilliant Park - 08.ass
│   ├── Amagi Brilliant Park - 09.ass
│   ├── Amagi Brilliant Park - 10.ass
│   ├── Amagi Brilliant Park - 11.ass
│   ├── Amagi Brilliant Park - 12.ass
│   ├── Amagi Brilliant Park - 13.ass
│   ├── Amagi Brilliant Park - 14.ass
│   └── Fonts
│       ├── Source Han Sans JP Medium.otf
│       ├── SourceHanSansCN-Medium.ttf
│       ├── msyh.ttc
│       ├── msyhbd.ttc
│       └── 宋体 & 新宋体.ttc


b8b41e3c 发表于 2022-4-26 16:27:34

本帖最后由 b8b41e3c 于 2022-4-26 16:59 编辑

StarRingChild 发表于 2022-4-26 14:25
mkv 里要封装有字幕和字体才行是吗,像这种文件结构,字幕和字体单独存放,而且视频还是 MP4 就没法用吗。 ...
你可以使用-c模式,按照说明里的文件树布局,详情:
https://github.com/MkvAutoSubset ... 8%E7%A4%BA%E4%BE%8B
即使是非mkv也可以用-c模式,但用到抽取功能的仅限mkv。

StarRingChild 发表于 2022-4-26 17:00:30

b8b41e3c 发表于 2022-4-26 16:27
你可以使用-c模式,按照说明里的文件树布局,详情:
https://github.com/MkvAutoSubset ... 8%E7%A4%BA%E4% ...

跑起来了,但是没跑成
https://tva1.sinaimg.cn/large/e6c9d24egy1h1n8akyh72j21wr0u0dz9.jpg

b8b41e3c 发表于 2022-4-26 17:10:30

本帖最后由 b8b41e3c 于 2022-4-26 17:12 编辑

StarRingChild 发表于 2022-4-26 17:00
跑起来了,但是没跑成
更新一下程序,另外你的字体好像有问题。遇到有问题的字体要是子集化出错了是不会出成品的。

StarRingChild 发表于 2022-4-26 17:16:15

b8b41e3c 发表于 2022-4-26 17:10
更新一下程序,另外你的字体好像有问题。遇到有问题的字体要是子集化出错了是不会出成品的。
...

请问可以增加导出 mks 的选项吗

b8b41e3c 发表于 2022-4-26 19:15:26

StarRingChild 发表于 2022-4-26 17:16
请问可以增加导出 mks 的选项吗

v3.4.3支持,请更新。具体用法见README.md


StarRingChild 发表于 2022-4-26 19:46:12

本帖最后由 StarRingChild 于 2022-4-26 19:47 编辑

b8b41e3c 发表于 2022-4-26 19:15
v3.4.3支持,请更新。具体用法见README.md
https://i.imgur.com/hnVXdOd.jpg
所有的字幕文件都只用到了同一种字体,文件也没有问题
mkvtool -mks -s .依然报错
2022/04/26 19:45:13 Failed to get the mkv file info: "v/ Fruits Basket 2nd Season .mkv".
2022/04/26 19:45:13 Failed to dump the mkv file "v/ Fruits Basket 2nd Season .mkv".
2022/04/26 19:45:13 Dump (1/25) done.按理来说,导出 mks 只需要字幕文件和字体文件,为什么会读取 mkv 文件呀

b8b41e3c 发表于 2022-4-26 20:03:05

StarRingChild 发表于 2022-4-26 19:46
所有的字幕文件都只用到了同一种字体,文件也没有问题
mkvtool -mks -s .依然报错
按理来说,导出 mks...
你的需求应该用-c模式,你一直在用标准工作流.仔细看看说明啊.

StarRingChild 发表于 2022-4-26 20:21:27

b8b41e3c 发表于 2022-4-26 20:03
你的需求应该用-c模式,你一直在用标准工作流.仔细看看说明啊.

你再补充下文档吧,-c 模式基本上只字未提,我一开始就加了 -c 什么都没有发生才换到工作流模式的。
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: mkvtool:一个ass字幕子集化/mkv文件处理一条龙工具