OBS Studio プラグインシステム

OBS Studio のプラグインシステムの全体像。OBS の具体的機能はほぼすべて obs_module_t(プラグインモジュール)として実装されている。

プラグインの仕組み

ロードと登録

各プラグインは共有ライブラリ(.so / .dylib / .dll)として実装され、libobs が起動時にロードする。プラグインは obs_module_load() エントリポイントで以下の登録関数を呼んで型を登録:

1 つのプラグインが複数の型を登録できる。例えば obs-ffmpeg は Source(メディアソース)、Output(録画出力)、Encoder(FFmpeg エンコーダ)を 1 モジュールで登録する。

info 構造体

各 info 構造体はコールバック関数のテーブル。プラグインが実装すべきインターフェースを定義する。

obs_source_info の主要コールバック:

コールバックタイミング責務
createインスタンス生成時リソース確保、初期設定
destroyインスタンス破棄時リソース解放
video_render毎フレーム(ビデオスレッド)GPU 上に映像を描画
video_tick毎フレーム(状態更新)アニメーション、タイマー等の更新
audio_render音声処理時音声サンプルの生成/加工
get_propertiesUI 表示時ユーザーに公開する設定項目の定義
update設定変更時新しい設定の適用
get_defaults初回デフォルト設定値の提供

obs_encoder_info の主要コールバック:

コールバック責務
create / destroyエンコーダの初期化・破棄
encode1 フレームをエンコードしてパケットを返す
get_extra_dataSPS/PPS 等のヘッダデータ取得
get_sei_dataSEI メッセージの取得
get_video_infoエンコーダが要求する映像フォーマット

obs_output_info の主要コールバック:

コールバック責務
start / stop出力の開始・停止
raw_video / raw_audio生映像/音声の受信(エンコードなし出力の場合)
encoded_packetエンコード済みパケットの受信

ライフサイクル

モジュールロード (obs_module_load)
  ↓
型の登録 (obs_register_source 等)
  ↓
インスタンス生成 (create コールバック)
  ↓
動作中 (video_render / encode / start 等が繰り返し呼ばれる)
  ↓
インスタンス破棄 (destroy コールバック)
  ↓
モジュールアンロード (obs_module_unload)

全 38 プラグインの分類

キャプチャ系(映像の取り込み)

プラグイン対象 OS技術
mac-capturemacOSScreenCaptureKit による画面/ウィンドウキャプチャ
mac-avcapturemacOSAVFoundation によるカメラキャプチャ
win-captureWindowsGame Capture (フック) / Display Capture (DXGI) / Window Capture (GDI/WGC)
win-dshowWindowsDirectShow デバイス(カメラ、キャプチャカード)
linux-captureLinuxX11 (XComposite/XShm) / PipeWire によるスクリーンキャプチャ
linux-v4l2LinuxVideo4Linux2 カメラデバイス
decklink全 OSBlackmagic DeckLink キャプチャカード
aja全 OSAJA キャプチャカード

win-capture の Game Capture は特殊で、ゲームプロセスに DLL をインジェクトして GPU テクスチャを直接共有メモリ経由で取得する。これにより、ゲーム描画を CPU にダウンロードせずにキャプチャできる。

音声系

プラグイン対象 OS技術
win-wasapiWindowsWASAPI(アプリ音声 / デバイス出力のキャプチャ)
coreaudio-encodermacOSCoreAudio AAC エンコード
linux-pulseaudioLinuxPulseAudio
linux-pipewireLinuxPipeWire(PulseAudio の後継、画面キャプチャも兼ねる)
linux-alsaLinuxALSA(低レベル音声)
linux-jackLinuxJACK Audio Connection Kit(プロオーディオ向け)
oss-audioBSD 系Open Sound System
sndioOpenBSDsndio

音声系は OS ごとに完全に異なる API を使う。libobs のオーディオパイプラインがこの差異を吸収し、統一された音声サンプルとして処理する。

エンコーダ系(映像/音声の圧縮)

プラグイン技術対応コーデック
obs-x264x264 (CPU)H.264
obs-nvencNVENC (NVIDIA GPU)H.264 / HEVC / AV1
obs-qsv11Quick Sync (Intel GPU)H.264 / HEVC
mac-videotoolboxVideoToolbox (Apple Silicon/Intel)H.264 / HEVC
obs-libfdklibfdk-aacAAC 音声
obs-ffmpegFFmpeg汎用(録画 muxing、リプレイバッファ、VA-API エンコード等)

