
OBS Studioでスケジュールにあわせて自動配信してみた - Windows編 -
はじめに
清水です。以前、動画の録画やライブストリーミングに利用できるフリーでオープンソースのソフトウェア OBS Studioで、事前に指定した時刻に自動でストリーミング(配信)の開始ならびに終了ができないか確認しブログにまとめました。
上記ブログエントリではmacOS上のOBS Studioを使用し、コマンドラインでOBS Studioを操作する方法とプラグインAdvanced Scene Switcherを利用する方法の2通りの検証を行いました。
今回、Windows上のOBS Studioで自動でストリーミングの開始および終了ができないか確認する機会がありました。Advanced Scene Switcherを利用する方法としてはOBS Studioを稼働させるOSが異なれど設定などは同じである認識です。対して、コマンドラインでOBS Studioを操作する方法については、OSによって設定方法がガラッと変わります。
本エントリでは、Windows OS上のコマンドラインからOBS Studioを操作して配信を自動化する方法について検証してみました。具体的にはOBS Studioをコマンドプロンプトならびにバッチファイルで操作、コマンドラインでストリーミングの開始ならびに終了する方法を確認します。そしてWindowsタスク スケジューラを用いてバッチファイルを自動実行し、配信の自動化を実現しました。
動作検証環境について
まずは本ブログで動作検証を行った環境についてはまとめておきます。OBS Studioを稼働させる環境はSurface Laptop 4(13.5インチ、Intel Core i7-1185G7プロセッサ、32GB LPDDR4x RAM)、WindowsのバージョンはWindows 11 Business 24H2です。
またOBS Studioはバージョン32.0.4を利用しました。

「自動でストリーミング(配信)する」ということで、この配信先には以前のブログエントリと同様にAWS Elemental MediaLiveを利用しました。MediaLiveのRTMP (push) InputにOBS Studioから映像を打ち上げます。MediaLiveではArchive output groupを使用し、打ち上げられた映像をM2TSファイルにしてAmazon S3に出力します。


OBS Studio側の設定も以前のブログエントリと変わりありません。ソースとしてメディアソースを作成、ローカルに保存してあるBig Buck Bunnyの動画ファイルをループ再生しておきます。また確認用として左上に現在時刻を表示させました。以下ページの方法・ツールを利用しています。
現在時刻自体は外部WebサイトからJavaScript経由で表示されているものを使用し、OBS Studio側ではソースとしてブラウザを追加して表示する、というかたちでの時刻表示ですね。なお秒表示のあとに表示されている数字.Nはミリ秒(小数点以下一桁)です。フレーム番号ではない点にご注意ください。

配信の設定として、サービスでカスタム…を選択、サーバとストリームキーにMediaLiveのRTMP (push) InputのEndponit情報を設定しておきます。

出力設定などは基本的にOBS Studioのデフォルト値を利用、特段変わった設定はしていません。
OBSをコマンドラインで操作する方法の確認
続いてOBS Studioをコマンドプロンプトから操作し、手動による任意のタイミングでストリーミングを開始ならびに終了する方法を確認します。またこの操作をバッチファイルとしてまとめます。
コマンドラインからストリーミングの開始
コマンドプロンプトでstartコマンドを用いてOBS Studioを起動します。この際、起動時のパラメータで--startstreamingを指定することで起動と同時にストリーミングが開始されます。
OBS Studioの起動時のパラメータについては、ストリーミングの開始のほか録画の開始、プロファイルやシーンの指定などが可能です。詳細については以下をご確認ください
実際には以下の書式でOBS Studioの起動とストリーミングが開始されます。ポイントとしては、startコマンド実行前にobs64.exeファイルが存在するディレクトリ(デフォルトでは"C:\Program Files\obs-studio\bin\64bit")に変更しておく点です。cdコマンドを用いてディレクトリの変更を行いました。
C:\Users\user>cd /d "C:\Program Files\obs-studio\bin\64bit"
C:\Program Files\obs-studio\bin\64bit>start "" obs64.exe --startstreaming
なおディレクトリを変更せずstartコマンドをフルパスで実行しようとした場合、コマンドプロンプト上ではエラーなどは発生しません。しかしGUI上では以下のように「Failed to find locale/en-US.ini」、「Failed to load locale」というエラーが出現しOBS Studioの起動に失敗してしまいました。
C:\Users\user>start "" "C:\Program Files\obs-studio\bin\64bit\obs64.exe" --startstreaming


