Video Auto Splitter(GitHub)
LiveSplit のコンポーネントで機能し、OBS の VirtualCam のような仮想カメラの機能で映像を監視し、ラップの自動取得をするもの。
例えばこういうやつ。
導入済みなら飛ばして下さい。仮想カメラが飛ばせれば何でもいいです。
ベータ版OBS の 26.x.x で公式がサポートしてるからそれでも構いません。
(自分の環境だとなぜか公式の仮想カメラが LiveSplit に対して使えなかったので、いろいろ試しながら環境と相談してください。)
というか最新版を使いましょう。1.7.6 以降なら問題ないです。
LiveSplit/Components/
下に配置ここの手間が滅茶苦茶かかります。とりあえず動作確認したい場合はこのファイルをダウンロードし、「LiveSplit で設定する」へ。
以下では Video Auto Splitter のカスタマイズ性を無視し、あくまで最もシンプルなラップの取り方のみを考慮した手順になります。
あらかじめ作業フォルダなどを作成しておきましょう。
あらかじめOBSの画質やレイアウトを調整しておく。
ムジュラの仮面での例
映像キャプチャデバイス
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
ラップを取るタイミングを考え、その前後の瞬間についてのスクショを取っておく。
計測開始時の画像の一例
計測開始前:
計測開始後:
スクショからシンボルを抽出する。
例
座標: (383, 274), サイズ: 85x27
作成したファイルをフォルダに纏めておく。
例
Work
└ Image
├ start.png
├ start_blackout.png
├ ...
画像を定義する 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>
script.asl
)を作成し、ワークフォルダー下に配置。
script.asl
にして下さい。// このスクリプトは複数のラップを想定していません。
// 計測開始のタイミングならば 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
{
// 定義した画像に基づいて記述
}
.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
ファイル
自分が制作したもの
役立ちそうなリンク集
xxx.vas
ファイルを分かりやすい場所へ配置。例)
Livesplit/vas/xxx.vas
xxx.vas
を設定。Readme.md
に従って映像フォーマットを設定してください。細かい設定まで反映する必要はありませんが、同様にしておくと精度が向上します。設定がうまくいっていればゲームの進行度に合わせてラップが取られるはずです。
こんな感じ
https://twitter.com/agdf_ydy/status/1308259790116667392
上手くいかなければ、おそらく前述した画像一致率に問題がある可能性があります。
LiveSplit 上で Video Auto Splitter > Features を開くと、各ステータスの画像一致率(と変数)が表示されているのがわかると思います。
ここの値が当該映像になった際に、スクリプト上の設定値とあっているか確認してください。
ASL 周りがあまりわかっていないので、何かしら知識のある方が補足してくれるとありがたいです。