FontLoaderSub: 加载ass/ssa字幕所需字体的小工具 (r7-20200525)
本帖最后由 yzwduck 于 2020-6-1 20:16 编辑字体整合包x 是个好东西,但实在不敢把里面所有的字体都装进 win10,直觉告诉我这会引发各种 bug。
每次遇到字幕缺字体时,要在3000+个字体中找到对应的文件,选中并拖到 FontLoader.exe 上,我觉得是一件头疼的事情(特别是缺了好几个字体的时候)。
因此写了一个工具来自动加载字幕所需要的字体,希望它也能给大家排上用场。
使用方法
1、将程序解压并移动到字体所在文件夹,它将会分析程序所在文件夹(和子目录)下面所有字体文件;
2、将字幕(或字幕所在的文件夹)拖动到程序图标上,或使用下文提到的快捷方式;
3、等待程序分析加载,完成后显示如下界面:
展开详细信息后,将显示每个字体名称和匹配的文件名,每行的前缀表示:
[*]: 加载成功,如没有显示路径则表示系统已安装/加载了该字体;
[*][^ ]: 加载的字体文件与上一个相同(无论加载是否成功);
[*][??]: 无匹配字体;
[*][ X]: 加载失败。
底部三个按钮分别可以:
[*]菜单/Menu: 里面有几个主界面上塞不下的小功能:更新索引、导出字体、帮助;
[*]确定/OK: 最小化;
[*]关闭/Close/Esc/Alt+F4: 卸载所有匹配的字体,并退出程序。
快捷方式
从帮助界面可以打开快捷方式管理,具体用法请参见上方传送门 PRO TIPs。
注意事项
1、杀毒软件可能会报毒,请谨慎判断,故设置解码密码以防止下载后即被删除,密码为 vcb-s 目前误报较少,不再设置密码;
2、为了避免反复扫描 3000+ 字体文件,程序会将扫描结果缓存到 fc-subs.db。如果新增/删除/修改了字体,请利用“重试”按钮来清除缓存;
3、只支持 Unicode 带 BOM 编码的 .ass/.ssa 字幕,且文件大小不超过 64MB;
4、字体名称匹配算法和 Windows 的不一样,所以部分字体名称可能无法匹配;
5、不支持 Windows XP。
许可协议
GPLv2: 可自由使用、修改、分发软件,并获取其源代码。
更新历史
r8-TBD
挖坑中:
1、支持 macOS;
2、改善崩溃提示;
3、至少 6 个月内更新一次;
测试版本传送门
r7-20200525
1、更新编译器;
2、修正没有忽略 \fn 与字体名称之间的空格的问题;
3、修正匹配字体时程序闪退(崩溃);
4、修正匹配字体时,没有找全 font family 所属字体。
r6-20191027
1、修正了全局字体变动通知,避免其他不响应消息的窗口造成本工具卡死;
2、调整同名字体加载的优先级,优先加载 TTC>TTF>OTF 格式(刷新缓存后生效);
3、新功能:导出加载的字体到指定文件夹;
4、繁中界面(感谢 VEWION 的帮助);
5、修正无法检测 UTF-8 编码字幕的 bug;
r5-20190429
1、支持使用 PostScript 名称查找字体(清除旧版缓存后生效);
2、改进了主界面的稳定性;
3、新功能:快捷方式管理;
4、中文界面 ( ﹁ ﹁ )
r4-20190222
1、参照 libass 重新实现了字幕解析;
2、改善了详细信息输出结果;
3、新功能:每 5 分钟缓存一遍被加载的字体内容,以防在播放视频时从硬盘读取字体造成卡顿。
r3-20190103
1、修正了卸载字体时没有使用绝对路径的 bug;
2、添加了字体版本信息,在存在多个版本字体时,将加载版本号最大的字体文件;
3、添加了多字重/字形支持,将加载可能用到的粗体/斜体等独立字体文件。
r2-20181113
1、修正了几个资源忘记释放的 bug;
2、修改了缓存文件的格式,只记录字体文件的相对路径,支持不同语言 Windows 共用一个缓存;
3、添加了字体加载的详细信息,忽略已在系统安装的字体。
v1-20181112
第一版。
虽然字体管理类软件不少,但还是希望播放器能聪明点,能读取特定文件夹的字体。 孤雨独火 发表于 2018-11-12 21:21
虽然字体管理类软件不少,但还是希望播放器能聪明点,能读取特定文件夹的字体。 ...
Potplayer 可以加载位于安装目录 /Fonts 下的字体文件。
自动化按需临时挂载字体,赞 win10有font cache service 加载后的字体即使卸载了也可以使用(每次重启清空cache)
那么可以不可以出一个版本 加载后直接卸载并退出 利用字体缓存实现这个功能? kiriz 发表于 2018-12-30 16:04
win10有font cache service 加载后的字体即使卸载了也可以使用(每次重启清空cache)
那么可以不可以出一个 ...
win10有font cache service 加载后的字体即使卸载了也可以使用(每次重启清空cache)
我搜索了一下,没能找到 font cache service 相关的技术介绍,也没能找到控制方法。
怀疑“字体卸载后仍然可以使用”是有限制条件的:卸载后,哪些状态的应用程序,能通过哪些方法使用这些字体?
我猜测只有已打开的字体句柄才能在卸载后继续使用,而播放器加载字幕时要重新打开字体是会失败的。
如果存在控制字体缓存的方法,或者上面的猜测有误的话,希望能提供一些具体的线索;如果可行的话,我会尽力将其实现。
yzwduck 发表于 2018-12-31 08:49
我搜索了一下,没能找到 font cache service 相关的技术介绍,也没能找到控制方法。
怀疑“字体卸载后 ...
我没有具体研究过这个service,但从现象上来看是可以用的
重启电脑后第一次使用FontLoaderSub加载字体
可以看到字体都是临时加载的 但是close后看视频仍能正确识别字体
关闭视频 尝试第二次加载字体
显示的是从系统中找到了相应字体 虽然不知道你这个查找字体具体是怎么实现的 总之它就是找到了
close后看视频也能够正确识别字体 而且在word/adobe等软件中仍能够使用
但是另一位坛友@tonyhsie 做的ListAssFonts 在关闭你的FontLoaderSub之后 是无论如何都找不到这些字体的(工具链接http://bbs.acgrip.com/thread-1894-1-1.html
用nexusfont也无法看到缓存的字体
然后这个Windows Font Cache Service从windows7开始可以使用 Windows8.1开始默认启用
Optimizes performance of applications by caching commonly used font data. Applications will start this service if it is not already running. It can be disabled, though doing so will degrade application performance.
cache的路径在 C:\Windows\ServiceProfiles\LocalService\AppData\Local\FontCache
此外就没有找到更多的说明文档了
在你的机器上不能利用cache使用挂载过的字体吗?
本帖最后由 yzwduck 于 2018-12-31 20:39 编辑
kiriz 发表于 2018-12-31 18:37
我没有具体研究过这个service,但从现象上来看是可以用的
重启电脑后第一次使用FontLoaderSub加载字体
你的电脑环境好像有点异常:无法卸载临时字体,但我无法判断是来自 FontLoaderSub 的问题,还是你的电脑系统问题。
建议使用整合包 X 里附带的 FontLoader 来测试一下,具体步骤是:
[*]重启操作系统;
[*]使用 FontLoader 临时加载一个没有安装过的字体;
[*]打开 WordPad 之类能改字体的文本编辑器,输入一段汉字,并使用该字体;
[*]关闭第 2 步中的对话框;
[*]在第 3 步打开的编辑器中,继续输入一些汉字,检查字体是否有变化。
预期的结果应该是:第 3 步将会使用选定的字体显示,第 5 步会使用系统默认的 fallback 字体显示。
我在 win10 1803 (10.0.17134.472) 和 win10 1809 (10.0.17763.195) 测试了一下,都是这个行为。
你的系统可能在第 5 步产生不一样的结果,如果字体没有变化的话,应该是你的电脑系统的特例问题;
也可能是我对这个 API 理解有误,如果可以的话,希望能在多个不同环境的系统上测试一下。
FontLoader 和 FontLoaderSub 都是使用 AddFontResource 和 RemoveFontResource 来实现字体加载和卸载的,
FontLoaderSub 使用 EnumFontFamilies 来检测系统中是否已安装字体,实现方法在 main.c 的 235 行(貌似我没法贴链接…)
ListAssFonts 没有公开源代码,不好判断它是如何检测系统安装字体。
追加1:我试着在禁用 Windows Font Cache Service(没有重启电脑)的情况下,重复本帖子和你所说的实验,结果都能卸载字体。
yzwduck 发表于 2018-12-31 20:21
你的电脑环境好像有点异常:无法卸载临时字体,但我无法判断是来自 FontLoaderSub 的问题,还是你的电脑系 ...
我好像发现问题的关键了
我的字体都是放在NAS上的 是通过smb协议远程访问的 只有在这种情况下才会出现 「无法卸载临时字体」或者说是「字体缓存」的现象
我把字体放到local之后就表现正常了 每次都会load临时字体
不过我也不确定是不是font cache service在起作用 只是猜测
另外你的测试预测是对的 会fallback到默认字体
感谢开源 我自己修改一下load之后直接close 针对我这个情况非常实用
PRO TIPs
本帖最后由 yzwduck 于 2019-7-26 23:50 编辑本贴记录一些 更(没) 详(逻) 细(辑) 的使用说明。
FontLoaderSub
本工具是 FontLoader 的加强版,两者使用了相同的 API 来实现临时添加和删除字体。
FontLoaderSub 添加了字体文件解析、字幕文件解析、字体名称匹配等功能。
右键整合/快捷方式(及手工删除方法)
“发送到”文件夹/SendTo,需选中字幕/文件夹后右键,如下图所示:
如需手工删除,请在"本电脑" 的地址栏中输入 "shell:sendto",打开文件夹后删除对应的快捷方式。
文件夹空白处右键/directory background,需在没有选中任何项目的情况下右键,如下图所示:
如需手工删除,请删除注册表的 HKEY_CURRENT_USER\Software\Classes\Directory\Background\shell\FontLoaderSub
字体导出失败?
在扫描、加载字体时,本工具使用了 Root Local Device 路径,来应对各种非常规路径(比如 NUL、超长路径)。
但是在导出字体时用了 Windows Shell 的文件操作接口,它提供了文件管理器一样的界面,能处理异常逻辑(提示文件重名、显示复制进度等),同时也继承了它无法处理特殊路径的缺陷(毕竟不支持 Root Local Device 路径)。
关于“字体缓存服务 Windows Font Cache Service”
很多字体管理软件建议禁用这个服务,本工具使用了独立的字体解析方法,所以对这个缓存服务不敏感。
但貌似使用 DirectWrite 字体接口的程序,只有在开启字体缓存的情况下,才能发现本工具加载的字体,所以没有特殊需要的话,不要禁用这个服务。
缓存文件“fc-subs.db”
这个文件记录了程序所在目录下的所有字体文件的基本信息,如文件名、版本号、字体名称。
除了文件头和换行符外,它基本算是一个 UTF-16 LE 编码的文本文件。
本来想利用压缩算法减小其体积,但觉得能用文本编辑直接看其中的内容,远比数 MB 的磁盘开销有价值得多。
多字重/字形支持
由于一些拉丁文字体有独立的粗体、斜体等字体文件,为了找出并加载这些字体文件,本工具使用的算法如下所示:
1、找到名称匹配的最新版本字体文件,将其称为主字体,记录其版本号;
2、找到所有前缀与所需字体名称一致,且版本号与主字体一致的字体文件,将其视为衍生字体,并加载;
3、为了防止意外事故,最多加载 16 个不同的衍生字体文件。
梗
[*]使用 r+数字 是为了避免飙版本号的嫌疑,以及模仿 SVN;
[*]使用小写 是因为大写 太宽,会很难与其他的前缀标志对齐。