QH7B
发表于 2024-9-3 09:02:21
b8b41e3c 发表于 2024-9-2 17:38
mkvtool v5.5.5起已经支持对assfonts重命名字体后的ass文件直接进行子集化,无需还原字体名称.
...
非常感谢!这样修改字幕就不用考虑字体了。另外楼上提出的问题我也很费解,各种查阅资料都查不到 \r0 \fn0 这种用法,还有经常会遇到下面这种封装后会导致成品时长异常的代码:
Dialogue: 0,1:59:51.04,1:59:51.54,OPJP,,0,0,0,fx,{\an5\fad(0,500)\c&HE13F0E&\move(664, 1039, 644, 1030)}愛
一直找不到完美的解决方法,虽然添加--stop-after-video-ends参数可以临时解决,但是这样做可能会导致其他轨道数据丢失。
b8b41e3c
发表于 2024-9-3 11:01:05
本帖最后由 b8b41e3c 于 2024-9-3 11:03 编辑
QH7B 发表于 2024-9-3 09:02
非常感谢!这样修改字幕就不用考虑字体了。另外楼上提出的问题我也很费解,各种查阅资料都查不到 \r0 \fn ...
"\r"是恢复到当前行定义的样式
"\r<style>"是用名叫"<style>"的样式覆盖当前样式
"\r0"在mkvtool里也会报错的(找不到样式"0"),但"\fn0"不会,因为遇到"\fn"或者"\fn0"的时候会用当前行定义的样式去覆盖.(这在spec文档里没写, 但有人说是约定成俗的内容,于是我就这么处理了.)
至于混流的问题就和子集化操作不相关了.
QH7B
发表于 2024-9-3 11:56:16
b8b41e3c 发表于 2024-9-3 11:01
"\r"是恢复到当前行定义的样式
"\r"是用名叫""的样式覆盖当前样式
"\r0"在mkvtool里也会报错的(找不到样式 ...
也就是说遇到 \r0 这种用法报错,直接用记事本替换成 \r 就行了是吗?还有成品时长问题确实和子集化无关,只是这个问题困扰我很长时间,想当题外话请教一下,没有其他意思。
b8b41e3c
发表于 2024-9-3 12:39:04
本帖最后由 b8b41e3c 于 2024-9-3 12:40 编辑
QH7B 发表于 2024-9-3 11:56
也就是说遇到 \r0 这种用法报错,直接用记事本替换成 \r 就行了是吗?还有成品时长问题确实和子集化无关 ...
不是很清楚有没有所谓约定成俗的内容,如果"\r0"等同于"\r"(就像约定成俗"\fn0"等同于"\fn")的话,是可以的.
混流问题我也不太清楚,我本人一直坚持ass转pgs然后再混流进mkv.
QH7B
发表于 2024-9-5 14:13:06
b8b41e3c 发表于 2024-9-2 17:38
mkvtool v5.5.5起已经支持对assfonts重命名字体后的ass文件直接进行子集化,无需还原字体名称.
...
发现了一个小问题,当 \fn 字体名后面有空格的情况,例如:
Dialogue: 0,0:09:34.70,0:09:37.10,Default,,0,0,0,,{\fnQEUXSHBL \bord0\c&HB1A4D9&\pos(652,126)\fad(300,300)}古桥公主和王子公开接吻计划
由于 QEUXSHBL 后面有个空格无法被还原,子集化时还是会提示缺少 QEUXSHBL 字体。
另外在调用 mkvmerge 混流时建议加上 --enable-legacy-font-mime-types 参数,标准的mime类型有些播放器不识别。
b8b41e3c
发表于 2024-9-7 11:18:31
本帖最后由 b8b41e3c 于 2024-9-7 11:25 编辑
QH7B 发表于 2024-9-5 14:13
发现了一个小问题,当 \fn 字体名后面有空格的情况,例如:
由于 QEUXSHBL 后面有个空格无法被还原,子 ...
关于空格的问题,是assfonts在取原字体名的时候忽略了后续空格,而子集化重命名字体的时候又没擦好屁股.可能作者认为播放器会自动忽略空格吧.这是assfonts的bug.硬要说的话,还是最初的ass文件写得不够规范.这个问题应该属于少见类.
mkvtool的字体名识别是比较严格的.毕竟在"\a<b>\c"中"<b>"里所有的内容都应该被识别成\a指令的参数.
--enable-legacy-font-mime-types 这个以前有人也建议过,但这个是区分版本的,如果有人用了旧版本的mkvtoolnix就会报错,所以为了保持一致性没加.到底是哪个播放器会出问题,至少PotPlayer和mpv系列的不会.
QH7B
发表于 2024-9-7 16:15:40
b8b41e3c 发表于 2024-9-7 11:18
关于空格的问题,是assfonts在取原字体名的时候忽略了后续空格,而子集化重命名字体的时候又没擦好屁股.可能 ...
主要是苹果设备的一些古老播放器,nPlayer之类的。不过用mkvpropedit批量转换也就几分钟的事,不集成那个参数也问题不大。
另外关于微软雅黑字体,系统自带的版本没有Semibold和Semilight字重,我能想到的处理方法是用FontForge提取自带版本的空格字符强行添加到超级字体整合包的版本里,也不知道这样生成的新字体子集化后播放器能不能识别。
b8b41e3c
发表于 2024-9-7 20:45:36
QH7B 发表于 2024-9-7 16:15
主要是苹果设备的一些古老播放器,nPlayer之类的。不过用mkvpropedit批量转换也就几分钟的事,不集成那个 ...
理论上是可以识别的,我字体兼容性是用PotPlayer+mpv测试的,其他的播放器没测试过,你也可以修改下源码把判断"\u0020"的部分去掉再编译,但这样至少PotPlayer会不正常了.(类似的还有必须至少包含一个字母,如果有数字,必须包含0-9这种奇葩的规则.)
chaos32767
发表于 2024-10-3 20:28:02
本帖最后由 chaos32767 于 2024-10-3 20:56 编辑
災情來自這裡:
【ListAssFonts: 小工具,分析字幕使用的字型 (2023/06/13 更新)】
https://bbs.acgrip.com/forum.php ... 56&extra=#pid110582
wyzdwdz
发表于 2024-10-3 21:00:21
本帖最后由 wyzdwdz 于 2024-10-3 21:07 编辑
QH7B 发表于 2024-9-2 08:04
感谢回复,期待新版本!另外下个版本能提供一个将字体改名处理后的ass文件还原的功能吗?就是把随机字体名 ...
字体改名后是无法还原的,因为这个改名是不可逆的。本工具生成的随机名会出现多对一的情况,即几个不同名称的字体子集化后的字体名改为相同的一个。字幕里面的 Assfonts Rename Info 仅仅是拿来作为参考,不能用这个来还原。
这样做的原因是处理粗体和斜体的情况,很多英文字体的正体、粗体、斜体分别对应不同的字体,比如 Arial 字体家族,它们的 family name 都是 Arial,一般我们使用的时候只需要写 Arial,但是实际上当我们在 ass 字幕中指定一个样式是粗体时,实际使用的是 Arialbd.ttf 字体,而不是 Arial.ttf。这时,软件在做子集化时,应该对于这个样式子集化 Arialbd.ttf 这个字体。
但是,如果同时字幕中还有一个样式也用的是 Arial 字体,却用的是普通版本,即 Arial.ttf ,那么对于这个样式,应该子集化 Arial.ttf。同样的,软件在给这些字体改名的时候,由于它们在字幕中对应的字体名称都是 Arial,所以改名后这些字体的名称也应该都是相同的。