最近はやりのユーチューバーの皆さん。モンストで遊んだ動画 をYouTubeにたくさん投稿されてます とても全部は見切れないので有名な 人気動画配信者のものだけざざっと観るだけです。
モンストのガチャの動画は結構好き で、リアクションを見てると 楽しい。そこで、↓こんな感じで画面四分割した同期した動画をつくれないかなーとやってみました
実現に向けてやること
- タイミングを合わせる のが重要です。
- そのために各動画のガチャのタイミングが一致するフレーム番号 を見つける必要があります。
さっそくやってみますので下準備
動画 から画像ファイル を取り出す
ffmpeg を使って↓下のようにしてフレームを画像にしてしまいます。その前に下準備でfpsを20fpsとかに揃えておくのが良いかもしれません。それにしても画像処理はPCを熱く してくれます。
ffmpeg -i foo.avi -r 1 -s WxH -f image2 foo-%03d.jpeg
特徴となるタイミングの画像を準備
今回うまくいくかわかりませんが、モンストのガチャで顔 がぐるぐる回ったときの270度ぐらい回ったタイミングを使ってみます。
各動画で↑上の画像が出てくるタイミングさえ揃えられれば、その前がどうであれ、
ガチャ→光演出→モンスターゲット
の流れが綺麗にそろうはずです。それにしてもなかなか金の卵 が出ませんね。
最近イベントでやってる青いガチャやゴジラガチャは対応できません! とほほ
opencv を使って、テンプレートマッチングをする
rubyを使っているので opencv をインストールした後に ruby-opencv というgemを入れた環境を準備しました。両方ともインストールにてこずりました。メモを取っていたらqiitaの記事に書けたのに
ruby-opencv の使い方は↓下の記事を参考にしました。とても分かりやすいです テンプレートマッチングはテンプレートの特徴量に近い対象画像の部分を捜査して、最もマッチする場所を教えてくれる機能で、opencvにはすぐに使えるものが実装されています。
テンプレートマッチングは画像処理・検索の基本のきなので、最近はやりのディープラーニング なんかと比べると大したことない感じもしますが、使い道によっては超強力です
いくつかの動画で実験して、うまくいきそうなので、この方法で進めるよ。テンプレートマッチングの結果で得られる結果の数値はあくまで相対的なものだから、はずれのフレームから得られる結果と当たりのフレームから得られる結果に明らかな差が出ているようなら、それを採用してOKと考えるよ。グラフ にしてみると一目瞭然だったりします。
フーレム番号がわかったら前後を程度にトリミング
動画のトリミング は ffmpeg を使います。みんなが大好き -filter_complex を使っていくよ。trimを使おう。単純だから -vf でもいいんだけど
ffmpeg -i src1.mp4 -filter_complex "[0:v]trim=start_frame=10:end_frame=401" dst1.mp4
これで、フレームの10番目から400番目までが入った動画ができるよ 簡単だね 例えばもう一つの動画は70フレームがずれてたら、↓下の感じになるかもね。簡単すぎてやばいね
ffmpeg -i src2.mp4 -filter_complex "[0:v]trim=start_frame=80:end_frame=481" dst2.mp4
この二つだけでも横に並べれば比較動画ができるね
四分割動画の作成
これも ffmpeg を使うとあっという間にできちゃいます。dst1.mp4 みたいな感じで、動画が4つあったとすると overlay 使って簡単に。元の動画サイズを 1280x720 と仮定して、それらを 640x360 に縮小しつつ四分割のモザイク動画にするよ
**※このコマンドライン実は検証してないから間違ってるかも
ffmpeg -i dst1.mp4 -i dst2.mp4 -i dst3.mp4 -i dst4.mp4 -filter_complex "nullsrc=size=1280x720 [base];[0:v]scale=640:360[scaled0];[1:v]scale=640:360[scaled1];[2:v]scale=640:360[scaled2];[3:v]scale=640:360[scaled3];[base][scaled0]overlay=x=0:y=0[out0];[out0][scaled1]overlay=x=640:y=0[out1];[out1][scaled2]overlay=x=0:y=360[out2];[out2][scaled3]overlay=x=640:y=360" comp.mp4
よくわからなかったらここを見て
https://trac.ffmpeg.org/wiki/Create%20a%20mosaic%20out%20of%20several%20input%20videos
書いてたら眠くなってきたのでこの辺で