OBSでLeague Of Legendsの録画ツールを作る

LoL録画ツール記事アイキャッチ LeagueOfLegends
LoL録画ツール記事アイキャッチ

はじめに

OBSでLeague Of Legendsの試合を録画していると、録画に失敗することはないですか?

いい試合をしたのに録画を忘れていたり、録画を止めるのを忘れて長い録画ファイルから探さなきゃいけなかったりと、そんな経験があると思います。

そんな悩みを解決するLeague Of Legends自動録画ツールを作ってみました。

作り方

作り方は意外と簡単で「LoLのLiveClientDataAPIによる試合検知」と「OBS WebSocketを使った録画開始と終了」でできちゃいます。

具体的には以下4つの手順で実現できます。

  1. LiveClientDataAPIが取得できたら試合開始とする
  2. 試合開始したらOBS WebSocketで録画開始する
  3. LiveClientDataAPIが取得できなくなったら試合終了とする
  4. 試合終了したらOBS WebSocketで録画を終了する

そんな簡単にできたら苦労しねぇよ!って方は以下記事でLiveClientDataAPIとOBS WebSocketについて説明しているので確認してみてください。

最小構成

 設定情報のプロパティファイル化や、録画ファイル名のリネームなどいろいろやりたいことは出てきますが、ここではまず「試合開始を検知して録画開始」「試合終了を検知して録画停止」の2つに絞って説明します。

前提

 まず、OBS WebSocketとLiveClientDataAPIを使うためには以下が必要です。

  • OBS Studio:28.0以降 ※OBS WebSocket v5のため
  • Python:3.9以上
  • obsws-python

最低限上記3つが揃っていればLeague Of Legends自動録画ツールが作れます。

サンプルコード

以下サンプルコードでLeague Of Legends自動録画が可能になります。

OBS接続情報のpasswordのみ各環境に合わせて値を修正してください。

# OBS WebSocketのインポート
import obsws_python as obsws

# HTTPリクエスト用のインポート
import requests

# urllib3のインポート    
import urllib3

# LiveClientData APIのURL
API_URL = "https://127.0.0.1:2999/liveclientdata/allgamedata"

#URL検証なし
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)


# OBS接続情報
host = "localhost"
port = 4455
password = "**********"

# ゲームの状態を管理
record_flag = False  # 録画中: True, 録画停止: False

# APIデータ格納用変数
all_game_data = None

# OBS WebSocketクライアントの作成
ws = obsws.ReqClient(host=host, port=port, password=password)

# 無限ループでゲーム状態を監視
while True:
    
    try:
        # すべての情報を取得
        all_game_data = requests.get(API_URL, verify=False)
    except requests.exceptions.RequestException:
        # 例外発生時はゲーム開始待ちとみなす
        print("ゲーム開始待ち")
        all_game_data = None

    # データが取得できれば、試合開始または試合中と判断
    if all_game_data:
        # 既に録画中か確認。録画停止なら録画開始する
        if not record_flag:
            # 録画開始
            ws.base_client.req("StartRecord")
            print("録画開始")
            record_flag = True # 録画中に設定

    else:
        # データが取得できず、録画中なら録画停止する
        if record_flag:
            # 録画停止
            res = ws.base_client.req("StopRecord")
            print("録画停止")
            record_flag = False # 録画停止に設定

# OBSから切断
ws.disconnect()

解説

 サンプルコードを実行すればLoLの録画開始・終了は自動化できます。

 しかし、さらなる改良となるコードを把握していないとどこから手を付ければよいかわからないと思うのでポイントを解説します。

ゲーム開始検知

 ゲーム開始の検知は「all_game_dataが取得できるか否か」で判断しています。

 LiveClientDataAPIはゲームクライアントが起動していない時に接続できないため、リクエストを投げるとエラーが返却されます。
 そのため、「レスポンスが返ってきたらゲーム中、エラーが返ってきたらゲーム終了中」として処理させています。

 コードとしては以下が該当します。

    try:
        # すべての情報を取得
        all_game_data = requests.get(API_URL, verify=False)
    except requests.exceptions.RequestException:
        # 例外発生時はゲーム開始待ちとみなす
        print("ゲーム開始待ち")
        all_game_data = None

録画開始タイミング

 録画開始タイミングは「LiveClientDataAPIが最初に取得できたタイミング」としています。
 ここで大事なのは”最初に取得できたタイミング”です。

 ゲーム中は常にLiveClientDataAPIがレスポンスを返してくるため、「レスポンスを取得できたら」という条件にすると、ゲーム中ずっとOBS録画開始が実行されることになります。
 OBS側では「録画中に録画開始」をしても特にエラーは発生しませんが、不要な録画開始なのでゲーム開始時のみ録画開始できるようにしましょう。

 具体的には「record_flag」を設け、録画停止(record_flagがFalse)であれば録画開始、録画中(record_flagがTrue)であれば録画中としてスキップさせます。
コードとしては以下が該当します。

   # データが取得できれば、試合開始または試合中と判断
    if all_game_data:
        # 既に録画中か確認。録画停止なら録画開始する
        if not record_flag:
            # 録画開始
            ws.base_client.req("StartRecord")
            print("録画開始")
            record_flag = True # 録画中に設定

録画終了タイミング

 録画終了タイミングは「録画中、かつ、LiveClientDataAPIが取得できなくなったタイミング」です。

 録画開始タイミングでも説明しましたが、”録画中”を条件として含めないとゲーム終了後に連続して録画終了処理が実行されてしまいます。
 そのため、録画中(record_flagがTrue)であり、all_game_dataが取得できない時に録画終了させます。

 コードとしては以下が該当します。

    # データが取得できれば、試合開始または試合中と判断
    if all_game_data:
     ~中略~   
    else:
        # データが取得できず、録画中なら録画停止する
        if record_flag:
            # 録画停止
            res = ws.base_client.req("StopRecord")
            print("録画停止")
            record_flag = False # 録画停止に設定

応用編

 League Of Legends自動録画ツールを実際に動かしてみて課題にあがったのは

  • 「どこに録画ファイルいれたっけ・・・?」
  • 「どのファイルがいい試合だったっけ・・・?」

 などです。
 OBSの録画機能を使うため、基本的には接頭辞+日時情報しか付与されません。
そこに、LiveClientDataAPIから自身と対面のチャンピオン名を付与し、指定したフォルダに移動することで分かり易く管理できます。

 応用編のサンプルコードはそのうち記事として起こそうと思います。
コメントで「早くしてくれ!」などリアクションがあれば優先的に作ります。

コメント