--- Title: Video Auto Splitter の使い方 Author: agdf_ydy Web: 'https://mimemo.io/m/vj5XN4jVYW486d7' --- @[TOC](目次) ## Video Auto Splitter とは [Video Auto Splitter](https://github.com/ROMaster2/LiveSplit.VideoAutoSplit)(GitHub) LiveSplit のコンポーネントで機能し、OBS の VirtualCam のような仮想カメラの機能で映像を監視し、ラップの自動取得をするもの。 ## 従来の映像監視式 Auto Splitter との差異 例えば[こういうやつ](https://github.com/Toufool/Auto-Split)。 * LiveSplit のコンポーネントとして機能する。 * → 別のソフトを起動する必要がない。**デスクトップが煩雑にならない**。 * 仮想カメラを用いて映像監視をする。 * → 逐一キャプチャ範囲を指定せずに済む。**凄いスッキリ**。 * ラップの取得方法をスクリプト(Auto Splitting Language)で記述する。 * → 映像の一瞬ではなく、**前後関係を監視してラップを取れる**など、ラップの取得方法にある程度の自由が利く。 * うまいことやると In-Game Time の計測もできる。 * → ASL で制御する最大のメリット。 ## デメリット * **初期設定が大変手間**。 * プヨグヤミングチョットワカラナイトキツイ。タブン。 * LiveSplit がプロセスに残って仮想カメラの起動を阻害するなどのバグがある。 ## 導入方法 1. OBS VirtualCam を導入 1. LiveSplit のバージョンを確認 1. Video Auto Splitter を導入 1. ゲームのプロファイルを作成 1. LiveSplit で設定する ### OBS Virtual Camera の導入 導入済みなら飛ばして下さい。仮想カメラが飛ばせれば何でもいいです。 ~~ベータ版~~OBS の 26.x.x で公式がサポートしてるからそれでも構いません。 (自分の環境だとなぜか公式の仮想カメラが LiveSplit に対して使えなかったので、いろいろ試しながら環境と相談してください。) 1. [配布サイト](https://obsproject.com/forum/resources/obs-virtualcam.539/)へ(2.0.5 を導入しろと書いてありますがなんか動かないので旧バージョンを使っています。動けば最新版でも。) 1. 「Go to download」からインストーラをダウンロード 1. インストーラを起動し、指示通りに適当にインストールする 1. OBS を起動し、ツールに「VirtualCam」が存在することを確認 ### LiveSplit のバージョンを確認 というか最新版を使いましょう。1.7.6 以降なら問題ないです。 ### Video Auto Splitter を導入 1. [配布サイト](https://github.com/ROMaster2/LiveSplit.VideoAutoSplit/releases)へ 1. 「LiveSplit.VideoAutoSplit.v0.5.2.3.zip」をダウンロード 1. 中身を展開し、dllを全て`LiveSplit/Components/`下に配置 1. LiveSplitを起動 1. Edit Layout から Control → Video Auto Splitter が存在することを確認 ### ゲームのプロファイルを作成 ここの手間が滅茶苦茶かかります。とりあえず動作確認したい場合は[このファイル](https://drive.google.com/file/d/1dmdatjgB34eQohq3ju5lI_PtXFpWlS10/view?usp=sharing)をダウンロードし、「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](https://mimemo.s3-ap-northeast-1.amazonaws.com/attachment/eda5b325-5483-43c6-b107-00d868101966.png) >計測開始後: ![start_2](https://mimemo.s3-ap-northeast-1.amazonaws.com/attachment/a420da9e-6e3f-4031-a0d0-42efa8f867d7.png) 3. スクショからシンボルを抽出する。 * この時、切り取った画像の**左上の座標**と**サイズ**をメモしておきましょう。 > 例 > 座標: (383, 274), サイズ: 85x27 > ![heart](https://mimemo.s3-ap-northeast-1.amazonaws.com/attachment/0ba12696-1888-4534-8b8b-f5caea46e1fd.png) ![heart_black](https://mimemo.s3-ap-northeast-1.amazonaws.com/attachment/d30ccf09-42b4-40d2-93ef-23c8e9c986c7.png) 4. 作成したファイルをフォルダに纏めておく。 > 例 > Work > └ Image >  ├ start.png >  ├ start_blackout.png >  ├ ... 5. 画像を定義する `xxx.xml`ファイルを作り、ワークフォルダー下に配置。 * `xxx`はカテゴリの名前など分かりやすいように設定して下さい。 * 概ね以下のような感じ。 ```xml The Legend of Zelda: Majora's Mask - Kafei's Mask Game 960 720 start 383 274 85 27 heart Image\heart.png Image\heart_blackout.png ``` 6. スクリプトファイル(`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 { // 定義した画像に基づいて記述 } ``` 7. **ワークフォルダー** を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; } ``` #### 参考リンク集 * そのほか過去に有志が制作した`.vas`ファイル * [Splatoon 2 Octo Expansion](https://www.reddit.com/r/speedrun/comments/a90lsg/video_auto_splitter_for_livesplit_is_now/) * [Mario Kart 8 Delux (raw files)](https://github.com/VikeMK/MK8DX-Video-Autosplitter/tree/master/MK8DX) * 自分が制作したもの * [Fire Emblem: Path of Radiance (Normal JP)](https://github.com/ufodauge/fe9_normal_jp) * 役立ちそうなリンク集 * [海外 Discord サーバー](https://discord.gg/6HD5jtQ) ### LiveSplit で設定する 1. 作成した`xxx.vas`ファイルを分かりやすい場所へ配置。 > 例)`Livesplit/vas/xxx.vas` 2. LiveSplit と OBS Studio を起動。 1. OBS Studio の VirtualCam を起動。 1. Edit Layout から Video Auto Splitter を適当に配置。 1. 配置した Video Auto Splitter をダブルクリック。 1. Game Profile に先ほど配置した`xxx.vas`を設定。 1. Capture Device に仮想カメラを設定。 1. Scan Region へ。 1. ゲーム画面の範囲を指定。 * 動作確認用のvasファイルをダウンロードした場合は、同梱の`Readme.md`に従って映像フォーマットを設定してください。細かい設定まで反映する必要はありませんが、同様にしておくと精度が向上します。 * 動作確認用のvasファイルは、ゼルダの伝説ムジュラの仮面のカーフェイのお面RTAのラップを取るものです。ゲームを所持していない場合は[誰かの動画](https://youtu.be/HCArAdEE4UI)をブラウザソース等で以下のように配置して世界記録を取って遊んでください。 ![sample](https://mimemo.s3-ap-northeast-1.amazonaws.com/attachment/268d0e23-6ffe-42e1-a604-0e90605c25c0.png) * デバイスが異なる場合は、ゲーム画面がバウンディングボックス一杯に広がるように設定して下さい。 1. OK から設定を保存して終わり。 設定がうまくいっていればゲームの進行度に合わせてラップが取られるはずです。 こんな感じ https://twitter.com/agdf_ydy/status/1308259790116667392 上手くいかなければ、おそらく前述した画像一致率に問題がある可能性があります。 LiveSplit 上で Video Auto Splitter > Features を開くと、各ステータスの画像一致率(と変数)が表示されているのがわかると思います。 ここの値が当該映像になった際に、スクリプト上の設定値とあっているか確認してください。 ## 最後に ASL 周りがあまりわかっていないので、何かしら知識のある方が補足してくれるとありがたいです。