コマンドラインからストリーミングの終了
続いてコマンドプロンプトからのストリーミングの停止方法についてです。コマンドを用いて直接ストリーミングだけを停止する、といった方法は実現できないようなので(これはmacOSでの検証と同様です)、taskkillコマンドを用いてobs64.exeのプロセスを終了することでストリーミングの停止を実現します。
実際のコマンドプロンプトからの実行書式は以下のようになります。実行すると成功からはじまるシグナル送信の記録がレスポンスとして返ってきます。
C:\Program Files\obs-studio\bin\64bit>taskkill /IM obs64.exe
成功: プロセス "obs64.exe" (PID 14092) に強制終了のシグナルを送信しました。
OBS Studio側を確認してみましょう。デフォルト状態では以下のように「OBSを終了しますか?」のダイアログとともに、配信がシャットダウンされることに対しての確認が入ります。

通常の利用であればこのダイアログはありがたいものの、自動でストリーミングを停止させたいと考えた場合は逆にその妨げになってしまいます。実際、このダイアログに対して[OK]を押下しないとストリーミングは終了しません。
この対策として、OBS Studioの設定 > 詳細設定 > 一般から、[終了時にアクティブな出力の警告を表示する]のチェックを外しておきます。これで、ストリーミング中にtaskkill /IM obs64.exeコマンドを実行しても「OBSを終了しますか?」のダイアログは表示されずそのままOBS Studioが停止、ストリーミングも終了します。(なお、コマンドラインからの自動化を前提としてのダイアログ非表示の設定変更です。自動化を行わなくなった場合などは、本警告を再表示するよう設定を戻すようにしましょう。)

ストリーミングの停止(OBS Studioの終了)のその他の手段として、taskkillコマンドに/Fオプションを付けプロセスを強制的に終了することも検討しました。taskkill /IM obs64.exe /Fという実行方法ですね。
C:\Program Files\obs-studio\bin\64bit>taskkill /IM obs64.exe /F
成功: プロセス "obs64.exe" (PID 15580) は強制終了されました。
このtaskkill /IM obs64.exe /Fの場合、先ほどの[終了時にアクティブな出力の警告を表示する]のチェックが有効でも「OBSを終了しますか?」のダイアログ表示なしにOBS Studioが終了し、ストリーミングも停止します。しかし次のOBS Studio実行時に以下のような「OBS Studioのクラッシュが検出されました」のダイアログが表示されてしまいます。

[通常モードで実行]を押下することでOBS Studioは通常通り起動しますが、ストリーミングの開始を自動化しているような場合、やはりこれが自動化の妨げになってしまいます。この「OBS Studioのクラッシュが検出されました」のダイアログを非表示にする方法として、以前は起動時に--disable-shutdown-checkというオプションを使用することができたようなのですが、OBS Studioバージョン32.0.0以降ではこの--disable-shutdown-checkオプションが利用できなくなったようです。
OBS Studioを終了し起動する前に都度、%APPDATA%\obs-studio.sentinelフォルダー(実態はC:\Users\user\AppData\Roaming\obs-studio.sentinelなど)を削除することで、この「OBS Studioのクラッシュが検出されました」のダイアログを回避すること自体は可能なようです。しかし今回はシンプルに、[終了時にアクティブな出力の警告を表示する]のチェックを無効にすることで対応しました。
自動実行用のバッチファイルの作成
コマンドラインから、(1) OBS Studioをストリーミングとともに開始する方法、(2) OBS Studioを終了してストリーミングも停止する方法、それぞれが確認できました。続いて、これらをバッチファイルにまとめておきます。まとめたバッチファイルをタスク スケジューラから実行して自動実行を実現します。
開始用のバッチファイルをstart-obs.bat、終了用のバッチファイルをstop-obs.batという名称にしました。それぞれ以下の内容となります。
@echo off
cd /d "C:\Program Files\obs-studio\bin\64bit"
start "" obs64.exe --startstreaming
@echo off
taskkill /IM obs64.exe
任意のフォルダー内に、この2つのバッチファイルを格納しておきます。
タスク スケジューラへ登録して自動実行
コマンドラインからOBS Studioでストリーミングを開始、またOBS Studioを終了させる方法が確認でき、それぞれをバッチファイルまとめました。このバッチファイルをタスク スケジューラへ登録し任意のタイミングで実行することで、配信の自動化を行います。
タスク スケジューラを起動します。今回はタスク スケジューラ ライブラリにobs-auto-streamingというフォルダーを作成、[基本タスクの作成…]からタスクを追加していきました。

配信開始タスク
まずは配信開始のタスクです。「基本タスクの作成」画面で名前を入力します。今回はstart-obs-streamingとしました。必要に応じて説明の項目も入力しておきましょう。