obs-ffmpeg は最も多機能なプラグイン。エンコーダとしてだけでなく、メディアソース(動画/音声ファイル再生)、録画出力(MP4/MKV muxing)、リプレイバッファ(直前 N 秒の常時録画)も提供する。

出力/配信系

プラグイン機能
obs-outputsRTMP 配信出力、FLV muxing
obs-webrtcWebRTC (WHIP プロトコル) 配信出力
rtmp-services各配信サービス(Twitch, YouTube, Facebook 等)の接続設定データベース。サーバー URL やストリームキーの管理

rtmp-services はデータフローに関与せず、JSON ファイルとして配信サービスのメタデータ(RTMP URL 一覧、推奨設定等)を提供するだけのプラグイン。

エフェクト/フィルタ系

プラグイン機能
obs-filters色補正、クロマキー、カラーキー、シャープ、スクロール、LUT 適用、ノイズ抑制、ノイズゲート、コンプレッサー、リミッター
obs-transitionsフェード、カット、スライド、スワイプ、スティンガー(動画トランジション)
nv-filtersNVIDIA AI 背景除去、ルームエコー除去、顔追跡による自動フレーミング

obs-filters が最も多くの Source 型を 1 モジュールに詰め込んでいる。映像フィルタと音声フィルタの両方を含む。各フィルタは .effect ファイル(OBS 独自シェーダ形式)で GPU 処理を記述。

ソース系(追加入力)

プラグイン機能
image-source画像ファイル / 画像スライドショー
obs-textテキスト表示(OS ネイティブ API)
text-freetype2FreeType2 によるテキストレンダリング
vlc-videolibVLC によるメディア再生
obs-browserCEF(Chromium Embedded Framework)埋め込み。URL を指定して Web ページを映像ソースとして表示

obs-browser は最も重い依存を持つプラグイン。Chromium をプロセス内に埋め込むため、メモリ消費が大きい。しかし配信オーバーレイ(チャット、アラート、ウィジェット)の大半が Web ベースであるため、実質的に必須のプラグイン。

macOS 固有

プラグイン機能
mac-syphonSyphon フレームワーク連携。他の macOS アプリが Syphon Server として公開した映像を GPU テクスチャ共有で取り込む
mac-virtualcammacOS 仮想カメラ(CoreMediaIO DAL プラグイン)。OBS の出力を仮想カメラデバイスとして公開

制御/連携系

プラグイン機能
obs-websocketWebSocket サーバー。外部ツール(Stream Deck, Touch Portal, 自作スクリプト)から OBS のほぼ全機能を制御可能
obs-vstVST 2.x オーディオプラグインのホスト。DAW 向けの音声エフェクトを OBS の音声パイプラインに挿入

プラグイン間の結合

プラグイン同士は互いの存在を知らない。すべて libobs のコア抽象型を介して間接的に連携する。

[mac-capture]        ──registers→ obs_source_info  ──→ libobs
[mac-videotoolbox]   ──registers→ obs_encoder_info ──→ libobs
[obs-outputs]        ──registers→ obs_output_info  ──→ libobs
[rtmp-services]      ──registers→ obs_service_info ──→ libobs

libobs がデータフローを仲介:
  Source (mac-capture) → Scene → Encoder (mac-videotoolbox) → Output (obs-outputs)
                                                                  ↑
                                                          Service (rtmp-services)

mac-capture が生成した映像フレームが mac-videotoolbox でエンコードされ obs-outputs で RTMP 配信される、という協調動作は、libobs のパイプラインが仲介することで実現される。各プラグインは自分の型のコールバックを実装するだけ。

この疎結合設計により:

プラグインの OS 分布

カテゴリ全 OSmacOS のみWindows のみLinux のみBSD 系
キャプチャ2222—
音声—1142
エンコーダ311——
出力3————
フィルタ2————
ソース5————
macOS 固有—2———
制御2————

プラットフォーム非依存のプラグイン(出力、フィルタ、ソース、制御)は全 OS で共有される。キャプチャと音声はプラットフォームごとに完全に異なる実装が必要で、ここが OS 対応の最大のコスト。

押さえどころ(カード化候補)

関連

Graph