Node-RED を使って OBS を遠隔操作してみた話(obs-websocket を利用)
はじめに
昨今のオンラインイベントのライブ配信等で利用されているオープンソースソフトウェアの OBS は、プラグインを用いることでアプリ外部から制御することもできます。
プラグインは obs-websocket というものなのですが、このプラグインを使った処理の開発を助けてくれるパッケージ・ライブラリもあります。過去に Node.js用のパッケージを使い、スマホや M5GO(M5Stack)といったデバイスを OBS のコントローラーにする仕組みを作ったことがありました。
(仕組みの詳細については、下記の記事をご参照ください)
●OBS をスマホや M5GO(M5Stack)から遠隔制御 〜 MQTT や obs-websocket を利用 〜 - Qiita
https://qiita.com/youtoy/items/23fb0e16f1a4428b5c9b
この時作ったものは、コントローラーにしたデバイスから PC までは MQTT で通信をさせ、PC上の MQTT の受信部分と OBS との間は WebSocket で通信をする形でした。
今回は、コントローラーとなる部分が Node-RED で、OBS との通信には WebSocket のみを用いた構成となるものを試作しました。
作ったものの概要
まず、今回作ったものが動作している様子をご覧ください。
OBS 側では、以下の 3種類のシーンを設定しており、その 3つのシーンの切り替えを Node-RED で行っています。
・「休憩中」と表示されている画面
・PC の内蔵カメラの映像が画面全体に表示されているもの
・スライドが画面全体に表示され、画面の一部に PC の内蔵カメラの
映像表示されているもの
Node-RED から OBS へ WebSocket で送る内容は、obs-websocket の GitHub のページに書かれたプロトコルの仕様に沿った JSON のデータとなります。シーンの切り替えを行う際に送る内容は以下となります。
{
"request-type":"SetCurrentScene",
"message-id":"(適当に決めたID)",
"scene-name":"(OBS上で設定したシーンの名前)"
}
この形式で、"scene-name" が異なる 3種類の JSON を送ると、OBS で設定された 3つのシーンの何れかに切り替わる、という動きをします。
WebSocket で JSON を送る部分は、Node-RED上で簡単に作成することができました。
おわりに
obs-websocket のプロトコルの仕様で今回利用したものはシーンの切り替えの部分のみでしたが、他にも様々な操作をプログラムから実行可能です。
今後、他に外部から制御できると便利そうな操作がないか調べてみて、見つかったらそれを活用した仕組みも作ってみようと思います。
【追記】 1年後くらいの状況
この記事を書いてから1年くらい時間が経過しましたが、その間のどこかのタイミングで、以下のようなノードがリリースされていたようです。
●red-contrib-obs-ws (node) - Node-RED
https://flows.nodered.org/node/red-contrib-obs-ws