请选择 进入手机版 | 继续访问电脑版
 找回密码
 立即注册
查看: 1613|回复: 13

FontLoaderSub: 加载ass/ssa字幕所需字体的小工具 (r4-20190222)

该用户从未签到

2

主题

22

帖子

0

真·积分

高级会员

Rank: 4

积分
33322
yzwduck 发表于 2018-11-12 19:46:32 | 显示全部楼层 |阅读模式
本帖最后由 yzwduck 于 2019-4-24 23:44 编辑

字体整合包x 是个好东西,但实在不敢把里面所有的字体都装进 win10,直觉告诉我这会引发各种 bug。
每次遇到字幕缺字体时,要在3000+个字体中找到对应的文件,选中并拖到 FontLoader.exe 上,我觉得是一件头疼的事情(特别是缺了好几个字体的时候)。

因此写了一个工具来自动加载字幕所需要的字体,希望它也能给大家排上用场。

使用方法
1、将程序解压并移动到字体所在文件夹,它将会分析程序所在文件夹(和子目录)下面所有字体文件;


2、将字幕(或字幕所在的文件夹)拖动到程序图标上;

3、等待程序分析加载,完成后显示如下界面:


第一行表示尝试加载的字体数量:
  • loaded: 加载成功;
  • failed: 加载失败(文件不存在/文件损坏……);
  • unmatched: 无匹配字体。

第二行表示一些统计信息:
  • files: 字体文件数量;
  • fonts: 字体名称数量;
  • subs: 字幕文件数量。

展开详细信息后,将显示每个字体名称和匹配的文件名,每行的前缀表示:
  • [ok]: 加载成功,如没有显示路径则表示系统已安装/加载了该字体;
  • [^ ]: 前面加载的字体中包含了该字体名称(无论加载是否成功);
  • [??]: 无匹配字体;
  • [ X]: 加载失败。

最后,三个按钮分别可以:
  • 确定/OK: 最小化;
  • 重试/Retry: 重新扫描字体文件;
  • 关闭/Close/Esc/Alt+F4: 卸载所有匹配的字体,并退出程序。

快捷方式
直接运行程序(或者打开同时按住 Shift 键)可以显示快捷方式的管理界面,具体用法请参见上方传送门 PRO TIPs。


注意事项
1、杀毒软件可能会报毒,请谨慎判断,故设置解码密码以防止下载后即被删除,密码为 vcb-s
2、为了避免反复扫描 3000+ 字体文件,程序会将扫描结果缓存到 fc-subs.db。如果新增/删除/修改了字体,请利用“重试”按钮来清除缓存;
3、只支持 Unicode 带 BOM 编码的 .ass/.ssa 字幕,且文件大小不超过 64MB;
4、字体名称匹配算法和 Windows 的不一样,所以部分字体名称可能无法匹配;
5、不支持 Windows XP。

更新历史
r5-soon
1、新功能:快捷方式管理。
r4-20190222
1、参照 libass 重新实现了字幕解析;
2、改善了详细信息输出结果;
3、新功能:每 5 分钟缓存一遍被加载的字体内容,以防在播放视频时从硬盘读取字体造成卡顿。
r3-20190103
1、修正了卸载字体时没有使用绝对路径的 bug;
2、添加了字体版本信息,在存在多个版本字体时,将加载版本号最大的字体文件;
3、添加了多字重/字形支持,将加载可能用到的粗体/斜体等独立字体文件。
r2-20181113
1、修正了几个资源忘记释放的 bug;
2、修改了缓存文件的格式,只记录字体文件的相对路径,支持不同语言 Windows 共用一个缓存;
3、添加了字体加载的详细信息,忽略已在系统安装的字体。
v1-20181112
第一版。






本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

评分

参与人数 5活跃度 +32961 收起 理由
Seekladoom + 25600 很给力!
blackmickey + 6400
hkhor99 + 1 赞一个!
纯白の羽 + 800 赞一个!
孤雨独火 + 160 赞一个!

查看全部评分

回复

