V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
hguandl
V2EX  ›  macOS

IINA 下 ass 字幕中文字体问题,怀疑与上游库 libass 有关。不知有没有遇到同样问题的朋友

  •  1
     
  •   hguandl · 2018-05-11 21:06:15 +08:00 · 7854 次点击
    这是一个创建于 2391 天前的主题,其中的信息可能已经有所发展或是发生改变。

    问题描述

    IINA 在渲染 ass 特效字幕时,无法正确调用已安装的字体,而是 fallback 到 Helvetica 或苹方。

    现象截图

    预期结果 Westworld.S02E01.Journey.Into.Night.1080p.AMZN.WEB-DL.DDP5.1.H.264-NTb-0001.jpg 实际结果 Westworld.S02E01.Journey.Into.Night.1080p.AMZN.WEB-DL.DDP5.1.H.264-NTb-0002.jpg

    截图中使用的是人人字幕组的 ass 外挂字幕,理应使用的字体是微软雅黑(已安装),而实际情况却是变成了观感 细很多的 Helvetica。同样使用 libassFFmpeg 也会出现类似问题:

    $ ffmpeg -i Westworld.S02E01.Journey.Into.Night.1080p.AMZN.WEB-DL.DDP5.1.H.264-NTb.mkv -vf ass=sub.ass output.mkv
    ...
    [Parsed_ass_0 @ 0x7fa292503140] fontselect: (方正黑体_GBK, 400, 0) -> /System/Library/Fonts/Helvetica.ttc, -1, Helvetica
    [Parsed_ass_0 @ 0x7fa292503140] fontselect: (方正黑体_GBK, 700, 0) -> /System/Library/Fonts/Helvetica.ttc, -1, Helvetica-Bold
    [Parsed_ass_0 @ 0x7fa292503140] Glyph 0x300A not found, selecting one more font for (方正黑体_GBK, 700, 0)
    [Parsed_ass_0 @ 0x7fa292503140] fontselect: (方正黑体_GBK, 700, 0) -> /System/Library/Fonts/PingFang.ttc, -1, PingFangSC-Semibold
    frame=   47 fps=0.0 q=0.0 size=      11kB time=00:00:02.71 bitrate=  33.0kbits/s[Parsed_ass_0 @ 0x7fa292503140] fontselect: (微软雅黑, 400, 0) -> /System/Library/Fonts/Helvetica.ttc, -1, Helvetica
    [Parsed_ass_0 @ 0x7fa292503140] Glyph 0x6B22 not found, selecting one more font for (方正黑体_GBK, 400, 0)
    [Parsed_ass_0 @ 0x7fa292503140] fontselect: (方正黑体_GBK, 400, 0) -> /System/Library/Fonts/PingFang.ttc, -1, PingFangSC-Regular
    
    

    分析

    一开始我百思不得其解,对 fontconfig 进行各种设置都没有作用。后来在搜到了这个 issue,才知道新版的 libass 使用了 macOS 原生的 CoreText 取代了 fongconfig,很多字体相关问题都是从这开始的。

    解决方案

    方案一 修改字幕,把字体名改成 PostScript 名称

    这个方法比较简单直接,在字体册.app离我们可以得知“微软雅黑”和“方正黑体_GBK ”的 PostScript 名称为 MicrosoftYaHeiFZHTK--GBK1-0,打开字幕文件,把字体名称批量替换掉即可。这比较适合少量的字幕文件。

    方案二 更换 libass 库,使用依赖 fontconfig 的版本

    另一种方法就是直接更换库,可以从项目地址自行编译,在 configure 选项里加入 --enable-fontconfig --disable-coretext 即可;或是直接 brew install libass --with-fontconfig。然后找到编译出来的 dylib 文件,替换 /Applications/IINA.app/Contents/Frameworks/libass.9.dylib

    总结

    现在还无法完全确定是 libass 的实现问题还是 CoreText 本身问题。不过考虑到之前 Office 等软件上字体名称的不匹配,后者的可能性比较大。为了解决这个问题折腾了一下午,不知道以后还会为 macOS 上的 bugs/features 费多少脑筋。

    4 条回复    2018-05-12 20:58:02 +08:00
    ZRS
        1
    ZRS  
       2018-05-11 23:04:22 +08:00
    同遇到过这个问题,折腾了很久,最后手动替换包内的 libass 库解决的...

    https://zrstea.com/261/
    ztxgeol
        2
    ztxgeol  
       2018-05-12 15:51:51 +08:00
    是这样的,当年 mpv 就遇到这个问题了,当时的解决方法就是编译 fontconfig 的版本,去年开始虽然换了 IINA,但是不看中文字幕了,也算是解决了问题。。。
    hguandl
        3
    hguandl  
    OP
       2018-05-12 18:28:48 +08:00
    尝试 at 一下作者 @lhc70000,能不能考虑编译的时候使用带 fontconfig 的版本。
    lhc70000
        4
    lhc70000  
       2018-05-12 20:58:02 +08:00
    我觉得最好的方法是搞一个 brew formula,有任何需求自己编译就行了……(如果有人愿意帮忙,请 GitHub 联系,有 issue
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5649 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 06:42 · PVG 14:42 · LAX 22:42 · JFK 01:42
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.