1 Video Auto Splitter の使い方 みんなに公開

目次Video Auto Splitter とは従来の映像監視式 Auto Splitter との差異デメリット導入方法OBS Virtual Camera の導入LiveSplit のバージョンを確認Video Auto Splitter を導入ゲームのプロファイルを作成参考リンク集LiveSplit で設定する最後に

Video Auto Splitter とは

Video Auto Splitter(GitHub)
LiveSplit のコンポーネントで機能し、OBS の VirtualCam のような仮想カメラの機能で映像を監視し、ラップの自動取得をするもの。

従来の映像監視式 Auto Splitter との差異

例えばこういうやつ

  • LiveSplit のコンポーネントとして機能する。
    • → 別のソフトを起動する必要がない。デスクトップが煩雑にならない
  • 仮想カメラを用いて映像監視をする。
    • → 逐一キャプチャ範囲を指定せずに済む。凄いスッキリ
  • ラップの取得方法をスクリプト(Auto Splitting Language)で記述する。
    • → 映像の一瞬ではなく、前後関係を監視してラップを取れるなど、ラップの取得方法にある程度の自由が利く。
  • うまいことやると In-Game Time の計測もできる。
    • → ASL で制御する最大のメリット。

デメリット

  • 初期設定が大変手間
  • プヨグヤミングチョットワカラナイトキツイ。タブン。
  • LiveSplit がプロセスに残って仮想カメラの起動を阻害するなどのバグがある。

導入方法

  1. OBS VirtualCam を導入
  2. LiveSplit のバージョンを確認
  3. Video Auto Splitter を導入
  4. ゲームのプロファイルを作成
  5. LiveSplit で設定する

OBS Virtual Camera の導入

導入済みなら飛ばして下さい。仮想カメラが飛ばせれば何でもいいです。
ベータ版OBS の 26.x.x で公式がサポートしてるからそれでも構いません。
(自分の環境だとなぜか公式の仮想カメラが LiveSplit に対して使えなかったので、いろいろ試しながら環境と相談してください。)

  1. 配布サイトへ(2.0.5 を導入しろと書いてありますがなんか動かないので旧バージョンを使っています。動けば最新版でも。)
  2. 「Go to download」からインストーラをダウンロード
  3. インストーラを起動し、指示通りに適当にインストールする
  4. OBS を起動し、ツールに「VirtualCam」が存在することを確認

LiveSplit のバージョンを確認

というか最新版を使いましょう。1.7.6 以降なら問題ないです。

Video Auto Splitter を導入

  1. 配布サイト
  2. 「LiveSplit.VideoAutoSplit.v0.5.2.3.zip」をダウンロード
  3. 中身を展開し、dllを全てLiveSplit/Components/下に配置
  4. LiveSplitを起動
  5. Edit Layout から Control → Video Auto Splitter が存在することを確認

ゲームのプロファイルを作成

ここの手間が滅茶苦茶かかります。とりあえず動作確認したい場合はこのファイルをダウンロードし、「LiveSplit で設定する」へ。

以下では Video Auto Splitter のカスタマイズ性を無視し、あくまで最もシンプルなラップの取り方のみを考慮した手順になります。
あらかじめ作業フォルダなどを作成しておきましょう。

  1. あらかじめOBSの画質やレイアウトを調整しておく。

    • SD画質のゲームで、画面が黒一色になったときに、映像のノイズやちらつきが抑えられることが望ましいです。

      ムジュラの仮面での例
      映像キャプチャデバイス
      GV-USB2, Analog Capture

      設定

      • OBS設定
        • 解像度: 1280*720
        • FPS: 59.94
      • デバイス設定
        • 解像度/FPS タイプ: カスタム
        • 解像度: 720*480
        • FPS: 最高FPS
        • 映像フォーマット: 任意
        • 色空間: 709
        • 色範囲: 一部
        • バッファリング: 無効
      • 変換
        • 位置:
          • x: 320.0, y: 0.0
        • 大きさ:
          • w: 960.0, h: 720.0
        • クロップ:
          • 左: 8, 右: 8
      • フィルタ
        • シャープ: 0.08
        • 色補正: ガンマ: -0.12
  2. ラップを取るタイミングを考え、その前後の瞬間についてのスクショを取っておく。

    • 画像が変わったと認識されうる、できるだけはっきりとしたシンボルが映る瞬間にしましょう。
    • あらかじめ録画しておき、それをもとに画像を抽出するとやりやすいです。
    • スクショのスパンは短いほうが望ましいですが、2000 ms 程度でも問題ありません。

    計測開始時の画像の一例
    計測開始前:
    start_1
    計測開始後:
    start_2

  3. スクショからシンボルを抽出する。

    • この時、切り取った画像の左上の座標サイズをメモしておきましょう。


    座標: (383, 274), サイズ: 85x27
    heart
    heart_black

  4. 作成したファイルをフォルダに纏めておく。


    Work
    └ Image
     ├ start.png
     ├ start_blackout.png
     ├ ...

  5. 画像を定義する xxx.xmlファイルを作り、ワークフォルダー下に配置。

    • xxxはカテゴリの名前など分かりやすいように設定して下さい。
    • 概ね以下のような感じ。
