はなちるのマイノート

Unityをメインとした技術ブログ。自分らしくまったりやっていきたいと思いますー!

【Excel】エクセルでうまぴょい伝説(動画)を再生させたみた

はじめに

先日このようなものを作ってみました。

中身としてはエクセルで動画を再生してみるというものになりますが、これをどうやって実装したかを描いていきたいと思います。

実装の流れ

エクセルに動画ファイルを埋め込むことができるそうですが、これでは面白くありません。ですので直接エクセルのセルに色つけを行いたいと思いました。
Excelワークシートからビデオファイルを再生する方法は?


今回実装する流れはこちら。

f:id:hanaaaaaachiru:20210609221154p:plain
実装の流れ


具体的には,

  1. 動画の1フレームの色のデータをエクセルの一行に書き込み,再生するフレームの数だけデータを埋め込む
  2. エクセルに書き込まれている動画データを,エクセルのマクロ機能で再生する

この2つを行なっていて,1をUnityで,2をエクセルのマクロ機能を使って実現しました。

一応Twitterにその作業の様子の動画を上げてあります。


mp4を読み込み低解像度化,CSV書き込み

まずmp4と同じ解像度でエクセルに再生しようと思ったのですが、後述するエクセルの実装方法ではフレームレートが維持できませんでした。

ですのでまずmp4の動画データを低解像度化,具体的には53px x 30pxにまで落としてます。

加えてエクセルの仕様で一度の実行でセルの書式(色を含む)には上限があるようで、RGBのデータを0 ~ 255の30刻み(0, 30, 60, ...)になるようにしています。

それを加味した上でプログラムを記述します。

動画の再生はVideo Playerを利用し、からなずRenderTextureを通して行うようにします。
【Unity】3分で分かるRenderTextureを使ってRawImageにカメラの映像を写す手順 - はなちるのマイノート
Video Player コンポーネント - Unity マニュアル

VBAで再生

あとは書き込んだデータを再生するだけですが、エクセルには以下のような条件がありました。

  • セルの書式の書き込みは一つずつしかできない(書式が同じものは一気にできる)
  • 書式の上限が設定されている

特にセルへの書き込みがボトルネックになってしまい、処理速度を一気に落としてしまいました。

そもそもCPUで処理を行なっている上に、セルへの書き込みがすごい遅いので納得といえば納得ですが、上手い解決方法を見つけることができませんでした。

それを加味した上で以下のコードを記述しました。


さいごに

Unityの使い方であったりVBAの使い方については説明しませんが、なんとなく実装の流れが伝わっていただければ幸いです。

VBAをすごい久しぶりに使ったのですが、やっぱり使いづらいかったですね。

たしかGoogleスプレッドシートにもVBAのようなこと(Google Apps Script)ができますが、あちらはJavaScriptTypeScriptで記述することができたのでかなり使いやすかったイメージです。

今回はかなり実用性のないものでしたが、面白かったのでよしとします。

ではまた。