プログラムによるOBS自動制御でできること¶
OBS Studioは obs-websocket API を通じて、プログラムからほぼすべての操作を自動制御できる。OBS Studio 28.0以降にはデフォルトで組み込まれており、追加インストールは不要。
このページでは、プログラムからOBSを制御して配信する際にできることを、具体的な活用例とともに紹介する。
配信の開始・停止¶
プログラムから配信の開始と停止を完全に制御できる。
- 配信の開始・停止
- 録画の開始・停止・一時停止・再開
- 録画ファイルの分割やチャプター挿入
- 配信サーバーURL・ストリームキーの設定変更
- 配信の状態監視(配信中かどうか、経過時間、データ量)
活用例:
- 毎日20時に自動で配信を開始し、22時に自動で終了する
- 配信と同時に録画を開始し、アーカイブを自動保存する
- 配信開始前にストリームキーの有効性を確認してからスタートする
- 配信中のビットレートやフレームドロップを監視し、異常があれば自動で配信を再起動する
シーン切替¶
シーンはOBSの画面レイアウトの単位。複数のシーンを用意して、プログラムから自由に切り替えられる。
- シーンの作成・削除・名前変更
- 現在の配信シーンの取得・切替
- シーン一覧の取得
- スタジオモードでプレビュー確認後に切替
活用例:
- 「オープニング動画 → トーク画面 → 休憩画面 → エンディング動画」のように台本に沿ってシーンを自動進行
- 休憩シーンでカウントダウンタイマーを表示し、時間になったら自動でトークシーンに復帰
- チャットで特定のコマンド(例:
!カメラ切替)が来たらシーンを切り替える - 時間帯に応じて昼用・夜用のシーンを自動で使い分ける
ソース(映像素材)の操作¶
シーン内に配置する映像素材(ソース)をプログラムから自在に操作できる。
利用できるソースの種類¶
| ソース | 用途 |
|---|---|
| 画像 | 背景画像、ロゴ、挿絵の表示 |
| テキスト | タイトル、字幕、テロップの表示 |
| ブラウザソース | Webページ、チャットボックス、アラートオーバーレイ |
| メディア(動画・音声) | BGM、効果音、動画素材の再生 |
| 画像スライドショー | 複数画像の自動切替 |
| 画面キャプチャ | PC画面全体のキャプチャ |
| ウィンドウキャプチャ | 特定アプリの画面キャプチャ |
| ゲームキャプチャ | ゲーム画面の高パフォーマンスキャプチャ |
| 映像キャプチャデバイス | Webカメラ・キャプチャカード |
| 色ソース | 単色の矩形(背景色など) |
ソースに対してできる操作¶
- 追加・削除: 動的にソースを配置・除去
- 表示・非表示の切替: ソースの見せ隠し
- プロパティの変更: テキストの内容、画像のファイルパス、ブラウザソースのURL等をリアルタイムに書き換え
- 位置・サイズ・回転の変更: ソースをアニメーションのように動かすことも可能
- 重ね順の変更: ソースの前面・背面の入れ替え
- クロップ: ソースの一部だけを表示
- ブレンドモード: 加算・乗算・スクリーンなどの合成効果
活用例:
- トーク中の話題に合わせて背景画像をAI生成した画像に動的に差し替える
- 字幕テキストソースをTTSの発話内容と同期させてリアルタイムに更新する
- フォロー通知が来たらアラート画像を一時的に表示し、数秒後に非表示に戻す
- チャットのコメントをテキストソースに流し込んで画面上にニコニコ風に表示する
- ロゴやウォーターマークを配信中ずっと固定位置に表示する
動画ソースの活用例¶
メディアソース(ffmpeg_source)を使えば、動画ファイルをシーン内で自由に再生・制御できる。
- オープニング/エンディング動画: 配信開始時にオープニング動画を全画面で再生し、再生終了を検知してトークシーンに自動切替
- コーナー間のジングル動画: トークの合間に短い動画を挟んで場面転換の演出に使う
- 解説用動画の挿入: トーク中に関連する動画素材を画面の一部に表示して解説を補足する
- PinP(ピクチャー・イン・ピクチャー): メイン画面の隅に小さく動画を再生しながらトークを続ける
- ループ動画背景: アニメーション背景として動画をループ再生し、静止画より動きのある画面を演出する
- カウントダウン動画: 休憩中にカウントダウン動画を再生し、終了したらトークに復帰する
- リアクション動画: チャットの盛り上がりに応じてリアクション動画(拍手、紙吹雪等)をオーバーレイ表示する
トランジション(場面転換効果)¶
シーン切替時のアニメーション効果をプログラムから制御できる。
組み込みトランジション¶
| トランジション | 効果 |
|---|---|
| Cut | 瞬時に切替 |
| Fade | フェードイン/フェードアウト |
| Swipe | スワイプで切替 |
| Slide | スライドで切替 |
| Fade to Color | 一度指定色にフェードしてから切替 |
| Luma Wipe | パターンを使ったワイプ |
| Stinger | 透過動画を使ったカスタム切替 |
できること¶
- トランジションの種類をプログラムから変更
- トランジションの長さ(ミリ秒)を設定
- シーンごとに異なるトランジションを設定
- スタジオモードでプレビュー確認後にトランジション実行
- Tバー(0.0〜1.0)による手動的なトランジション制御
活用例:
- コーナー切替時はStingerトランジションで専用の透過動画を再生して派手に演出する
- 通常のシーン切替は500msのFadeで自然に遷移させる
- 緊急シーン(技術トラブル時の「しばらくお待ちください」画面)への切替はCutで瞬時に行う
- Tバーを使って、プログラムから徐々にシーンを切り替える演出を行う(0.0→1.0を段階的に変化)
- オープニング動画の終了タイミングに合わせてFade to Blackでトーク画面に切り替える
音声制御¶
配信中の音声をプログラムから細かく制御できる。
- ミュート・ミュート解除: 任意の音声ソースのON/OFF切替
- 音量調整: dB単位での音量設定
- 音声バランス: ステレオの左右バランス調整
- 音声同期オフセット: 映像との同期ずれ補正(ミリ秒単位)
- 音声トラック設定: 出力先トラックの割り当て
- 音声モニタリング: モニターのみ / モニター+配信出力 / 配信出力のみ の切替
- 音声レベルメーター: リアルタイムの音声レベルデータの取得
活用例:
- TTS音声の再生中はBGMの音量を自動的に-20dBに下げ、再生終了後に元に戻す(ダッキング)
- オープニング動画の再生中はBGMをミュートし、動画の音声のみを流す
- コーナーごとにBGMを切り替える(トーク用BGM → ゲーム用BGM → エンディングBGM)
- 効果音(ファンファーレ、ドラムロール等)をイベントに応じて再生する
- 音声レベルを監視し、無音が一定時間続いたら自動で休憩シーンに切り替える
フィルタ(映像・音声エフェクト)¶
ソースにフィルタを適用して、映像や音声を加工できる。フィルタの追加・削除・設定変更・ON/OFFすべてプログラムから制御可能。
映像フィルタ¶
| フィルタ | 効果 |
|---|---|
| クロマキー | グリーンバック等の背景除去 |
| 色補正 | 色相・コントラスト・彩度・ガンマ・不透明度の調整 |
| LUT適用 | カラーグレーディング(映画風の色味等) |
| 画像マスク | 画像を使った切り抜き・合成 |
| スクロール | テキストや画像の無限スクロール |
| シャープネス | 映像の鮮明化 |
音声フィルタ¶
| フィルタ | 効果 |
|---|---|
| ノイズ抑制 | 背景ノイズの除去 |
| ノイズゲート | 発話していないときの音声遮断 |
| コンプレッサー | 音量ピークの均一化 |
| リミッター | 音割れ防止 |
| ゲイン | 音量のブースト |
活用例:
- 色補正フィルタの不透明度を0%→100%に徐々に変化させて、ソースのフェードイン/フェードアウトを実現する
- 動画ソースに画像マスクを適用して、丸形や星形に切り抜いて表示する
- テキストにスクロールフィルタを適用して、ニュースティッカーのように横に流す
- LUTフィルタを切り替えて、配信の雰囲気を「明るいポップ調」から「シネマティック調」に変える
- 動画にクロマキーを適用して、グリーンバック部分を透過させ他のソースと合成する
メディア再生制御¶
動画や音声ファイルの再生をプログラムから細かく操作できる。
- 再生・一時停止・停止・再スタート
- 再生位置のシーク(指定時間にジャンプ)
- プレイリストの次へ・前へ
- 再生状態の取得(再生中/停止中/一時停止中、現在の再生位置)
- 再生終了イベントの検知
活用例:
- 効果音やBGMをプログラムの任意のタイミングで再生する
- オープニング動画の再生完了イベントを検知して、自動でトークシーンに切り替える
- 解説動画を特定の位置から再生し、説明が終わったら一時停止する
- 休憩中にプレイリストからBGMを順番に再生する
- 動画の再生位置を監視し、特定のタイミングでテロップを同期表示する
- チャットで
!replayコマンドが来たら、直前のハイライト動画を再生する
スクリーンショット¶
任意のソースやシーンのスクリーンショットをプログラムから取得できる。
- Base64エンコードされた画像データとして取得
- ファイルとして保存
- 画像フォーマット(PNG/JPEG)と品質の指定
活用例:
- 配信中の画面を定期的にキャプチャしてサムネイルを自動生成する
- 特定のシーン(ハイライト場面)のスクリーンショットをSNS投稿用に自動保存する
- 配信画面をキャプチャしてAI画像認識にかけ、画面の内容に応じた自動制御を行う
動画を活用した配信演出パターン¶
動画ソースとOBS自動制御を組み合わせることで、さまざまな配信演出が可能になる。
オープニング演出¶
- 配信開始と同時にオープニング動画(カウントダウン付き)を全画面再生
- 動画の再生終了イベントを検知
- Fadeトランジションでメインのトーク画面に自動切替
- BGMの再生を開始
コーナー切替演出¶
- 現在のコーナーの締めテロップを表示
- ジングル動画(3〜5秒の短い動画)をオーバーレイで再生
- ジングル再生中にバックグラウンドで次のシーンを準備
- ジングル終了と同時に次のコーナーのシーンに切替
- BGMを次のコーナー用に切り替え
解説中の動画挿入¶
- トーク画面のまま、画面右側に動画ソースを表示(PinPレイアウト)
- 動画のサイズ・位置をプログラムで調整(画面の30%程度)
- 動画を再生しながらTTSで解説音声を流す
- 解説が終わったら動画を非表示に戻す
視聴者インタラクション演出¶
- チャットで特定のコマンド(例:
!お祝い)を検知 - 紙吹雪の動画エフェクトを画面上にオーバーレイ表示
- ファンファーレの効果音を同時に再生
- 数秒後にエフェクトを自動的に非表示
休憩画面演出¶
- 休憩シーンに切替
- カウントダウン動画を再生(「あと5分で戻ります」等)
- BGMをリラックス系に切替
- カウントダウン終了を検知
- 予告テロップを表示してからトークシーンに復帰
エンディング演出¶
- トークの締めが終わったらエンディング用シーンに切替
- エンディング動画を再生(スタッフクレジット風、次回予告等)
- 動画の再生終了を検知
- 「ご視聴ありがとうございました」のテロップを表示
- 数秒待って配信を自動停止
その他の機能¶
仮想カメラ¶
OBSの出力をシステムの仮想カメラとして公開できる。開始・停止をプログラムから制御可能。
リプレイバッファ¶
直近の数十秒〜数分の映像を常にメモリに保持し、任意のタイミングでファイルに保存できる。
活用例: チャットで盛り上がった瞬間を自動検知してリプレイを保存し、後でハイライト動画として再生する。
ホットキー¶
OBSに登録されたホットキーをプログラムからトリガーできる。物理キーボードなしでショートカット操作を実行可能。
プロファイル・シーンコレクション¶
配信用途ごとに設定セット(プロファイル)やシーン構成(シーンコレクション)を切替可能。
活用例: 平日用と週末用で異なるシーン構成を用意し、曜日に応じて自動切替する。
パフォーマンス監視¶
CPU使用率・FPS・メモリ使用量などのパフォーマンス統計をリアルタイムに取得可能。
活用例: CPU使用率が90%を超えたら画質を自動的に下げて安定配信を維持する。
対応プログラミング言語¶
obs-websocket APIは主要な言語でクライアントライブラリが提供されている。
| 言語 | ライブラリ |
|---|---|
| Python | obsws-python(同期型)、simpleobsws(非同期) |
| TypeScript / JavaScript | obs-websocket-js |
| Go | goobs |
| Rust | obws |
| Java | obs-websocket-java |
コード例: 動画を挿入して再生する(Python)¶
import obsws_python as obs
import time
cl = obs.ReqClient(host='localhost', port=4455, password='password')
# メディアソースを作成してシーンに追加
cl.create_input(
scene_name="トーク",
input_name="解説動画",
input_kind="ffmpeg_source",
input_settings={
"local_file": "/path/to/video.mp4",
"looping": False,
},
scene_item_enabled=True,
)
# ソースの位置とサイズを設定(右下にPinP表示)
scene_item_id = cl.get_scene_item_id("トーク", "解説動画").scene_item_id
cl.set_scene_item_transform("トーク", scene_item_id, {
"positionX": 1280,
"positionY": 540,
"boundsType": "OBS_BOUNDS_SCALE_INNER",
"boundsWidth": 640,
"boundsHeight": 360,
"alignment": 5, # center
})
# 再生開始
cl.trigger_media_input_action("解説動画", "OBS_WEBSOCKET_MEDIA_INPUT_ACTION_RESTART")
コード例: 動画再生と連動した演出(TypeScript)¶
import OBSWebSocket from 'obs-websocket-js';
const obs = new OBSWebSocket();
await obs.connect('ws://localhost:4455', 'password');
// オープニング動画を再生
await obs.call('SetCurrentProgramScene', { sceneName: 'オープニング' });
await obs.call('TriggerMediaInputAction', {
inputName: 'OP動画',
mediaAction: 'OBS_WEBSOCKET_MEDIA_INPUT_ACTION_RESTART',
});
// 動画の再生終了を検知してシーン切替
obs.on('MediaInputPlaybackEnded', async (event) => {
if (event.inputName === 'OP動画') {
// BGM再生開始
await obs.call('SetInputMute', { inputName: 'BGM', inputMuted: false });
// トーク画面にフェードで切替
await obs.call('SetCurrentSceneTransition', { transitionName: 'Fade' });
await obs.call('SetCurrentSceneTransitionDuration', {
transitionDuration: 1000,
});
await obs.call('SetCurrentProgramScene', { sceneName: 'トーク' });
}
});
// テロップを同期表示
await obs.call('SetInputSettings', {
inputName: '字幕',
inputSettings: { text: '本日のテーマ: AI配信の自動化' },
overlay: true,
});
まとめ¶
プログラムからOBSを制御することで、以下のような完全自動配信が実現できる。
- スケジュールに基づく配信開始・終了
- 台本に沿ったシーン自動切替とトランジション演出
- オープニング/エンディング/ジングル動画の自動再生と連動制御
- 話題に合わせた背景画像・動画・テロップの動的更新
- TTS音声の再生とBGMの自動音量調整(ダッキング)
- チャットコメントに応じた動画エフェクト・リアクション演出
- 配信状態の監視と異常時の自動復旧
すべての操作がWebSocket API経由で行えるため、任意のプログラミング言語から配信のあらゆる要素を自動制御できる。
詳細なAPI仕様は OBS Studio 機能調査レポート を参照。