<?xml version="1.0" encoding="utf-8"?>
<GameProfile xmlns:xsd="http://www.w3.org/2001/XMLSchema"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <Name>The Legend of Zelda: Majora's Mask - Kafei's Mask</Name>
  <Screens>
    <Screen>
      <Name>Game</Name>
      <Geometry>
        <Width>960</Width>
        <Height>720</Height>
      </Geometry>
      <!-- 監視範囲の定義 -->
      <WatchZones>
        <!-- 監視範囲1 -->
        <WatchZone>
          <Name>start</Name>
          <!-- さきほどメモした座標とサイズを記述 -->
          <Geometry>
            <X>383</X>
            <Y>274</Y>
            <Width>85</Width>
            <Height>27</Height>
          </Geometry>
          <Watches>
            <Watcher>
              <Name>heart</Name>
              <!-- 同じ範囲で監視する画像すべてについてのパスを記述 -->
              <WatchImages>
                <WatchImage>
                  <FilePath>Image\heart.png</FilePath>
                </WatchImage>
                <WatchImage>
                  <FilePath>Image\heart_blackout.png</FilePath>
                </WatchImage>
              </WatchImages>
            </Watcher>
          </Watches>
        </WatchZone>
	<WatchZone>
	  <!-- 他のファイルがあれば同様に追記 -->
	</WatchZone>
      </WatchZones>
    </Screen>
  </Screens>
</GameProfile>
  1. スクリプトファイル(script.asl)を作成し、ワークフォルダー下に配置。
    • 名前は script.asl にして下さい。
    • 記述方法は概ね以下の通り。多少C系統のプログラミングに触れたことのある方であれば、なんとなく読めると思います。
    • VSCode に Auto Splitting Language のシンタックスハイライトとスニペット表示の拡張機能があります。
// このスクリプトは複数のラップを想定していません。
// 計測開始のタイミングならば true を返す。
// つまり true を返すときに計測開始させられるようにスクリプトを組む。
start
{
    // features["画像ファイル名"].current は現在の画像一致率
    // features["画像ファイル名"].old((int) ms) は[ms]前の画像一致率
    // 画像一致率については後程
    return features["heart_black"].current > 90.0
         && features["heart"].current < 90.0
         && features["heart_black"].old(1000) < 90.0
         && features["heart"].old(1000) > 90.0; 
}

// リセットのタイミングならば true を返す。
reset
{
    // 定義した画像に基づいて記述
}

// ラップを取るタイミングならば true を返す。
split
{
    // 定義した画像に基づいて記述
}
  1. ワークフォルダー をzipファイルにし、拡張子を.vasに変更する。

以上で最もシンプルな形のプロファイルが完成です。
他にもスクリプト面で様々なカスタマイズが可能ですので、以下に一例を載せておきます。

  • ロード中のタイミングの定義
isLoading
{
	return features["xxx"].current > 90.0;
}
  • 変数の定義、および毎フレームの処理
init
{
	vars.xxx = 0.0;
	vars.yyy = 10.0;
}

update
{
	vars.xxx++;
	vars.yyy = featrues["xxx"].current - featrues["yyy"].current;
}

参考リンク集

LiveSplit で設定する

  1. 作成したxxx.vasファイルを分かりやすい場所へ配置。

例)Livesplit/vas/xxx.vas

  1. LiveSplit と OBS Studio を起動。
  2. OBS Studio の VirtualCam を起動。
  3. Edit Layout から Video Auto Splitter を適当に配置。
  4. 配置した Video Auto Splitter をダブルクリック。
  5. Game Profile に先ほど配置したxxx.vasを設定。
  6. Capture Device に仮想カメラを設定。
  7. Scan Region へ。
  8. ゲーム画面の範囲を指定。
    • 動作確認用のvasファイルをダウンロードした場合は、同梱のReadme.mdに従って映像フォーマットを設定してください。細かい設定まで反映する必要はありませんが、同様にしておくと精度が向上します。
    • 動作確認用のvasファイルは、ゼルダの伝説ムジュラの仮面のカーフェイのお面RTAのラップを取るものです。ゲームを所持していない場合は誰かの動画をブラウザソース等で以下のように配置して世界記録を取って遊んでください。
      sample
    • デバイスが異なる場合は、ゲーム画面がバウンディングボックス一杯に広がるように設定して下さい。
  9. OK から設定を保存して終わり。

設定がうまくいっていればゲームの進行度に合わせてラップが取られるはずです。
こんな感じ

上手くいかなければ、おそらく前述した画像一致率に問題がある可能性があります。
LiveSplit 上で Video Auto Splitter > Features を開くと、各ステータスの画像一致率(と変数)が表示されているのがわかると思います。
ここの値が当該映像になった際に、スクリプト上の設定値とあっているか確認してください。

最後に

ASL 周りがあまりわかっていないので、何かしら知識のある方が補足してくれるとありがたいです。

1

メモを他の人に見せる

このメモを見せたい人に、このURL(今開いているページのURLです)を教えてあげてください

コメント(0)

  • someone

  • someone