ProcessingライブラリVideo Exportを試すの続き。リアルタイム動画生成目的ではライブラリには頼れそうにないので、あらためて処理を検証してみました。
Processingで保存可能な静止画の形式はリファレンスによれば次になります:
- TIFF(.tif)
- TGA(.tga)
- JPEG(.jpg)
- PNG(.png)
JPEGだけ非可逆圧縮、他は可逆圧縮ですね。
このうちTIFFはサイズがおおきくなりすぎて大量画像の取りあつかいには向きません。PNGは保存に時間がかかりすぎてリアルタイム動画生成目的には不向き。JPEGは非可逆圧縮の上にPNGほどではないにせよ時間がかかるのでできれば避けたいところ。となると残るはTGAのみ……
しかしJavaをベースにしたProcessingには非同期処理という強い味方があるのでした。さすがにthread()関数利用はこわいので(非同期処理に下手に手を出すと大火傷するのです)Executorフレームワークを使って試作。これでどうなるかとひととおり試してみたところ(TIFFは除きます)……
- PNGはこれでも遅すぎます。
- TGAは、なぜかサイズが0のファイルばかり生成されてうまくいきません。
- JPEGは同期保存のTGAに迫る速度まで性能が向上します。
うーん、TGAが非同期で保存できればいちばんよかったのですが。しかしこれでベストプラクティスは次のふたつに絞られました:
- TGAを同期処理で保存
- JPEGを非同期処理で保存
FPSと解像度のどちらを優先するかによって選べばよさそうです。
というわけでクラスにまとめてみました。
自分で利用する分には列挙を定義したりしましたが、Processingの制約であんまりJavaっぽいコードにならなかったのでそこは省略。興味のある方はGitHubリポジトリを覗いてください。
これ以上の性能を実現するにはOpenCVなどの助けを借りるしかなさそうですが、当面はとてもそこまでは手を出せません。しばらくはこれらのクラスでなんとかしのいでいきたいと思います。