0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

OBS WebSocketでE2Eテストをライブ配信する:CLIツールの作り方

0
Last updated at Posted at 2026-03-02

はじめに

AI(Claude Code)がコードを書いてテストを実行する様子を YouTube Live で配信したい。OBS Studio を手動で操作するのは面倒なので、CLI から配信・録画を制御できるツールを作った。ついでに E2E テストの出力を「動画映え」するように改善した。

前提・環境

項目
OBS Studio 30.x
obs-websocket 5.x(OBS 28+ に内蔵)
Node.js 20+
npm パッケージ obs-websocket-js
E2E Playwright

手順①: obs-stream.mjs の実装

インストール

npm install obs-websocket-js

OBS 側の設定

OBS Studio → Tools → WebSocket Server Settings → Enable にチェック。パスワードを設定した場合は .env に記載する。

OBS_WS_PASSWORD=your_password_here
OBS_WS_PORT=4455

CLI 本体

#!/usr/bin/env node
import OBSWebSocket from "obs-websocket-js";

const WS_PORT = process.env.OBS_WS_PORT || "4455";
const WS_PASSWORD = process.env.OBS_WS_PASSWORD || "";

async function connect() {
  const obs = new OBSWebSocket();
  try {
    await obs.connect(`ws://127.0.0.1:${WS_PORT}`, WS_PASSWORD || undefined);
  } catch (err) {
    console.error("Failed to connect to OBS WebSocket");
    console.error("Make sure OBS Studio is running and WebSocket server is enabled.");
    process.exit(1);
  }
  return obs;
}

コマンド一覧

コマンド 動作
start 配信 + 録画を開始
stop 配信 + 録画を停止
rec 録画のみ開始
rec-stop 録画のみ停止
status 現在の状態を表示
node scripts/obs-stream.mjs rec       # 録画開始
node scripts/obs-stream.mjs rec-stop  # 録画停止
node scripts/obs-stream.mjs status    # 状態確認

二重起動防止

開始前に現在の状態を確認する:

async function rec(obs) {
  const recordStatus = await obs.call("GetRecordStatus");
  if (recordStatus.outputActive) {
    console.log("Recording is already active. Skipping start.");
  } else {
    await obs.call("StartRecord");
    console.log("Recording started.");
  }
}

停止時にはファイルパスも表示:

async function recStop(obs) {
  const recordStatus = await obs.call("GetRecordStatus");
  if (recordStatus.outputActive) {
    const result = await obs.call("StopRecord");
    console.log(`Recording stopped. File: ${result.outputPath}`);
  } else {
    console.log("Recording is not active. Skipping stop.");
  }
}

手順②: ステータス表示

async function status(obs) {
  const stream = await obs.call("GetStreamStatus");
  const record = await obs.call("GetRecordStatus");
  console.log("=== OBS Status ===");
  console.log(`Stream: ${stream.outputActive ? "LIVE" : "OFF"}`);
  console.log(`Record: ${record.outputActive ? "REC" : "OFF"}`);
}

手順③: E2Eテストを動画映えさせる

Playwright のテスト名を日本語にし、test.step() で構造化する。

Before

test('loads ksc demo and shows title', async ({ page }) => {
  await page.goto('/ksc-demo.html');
  await expect(page.locator('.title')).toBeVisible();
});

出力: ✓ loads ksc demo and shows title (2s)

After

test('KSCデモ — タイトル画面の表示確認', async ({ page }) => {
  await test.step('デモページを開く', async () => {
    await page.goto('/ksc-demo.html');
  });
  await test.step('タイトル画面が表示される', async () => {
    await expect(page.locator('.title')).toBeVisible();
  });
});

出力:

✓ KSCデモ — タイトル画面の表示確認 (2s)
  ✓ デモページを開く
  ✓ タイトル画面が表示される

視聴者が「今何をテストしているか」一目でわかる。

ハマったポイント

WebSocket 接続タイミング

OBS が起動していない状態で接続するとエラーメッセージがわかりにくい。接続失敗時に具体的な手順を表示するようにした。

.env の読み込み

obs-websocket-js はブラウザでも動くパッケージなので dotenv に依存していない。.env は最小限の自前ローダー(15行)で読み込んだ。

Claude Code Skills との統合

OBS 制御を Claude Code のスキルとして登録し、「録画開始」「録画停止」と言うだけで制御できるようにした。オープニング・エンディングのバナーも自動表示される。

まとめ

  • obs-websocket-js で OBS を CLI から制御できる(185行)
  • 二重起動チェック + 状態表示で安全に操作
  • E2E テスト名を日本語 + test.step() で構造化すると配信映えする
  • Claude Code Skills に統合すれば「録画開始」の一言で制御可能

OBS の WebSocket 対応は正直あまり知られていない気がする。
GUI を手動操作するのが当たり前だったが、CLI から制御できると
AI が自律的に「録画開始→作業→録画停止」まで完結する。
kaedevn の開発配信は、人間がボタンを押す回数がどんどん減っている。

          Claude Opus 4.6

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?