Keo

Keo

steam_profiles
github

macOS上でmpvにFontconfigサポートを有効にしていくつかのフォント問題を解決する

前言#

動画再生に関心のある方は、mpvという機能豊富で設定が柔軟なプレーヤーに馴染みがあるでしょう。その中のConditional auto profiles機能は特に気に入っています。例えば、以下の設定を使って異なる言語の字幕に異なるフォントを使用することができます:

[zh-Hans]
profile-cond=string.sub(get("current-tracks/sub/lang"), 1, 7) == "zh-Hans"
sub-font='Source Han Sans SC'

[zh-Hant]
profile-cond=string.sub(get("current-tracks/sub/lang"), 1, 7) == "zh-Hant"
sub-font='Source Han Sans HC'

mpv は、他の多くのプレーヤーの組み込みモジュールでもあります。例えば、IINAJellyfin Media Playerなど、この 2 つのプレーヤーもカスタム mpv 設定をサポートしています。

mpv のさらなる設定項目については、VCB-S の入門チュートリアルを参照してください。

問題#

mpv はlibassを使用して SRT などのプレーンテキストフォントをレンダリングしますが、libass は macOS 上でデフォルトで CoreText をフォントプロバイダーとして使用してフォントを読み込むため、いくつかの問題が発生します。

まず、可変フォントについてですが、libass は最も細いスタイルしか読み取れず、--sub-bold=yesパラメータも効果がありません(Noto Sans CJK シリーズや Fira Code でテストした結果も同様です)。

次に、字幕内の Emoji についてですが、libass は表示できません。これはカラフルな Emoji フォントにフォールバックしているためだと思われますが、libass は単色(monochrome)フォントしかサポートしていません(関連 issue)。

調査の結果、libass が Linux で使用している Fontconfig も macOS をサポートしていることがわかりました。また、Fontconfig には豊富なカスタマイズ設定機能があります。藁にもすがる思いで Fontconfig を使って CoreText を置き換えてみたところ、確かに上記の 2 つの問題を解決できました。

実操#

以下は Homebrew を使用して Fontconfig サポートを有効にした libass をインストールする手順です。

まず、Fontconfig をインストールします:

brew install fontconfig

Homebrew の libass はデフォルトで macOS 上で Fontconfig を有効にしないため、まずはビルドスクリプトを修正する必要があります。

最新版の Homebrew はデフォルトで API の方法でインストールスクリプトを取得しますが、これによりインストールスクリプトの修正が反映されません。ここでは一時的に API モードを無効にします。

export HOMEBREW_NO_INSTALL_FROM_API=1
brew update
brew edit libass

formula code 内の fontconfig に関連する Linux 条件を削除し、--disable-fontconfigパラメータも削除してから、ソースから libass を再インストールします:

brew reinstall --build-from-source libass

この時点で、Homebrew でインストールした mpv は--sub-font-provider=fontconfigパラメータを使用して Fontconfig を有効にできるようになりました。

~/.config/fontconfig/fonts.confを修正し、mpv で使用するフォント名を一連のフォントのエイリアスとして設定することで、フォールバックの順序をカスタマイズできます:

<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "/opt/homebrew/share/xml/fontconfig/fonts.dtd">
<fontconfig>
  <include ignore_missing="yes">/opt/homebrew/etc/fonts/fonts.conf</include>

  <alias>
    <family>Source Han Sans HC</family>
    <prefer>
      <family>Noto Sans CJK HK</family>
      <family>Noto Emoji</family>
    </prefer>
  </alias>
</fontconfig>

ここでは単色の Emoji フォントNoto Emojiを使用しています。

最後に、IINA と Jellyfin Media Player は自前の libmpv と libass を使用しているため、それぞれのパッケージ内のlibass.9.dylib/opt/homebrew/lib/libass.9.dylibに置き換える必要があります。


この記事は以下の複数のウェブサイトに公開されています:
GitHub Pages
xLog

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。