2020年5月2日土曜日

OBS-Studio: GDI+とFreetype2の違い

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など) リクエストは出ていますが、修正される見込みはなさそうです。 たぶん、ポーリング間隔を短くするよりは、FindFirstChangeNotificationinotifyのような機構を使って変更を検出するような仕組みにしたいのでしょう。

もし外部のプログラムやスクリプトからテキストを更新したい場合で最大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+へ合わせてゆき、一つのプラグインへ統合するような流れになるのではないかと予想しています。

0 件のコメント:

コメントを投稿

色彩の印象について

このページに、PCCSトーンとその印象についてわかりやすく書かれていて参考になった。こんど映像を編集する機会があれば、このページを参考にしたいと思う。 著者は大学で映像制作を学んだ方のようで、基礎をわかりやすく説明されているように感じる。他の記事も読みたい。 【映像制作者が...