使用道具 举报

  • TA的每日心情
    无聊
    2018-12-24 17:14
  • 签到天数: 28 天

    [LV.4]偶尔看看III

    7

    主题

    92

    帖子

    39

    真·积分

    中级会员

    Rank: 3Rank: 3

    积分
    6167
    孤雨独火 发表于 2018-11-12 21:21:08 | 显示全部楼层
    虽然字体管理类软件不少,但还是希望播放器能聪明点,能读取特定文件夹的字体。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    8 小时前
  • 签到天数: 152 天

    [LV.7]常住居民III

    0

    主题

    4

    帖子

    0

    真·积分

    中级会员

    Rank: 3Rank: 3

    积分
    17321
    SourGrapes 发表于 2018-11-12 23:03:13 | 显示全部楼层
    孤雨独火 发表于 2018-11-12 21:21
    虽然字体管理类软件不少,但还是希望播放器能聪明点,能读取特定文件夹的字体。 ...

    Potplayer 可以加载位于安装目录 /Fonts 下的字体文件。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    0

    主题

    8

    帖子

    0

    真·积分

    新手上路

    Rank: 1

    积分
    168
    fxffrank 发表于 2018-11-13 22:13:45 | 显示全部楼层
    自动化按需临时挂载字体,赞
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    0

    主题

    5

    帖子

    0

    真·积分

    新手上路

    Rank: 1

    积分
    68
    kiriz 发表于 2018-12-30 16:04:58 | 显示全部楼层
    win10有font cache service 加载后的字体即使卸载了也可以使用(每次重启清空cache)
    那么可以不可以出一个版本 加载后直接卸载并退出 利用字体缓存实现这个功能?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    2

    主题

    22

    帖子

    0

    真·积分

    高级会员

    Rank: 4

    积分
    33322
    yzwduck  楼主| 发表于 2018-12-31 08:49:14 | 显示全部楼层
    kiriz 发表于 2018-12-30 16:04
    win10有font cache service 加载后的字体即使卸载了也可以使用(每次重启清空cache)
    那么可以不可以出一个 ...

    win10有font cache service 加载后的字体即使卸载了也可以使用(每次重启清空cache)

    我搜索了一下,没能找到 font cache service 相关的技术介绍,也没能找到控制方法。
    怀疑“字体卸载后仍然可以使用”是有限制条件的:卸载后,哪些状态的应用程序,能通过哪些方法使用这些字体?
    我猜测只有已打开的字体句柄才能在卸载后继续使用,而播放器加载字幕时要重新打开字体是会失败的。

    如果存在控制字体缓存的方法,或者上面的猜测有误的话,希望能提供一些具体的线索;如果可行的话,我会尽力将其实现。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    0

    主题

    5

    帖子

    0

    真·积分

    新手上路

    Rank: 1

    积分
    68
    kiriz 发表于 2018-12-31 18:37:35 | 显示全部楼层
    yzwduck 发表于 2018-12-31 08:49
    我搜索了一下,没能找到 font cache service 相关的技术介绍,也没能找到控制方法。
    怀疑“字体卸载后 ...

    我没有具体研究过这个service,但从现象上来看是可以用的

    重启电脑后第一次使用FontLoaderSub加载字体

    可以看到字体都是临时加载的 但是close后看视频仍能正确识别字体


    关闭视频 尝试第二次加载字体

    显示的是从系统中找到了相应字体 虽然不知道你这个查找字体具体是怎么实现的 总之它就是找到了
    close后看视频也能够正确识别字体 而且在word/adobe等软件中仍能够使用

    但是另一位坛友@tonyhsie 做的ListAssFonts 在关闭你的FontLoaderSub之后 是无论如何都找不到这些字体的(工具链接http://bbs.vcb-s.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使用挂载过的字体吗?

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有帐号?立即注册

    x
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    2

    主题

    22

    帖子

    0

    真·积分

    高级会员

    Rank: 4

    积分
    33322
    yzwduck  楼主| 发表于 2018-12-31 20:21:28 | 显示全部楼层
    本帖最后由 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(没有重启电脑)的情况下,重复本帖子和你所说的实验,结果都能卸载字体。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    0

    主题

    5

    帖子

    0

    真·积分

    新手上路

    Rank: 1

    积分
    68
    kiriz 发表于 2018-12-31 22:19:14 | 显示全部楼层
    yzwduck 发表于 2018-12-31 20:21
    你的电脑环境好像有点异常:无法卸载临时字体,但我无法判断是来自 FontLoaderSub 的问题,还是你的电脑系 ...

    我好像发现问题的关键了
    我的字体都是放在NAS上的 是通过smb协议远程访问的 只有在这种情况下才会出现 「无法卸载临时字体」或者说是「字体缓存」的现象
    我把字体放到local之后就表现正常了 每次都会load临时字体

    不过我也不确定是不是font cache service在起作用 只是猜测
    另外你的测试预测是对的 会fallback到默认字体

    感谢开源 我自己修改一下load之后直接close 针对我这个情况非常实用

    回复 支持 反对

    使用道具 举报

    该用户从未签到

    2

    主题

    22

    帖子

    0

    真·积分

    高级会员

    Rank: 4

    积分
    33322
    yzwduck  楼主| 发表于 2019-1-3 11:27:51 | 显示全部楼层

    PRO TIPs

    本帖最后由 yzwduck 于 2019-4-24 23:31 编辑

    本贴记录一些 更(没) 详(逻) 细(辑) 的使用说明。

    FontLoaderSub
    本工具是 FontLoader 的加强版,两者使用了相同的 API 来实现临时添加和删除字体。
    FontLoaderSub 添加了字体文件解析、字幕文件解析、字体名称匹配等功能。

    右键整合/快捷方式
    如果觉得将一个窗口中的文件拖动到另一个窗口中的程序上还很麻烦的话,可以考虑在下列的地方建立快捷方式:
    1、在 %APPDATA%\Microsoft\Windows\SendTo 文件夹下建立一个指向字体文件夹中的主程序的快捷方式。这样在选中文件(夹)后,右键菜单的“发送至”里,就会出现新的选项;
    2、在注册表 HKEY_CLASSES_ROOT\Directory\Background\shell 下建立对应的键值,具体步骤请查阅相关资料,或者参考已有的键值。这样在文件夹空白处的右键菜单中会出现新的选项。

    增加了简易的快捷方式管理功能,入口在 Usage 对话框里的超链接,或者在启动程序时按住 Shift 键。目前可以在两个地方创建快捷方式。

    “发送到”文件夹/SendTo,需选中字幕/文件夹后右键,如下图所示:

    如需手工删除,请在"本电脑" 的地址栏中输入 "shell:sendto",打开文件夹后删除对应的快捷方式。

    文件夹的背景/directory background,需在没有选中任何项目的情况下右键,如下图所示:

    如需手工删除,请删除注册表的 HKEY_CURRENT_USER\Software\Classes\Directory\Background\shell\FontLoaderSub

    关于“字体缓存服务 Windows Font Cache Service”
    很多字体管理软件建议禁用这个服务,本工具的功能相对简单,并且使用了独立的字体解析实现,所以对这个缓存服务并不是很敏感。
    但如果字幕加载了上百个字体的话……抱歉,没测试过。

    缓存文件“fc-cache.db”
    这个文件记录了程序所在目录下的所有字体文件的基本信息,如文件名、版本号、字体名称。
    除了文件头和换行符外,它基本算是一个 UTF-16 LE 编码的文本文件,如果有兴趣的话,可以尝试用合适的文本编辑器将其打开看看。

    多字重/字形支持
    由于一些拉丁文字体有独立的粗体、斜体等字体文件,为了找出并加载这些字体文件,本工具使用的算法如下所示:
    1、找到名称匹配的最新版本字体文件,将其称为主字体,记录其版本号;
    2、找到所有前缀与所需字体名称一致,且版本号与主字体一致的字体文件,将其称为衍生字体,并加载;
    3、为了防止意外事故,最多加载 16 个不同的衍生字体文件。

    病毒/安全/其他版本
    本工具以 GPLv2 协议发布,源代码托管在 GitHub 上,在 vcb-s 上发布的可执行文件(可能除去最初的版本)是在 appveyor 上编译的,以保证编译结果与托管源代码的版本是一致的。
    在 appveyor 上还有若干其他配置的编译结果,它们分别为:
    1、Minimize:即在这个主题中发布的版本,它不依赖 Windows API 以外的任何第三方库(特指 vcruntime),可以在 Windows 7 及以上的环境下运行。但因为使用了特殊的入口点函数,导致部分杀毒软件产生误报。带有调试符号;
    2、UPX:它是 Minimize 版经过 UPX 压缩后的结果,体积比 Minimize 更小,同样也会使得部分杀毒软件产生误报,但具体的杀毒软件可能与 Minimize 版不同。不带调试符号;
    3、Release:它是 Visual Studio 默认的配置,内置了所需用的 vcruntime,体积比前者要大很多,只有少数杀毒软件(但极可能有 360)会产生误报。带有调试符号。
    此外,每个配置还有对应的 x64 版,但考虑到字体文件格式本身就不支持超过 4GB,所以 64 位版的意义不大,除非操作系统没有 WOW64 导致无法使用 x86 版,或者同时加载的字体过多导致虚拟内存不足,本人推荐使用 Minimize x86 版。
    对最新代码/其他版本有兴趣的读者可以在 这里 获编译后的可执行程序。

    更新:经过一个多月,从原来的 20+ 到现在只剩 4 个杀毒软件会对 Minimize 版产生误报了。

    Roadmap
    下一个版本(r4)将会与 libass 几乎一致的 ass 字幕格式解析,并重构了整个程序以提高代码可维护性。已基本完工,计划于 2019/2 月底前发布。
    再下一个版本(r5)可能会使用 DirectWrite 来提高字体名称匹配的准确度。

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有帐号?立即注册

    x
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    VCB-Studio分享论坛X

    VCB-S微信公众号上线了,欢迎关注!

    欢迎关注VCB-S微信公众号,公众号将不定期推送有关本组最新资源的消息。...

    点击查看详情 
    快速回复 返回顶部 返回列表