【OBS】Pythonを使って画面の録画をする方法

ゲームや動画のキャプチャを取りたいことってあるよねー。

あるあるー

説明します

そもそもOBSってなに?

OBS(Open Broadcaster Software)は、無料でオープンソースのビデオ録画およびストリーミングツールです。これを使って、高品質なビデオをリアルタイムで録画し、TwitchやYouTubeなどのプラットフォームにストリーミング配信することができます(Vtuberとか見てると良く聞くよねー)。また、複数のソース(カメラフィード、ビデオ、画像、テキストなど)からの入力を合成し、シームレスな視覚的プレゼンテーションを作成するための強力なシーン構成オプションを提供してるらしい。。

OBSをダウンロードしよう!

書くほどでもないですが、OBSとブラウザで検索して、「ダウンロードインストーラ」というところをクリックすると、最新のインストーラがダウンロードされます

ダウンロードしたらインストーラを実行してみましょう。用途などが聞かれるので自分にあったものを選択して進めていけば問題ないはずです。

OBSをPythonから操作する上で必要なこと

obswebsocketプラグインは必要?

ネットにある昔の記事やChatGPTなどでやり方を調べると「obswebsocketプラグイン」なるものが必要ですよ、と出てきます。しかし、この記事を書いている時点のOBSの最新版ではプラグインは無くてもpythonから操作できます。

実際はOBSを直接操作して設定の確認やら録画のお試しやらをやった方がよいと思いますが、それはご自身にお任せして、pythonからの操作に必要な項目を確認します。

WebSocketサーバー設定を確認する

画面上部の「ツール」→「WebSocketサーバー設定」を開きます

開いたらプラグイン設定「WebSocketサーバーを有効にする」にチェックをいれます。

チェックを入れたら下のサーバー設定「接続情報を表示」クリックします。

すると以下の接続情報が表示されるので、ポート番号とパスワードをメモしましょう※ローカルでやる場合IPは不要です。

録画設定を確認する

録画を行ってもどこに動画が保存されたか分からないと困ると思うので確認しておきましょう。
画面上部の「ファイル」→「設定」から

画面左「出力」→「録画」→「録画ファイルのパス」にあります。

録画する場所を指定する

今回はウィンドウを録画してみるのでその設定をします。
画面下の「ソース」欄にある「+」ボタンをクリックします。

「ウィンドウキャプチャ」を選択します。

そのままOKを押します。

OKを押します ※音声も必要であれば「音声をキャプチャ」にチェックを入れます。

画面が戻り、キャプチャする画面が中央に表示されます。キャプチャ範囲が中央に出るので、赤枠をドラック&ドロップで拡大縮小したり、Altを押しながらドラック&ドロップをして範囲を変更できたりします。

以上でOBS側の必要な設定は終わりです。

Pythonから操作してみる

サンプルコードを下に載せていますが、実行にはobs-websocket-pyのインストールが必要です。(もちろんpython自体も)
pipでインストールする場合は以下です

pip install obs-websocket-py

10秒間録画を行って、そのあと停止を行うpythonのサンプルプログラムは以下です。

python
import time
from obswebsocket import obsws, requests

def main():
    host = "localhost"
    port = 4455 #ポートを変えてたら変更
    password = "〇〇〇ここにパスワードを入れる〇〇〇"
    ws = obsws(host, port, password)
    ws.connect()
    print("接続")

    # 録画開始
    start_response = ws.call(requests.StartRecord())
    print("録画開始レスポンス:", start_response.status, start_response.datain)

    time.sleep(10)

    # 録画停止
    stop_response = ws.call(requests.StopRecord())
    print("録画停止レスポンス:", stop_response.status, stop_response.datain)

    ws.disconnect()
    print("websocket接続完了")

if __name__ == '__main__':
    main()

接続できていかなったらレスポンスでFalseが出ます。もし繋がらない場合はコードを調べるのもありますが、OBSまで通信が行っていればログも確認できます。

画面上部の「ヘルプ」→「ログファイル」→「ログファイルを表示」をクリックでログが見れます。調査に役立つと思います。※自分も誤情報に騙されて存在しないリクエストを投げていました。。

以上です!