わくわく計算ライフ

ドムプラをキメつづけるブログになりつつある。

格ゲー動画切り出しアプリ 斬り麿-kirimaro- の開発開始

初期バージョンより大分高速になったv0.2.0をリリースしました!

GGSTをプレイする上で効率良く動画を観れるようにしたいな、ということでツールの作成を開始しました。
その名は切り麿-kirimaro-これからどんどん拡張していこうと思うのでよろしくお願いいたします。

1. 振り返り用動画記録の問題

Guilty Gear Striveでは対戦リプレイが保存機能があり、それで振り返りができるのですが、以下の問題があります。
(もしかすると最新版では解消されてるものもあるかもしれません)

  • ラグが再現できない
  • ラグが大き目だった試合は途中で失敗することがある
  • 他のプラットフォームのプレイヤーには見せられない(PS4,5 <-> Steam間)

記録するときも理想的には、試合開始前に録画開始して試合が終わったら録画終了とすると試合ごとに動画ができて見返し易いし便利なのですが、まぁ録画ボタンとか停止ボタン押し忘れたりしますよね!
というわけで、ランクマとか入るときにディスク容量の暴力で撮りっぱなしとかにするんですが、そうすると後で見返したときに試合の位置を探すのがめっちゃ面倒くさい!

人類は思いました。

試合のとこだけ、動画切り出して分けといてくんねーかなー

という訳でそれを実現するプログラムを作成することにしました。

2. GGST動画の画面解析の基本アルゴリズム

いわゆるAnime系のゲームでかつ安定したインジケーターがあるゲームなので古典的なパターンマッチングベースで開発を行っています。 基本的にはDUEL 1の画面(以下参照)を検出して、そのちょっと前から切り出しを開始し

f:id:savaki:20211224214337p:plain
試合開始画面

Result画面の下部中央のGUILTY GEAR -STRIVE-の文字の箇所を検出してそのちょっと前で試合終了としています。
f:id:savaki:20211224214501p:plain
Result 画面

ちなみにこの方式ですとちょっと問題があって、観戦者の場合はResult画面が出ないので切れないということになっています。
通常のランクマとローカル(オフライン)対戦では問題ないと思いますが、オンラインの2on大会とかだと支障がでますね。

一応観戦の場合でも試合終了を検出する方法はあるんですが、それは勝利画面でのセリフの文字が出たかどうかを検出することなんですが。
キャラのセリフ(複数) x 背景 x 言語 の組み合わせが多くて、おそらくDeepLearning使わんとアカンかなーって感じなので、データを集めるのが面倒なのと、要求スペックが上がるので利用者に負荷が大きいと思い現時点では保留しています。

3. 使い方!

Windows環境で作成しているので(Steamおじなのでな。SteamもLinuxでGGST動くならUbuntuで暮らしたい)、Windowsでの使い方を説明します。
とは言ったものの、汎用的なPythonスクリプト(ver3.9.7)とffmpegを組み合わせたアプリなので、他のOSでもこれらが動けばなんとかなるはずです。

(1) リポジトリをcloneします。
(2) requiremnents.txtを参照してPython環境に必要なパッケージをインストールします。
(3) ffmpegはあらかじめインストールしてffmpeg.exeにパスを通しておきます。
(4) リポジトリのルートディレクトリから
python src/python/kirimaro.py --src_dir [入力ディレクトリ] --dst_dir [出力ディレクトリ]
を実行します。

すると入力ディレクトリの直下の.mp4のファイルを解析し、解析が完了すると解析結果(footages.csvに保存されます)を元にffmpegを使って、試合の動画を切り出します。
試合の動画は出力ディレクトリの下に、元の動画と同じ名前のディレクトリが作成されその下にどんどん格納されます。
ちなみに元動画がmovie.mp4だった場合、movieというサブディレクトリが作成され、その下にmovie_hh_mm_ss.mp4という名前で、元ファイル先頭からの再生開始時間を付加したファイル名で保存されます。

4. 出力例

src下のmp4dst以下に展開したサンプルをポイントしておきます。こんな感じで切れますので、使う前に様子を見たい方はどうぞ。

入出力サンプル

5. 今後の予定

もう1タイトルぐらい対応して、切り替えも含め基本的な部分を作成したら、Rust版を作りたいですね。
動画の切り出し自体はエンコーディングを考えるとやはり外部のffmpegとか叩いた方が効率良い気がするのでそこはそのままになりそうですが。
解析部分の高速化が目的です。