「トリガー」画面でタスクの開始トリガーを選択します。今回は毎日で進めました。

「毎日」の具体的なタイミングを指定します。開始日をカレンダーから選択し、時刻として22:45:00を指定しました。間隔は1日です。

「操作」の画面はプログラムの開始を選択して[次へ]進みます。

「プログラムの開始」で先ほど作成したOBS Studioでストリーミングを開始するバッチファイル(start-obs.bat)を指定します。

「完了」画面で内容を確認し、[完了]ボタン押下でタスクを作成します。

配信終了タスク
配信の開始のタスクと同様の手順では終了のタスクを作成します。「基本タスクの作成」画面で名前を入力、今回はstop-obs-streamingとしました。必要に応じて説明の項目も入力しておきましょう。

「トリガー」画面でタスクの開始トリガーを選択します。配信開始のタスクと同様、今回は毎日で進めました。

「毎日」の具体的なタイミングを指定します。開始日をカレンダーから選択し、時刻として22:50:00を指定しました。 配信開始のタスクから5分後の指定です。 間隔は1日です。

「操作」の画面はプログラムの開始を選択して[次へ]進みます。

「プログラムの開始」で先ほど作成したOBS Studioでストリーミングを終了するバッチファイル(stop-obs.bat)を指定します。

「完了」画面で内容を確認し、[完了]ボタン押下でタスクを作成します。

以下が配信開始、ならびに配信終了タスクがタスク スケジューラに登録できた状態です。

なお、今回は毎日(1日間隔)での実行としましたが、該当タスクのプロパティを開き「トリガー」の項目を選択、編集画面に進むことでタスク開始のタイミングの調整が可能です。毎日のほか毎週、毎月の設定や特定の曜日に実行することもできますね。タスク開始時刻の調整もここから行います。

自動実行を確認
タスク スケジューラへのストリーミング開始・終了バッチファイルの登録ができました。実際にストリーミング自動実行の動作を確認します。配信開始タスクで指定した時刻となる前に、あらかじめ配信先となるMediaLiveのChannelをStartさせておきます。

OBS Studioは終了した状態で待機します。指定した時刻の22:45になるとOBS Studioが自動で起動して配信が開始されます。


その後22:50になるとOBS Studioが終了、ここでMediaLiveへの配信も停止します。

MediaLiveのChannelを停止後、出力されたアーカイブファイルをローカルにダウンロードして確認してみます。MediaLiveのArchive output group、Rollover Intervalはデフォルトの300秒(=5分)に設定していたため、アーカイブファイルは2つ作成されていました。Macのクイックルックで映像を確認します。(本ブログエントリではOBS Studioの動作環境としてWindows PCを用いていますが、AWSマネジメントコンソールの操作やこのアーカイブファイルの確認などはmacOS上で行っています。)
1つ目のファイルのM2TSファイル先頭、OBS Studio側で焼き付けていた時刻は22:45:03.1を示していました。またアーカイブファイルで確認できた最後のOBS Studioからの映像は22:50:00.3を示しています。


この22:50:00.3以降、OBS Studioからの配信が途絶えたため真っ黒な映像が続きます。2つ目のアーカイブファイルについてもずっと真っ黒な映像です。

タスク スケジューラからバッチファイルでOBS Studioの操作を行い、ストリーミング開始については3秒ほど、ストリーミング終了についてもコンマ数秒(0.3秒)、遅延が発生していたことになりますが、自動で配信を開始、終了するという目的は実現できました。(なおこのタイムラグ、誤差についてはmacOSでの検証でも同様に発生していました。どうしても発生してしまうもの、という認識をしています。)
まとめ
Windows OS上でコマンドラインからOBS Studioを操作して配信を自動化する方法について確認してみました。OBS Studioをコマンドプロンプトから配信開始状態で起動、プロセスを終了させることで配信を停止する方法を確認してそれぞれバッチファイルにまとめました。バッチファイルをタスク スケジューラから指定した時間に起動することで、配信の自動化を実現しました。
macOSで同様にコマンドラインからの配信自動化を検証した際には、シェルスクリプトならびにcronを用いました。スクリプト言語やジョブ管理ツールは異なれど、基本的な方針(OBS Studioを--startstreamingオプションを付けて起動する、ストリーミング停止はプロセスを終了する)については同じ考えで実現することができました。OBS Studioにはストリーミングの開始以外にも録画の開始(startrecording)などの起動オプションがあります。そのほか機能の自動化も実現できそうですね。










