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など、他の多くのプレーヤーの組み込みモジュールでもあり、これらのプレーヤーもカスタム 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(コメント可能)

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