2種類のテキストソースの違いは?
Q: OBS-Studioには、2種類のテキストソース (GDI+とFreetype2) が用意されています。
どちらを使うのが良いのでしょうか...
A: WindowsではGDI+、それ以外ではFreetype2を使用しましょう。WindowsでFreetype2を使う理由はありません。
これらのプラグインは、フォントファイルの情報を元に、テキストを画像に描画し、その画像をソースとしてOBSのグラフィックスエンジンへと渡します。
GDI+とFreetype2の違いは、フォントを描画する方式の違いです。GDI+は、Windowsのコンポーネントを使うため、Windowsにしか対応していません。一方で、Freetype2は、
FreeTypeというライブラリを使用します。Windowsに限らず、Mac OS XやLinuxでも動作します。
GDI+の方が機能が豊富
機能を比較すると、GDI+の方が豊富です。
プラグイン | GDI+ | Freetype2 |
ファイルから読み込み |
可能 |
可能 |
フォント |
設定できる |
設定できる |
位置揃え |
左・中央・右 |
未実装、リクエストあり |
テキストの色 |
色・透明度を設定できる |
色だけ設定できる |
枠 |
色・透明度・太さを設定できる |
黒・2px |
背景色 |
背景として矩形を塗りつぶせる |
未実装 |
ファイルの読み込み頻度
ファイルの読み込み頻度は、GDI+、Freetype2とも同じです。画像ソースも同じような実装です。
1秒間隔でファイルのタイムスタンプをポーリング、ファイルの変更を検出すると、さらに1秒後に読み込みます。ファイルを更新してから、最大で2秒の遅延が発生することになります。遅いですね。Windowsでは
_wstat
で1秒単位でのタイムスタンプしか取得できないので、このような実装になっているのだと思います。他のOSなら、更に速くしても問題ないはずです。
何度か (
PR-1566など) リクエストは出ていますが、修正される見込みはなさそうです。
たぶん、ポーリング間隔を短くするよりは、
FindFirstChangeNotification
や
inotify
のような機構を使って変更を検出するような仕組みにしたいのでしょう。
もし外部のプログラムやスクリプトからテキストを更新したい場合で最大2秒の遅延が気になるのであれば、
obs-websocketを使いましょう。
Python3のライブラリ
simpleobswsであれば、以下のようなコードで簡単にテキストを更新できます。もしasyncioを使うのが面倒であれば、obs-websocket-pyが良いです。
import simpleobsws
ws = simpleobsws.obsws(...)
ws.call('SetSourceSettings', {'sourceName': sourceName, 'sourceSettings': {'text': text}})
その他
Freetype2でも日本語を表示することができます。もし文字化けした場合、
- 日本語を表示できるフォントが設定されているか、
- ファイルからの読み込みの場合は文字コードの設定 (Linuxの場合はBOM無しのUTF-8が標準的です)
を確認しましょう。
歴史的な経緯としては、Freetype2が先に開発され、GDI+が後発のようです。
やはりWindowsユーザーの数が多く、GDI+が活発に機能を拡張してきたのでしょう。
Freetype2の実装をGDI+へ合わせてゆき、一つのプラグインへ統合するような流れになるのではないかと予想しています。