在 macOS 下使用 mpv 及基于 mpv 的播放器如 IINA 时遇到了尽管所有字体均已正确安装在~/Library/Fonts/,却无法正确识别字幕中所指定的字体名的问题,该问题主要体现在东亚文字字体中。
在 mpv log 中可以看出字体无法被正确匹配,最终指向系统默认字体,对观看体验造成了较严重的影响。

1
2
3
4
5
6
7
8
[sub/ass] fontselect: Using default font family: (EPSON 太丸ゴシック体B, 700, 0) -> /System/Library/Fonts/Helvetica.ttc, -1, Helvetica-Bold
[sub/ass] fontselect: (EPSON 太丸ゴシック体B, 700, 0) -> /System/Library/Fonts/Helvetica.ttc, -1, Helvetica-Bold
[sub/ass] Glyph 0x79C1 not found, selecting one more font for (EPSON 太丸ゴシック体B, 700, 0)
[sub/ass] fontselect: (EPSON 太丸ゴシック体B, 700, 0) -> /System/Library/Fonts/PingFang.ttc, -1, PingFangSC-Semibold
[sub/ass] fontselect: Using default font family: (方正准圆_GBK, 700, 0) -> /System/Library/Fonts/Helvetica.ttc, -1, Helvetica-Bold
[sub/ass] fontselect: (方正准圆_GBK, 700, 0) -> /System/Library/Fonts/Helvetica.ttc, -1, Helvetica-Bold
[sub/ass] Glyph 0x6211 not found, selecting one more font for (方正准圆_GBK, 700, 0)
[sub/ass] fontselect: (方正准圆_GBK, 700, 0) -> /System/Library/Fonts/PingFang.ttc, -1, PingFangSC-Semibold

这个问题是因为 mpv 采用了 libass 作为 ass 字幕的渲染器,libass 从 0.13.0 版起采用了 macOS 原生的 Coretext 作为 font selection backends。但很不幸的是,Coretext 进行字体选择是基于字体的 PostScriptName,而字幕组在制作字幕使用字体时均使用了字体的 FullName。

以方正准圆为例,其 FullName 为方正准圆_GBK, PostScriptName 为FZY3K--GBK1-0,字幕组使用前者的原因显而易见。

想要修复这个问题,需要禁用 libass 的 Coretext,更换为 fontconfig 方式,默认使用 FullName 匹配字体。

在命令行下执行,brew reinstall libass --with-fontconfig,homebrew 就会使用--disable-coretext参数来编译 libass。

编译安装完成后,在~/.config/mpv/目录下新建fonts.conf配置文件,文件内容可参考 fonts.conf。其中可以自己指定字体的 alias,和搜索路径等。不过我还没弄明白这个文件是否为必须,可以考虑先不添加。

如果你是使用brew install mpv命令安装的 mpv,且字体安装在~/Library/Fonts/~/.local/share/fonts/此时字体选择应该已正常。

如果你安装的是已编译打包好装入/Application文件夹的程序, 如从官网下载或使用brew cask方法安装。则需要手动替换软件包中的 libass library。

如果你不懂得如何编译,可以点击下载我编译好的 libass.9.dylib 文件完成替换。

以 IINA 为例:

使用编译好的 libass library/usr/local/Cellar/libass/0.13.7/lib/libass.9.dylib,替换掉 IINA.app/Contents/Frameworks/libass.9.dylib即可解决问题。mpv 也同理。

替换后打开应用可能会被提示未受信任的开发者开发的应用程序,这是因为对软件包的修改破坏了开发者签名,在安全性与隐私设置中同意即可使用。

修正前后的效果对比如下,强迫症终于可以舒服的看动画啦。

修正前:

修正后: