今週のざっくばらん
VideoShader 2.0
5年ほど前に VideoShader というアプリを iPhone 向けにリリースしました。OpenGL を最大限に使いこなし、動画のリアルタイム処理を可能にしました。当時はまだ iPhone4s や iPhone5 の時代で、似たようなアプリが存在しなかったどころか、そんなことが iPhone で可能になったことも知られていなかったので、結構評判になりました。
当時、Zeppelinという会社の人たちと一緒に、テキサスのオースチンで開かれていた SWSX に VideoShader のデモに行きましたが、デモを見た人の反応がとても良く、とても充実した時間を過ごせました。
その時に作ったプロモーションビデオ「VideoShader - Tokyo Train」は今でも Youtube で見ることが出来ます。
2週間ほど前に、映像のリアルタイム処理をするソフトウェアを書く必要が生じたため、久しぶりにオープンソース化してあった VideoShader のプロジェクトを開いたのですが、これだけ長く放置してあると、再利用は不可能だし、アーキテクチャとしても陳腐化しているので、使い物になりませんでした。
そこで、最新の技術を使って VideoShader を作り直すことにしました。主な変更点は以下の通りです。Swift で記述(1.0 は Objective-C)GPUプログラミングは Metal (1.0 は OpenGL)CoreImage の活用(1.0 は全て独自フィルター)SwiftUI に対応macOS にも対応
結構重要なのは、CoreImage の活用です。当時から iOS には CoreImage というモジュールがあり、画像処理用に CIFilter というクラスが用意されていましたが、遅くて動画には使えず、かつ、拡張性もありませんでした。しかし、iOS に Metal が導入されて以来、CoreImage チームによる Metal 対応が進み、今では動画の処理に十分に使えるスピードになったし、拡張性も充実しました。
そこで、まずは github にVideoShader2というリポジトリ(ソースコードを管理する場所)を作り、オープンソース・プロジェクトとして開発を開始しました。
ビデオ関連のアプリからはしばらく離れていたので、最初は少し苦労しましたが、2週間ほどで基本的な仕組みは動き始めました。一番苦労したのは、独自の CIFilter の実装の部分です。ネット上にあるドキュメントやサンプルの多くは(Apple 自身が提供しているものを含め)、CoreImage が Metal に対応する前のものなので、それがノイズとなって、適切な情報に到達するのを難しくしているのです。
ちなみに、映像をリアルタイム処理する際には、カメラから入って来た画像をGPU上で書かれた Shader というプログラムを適宜組み合わせた Shader-Pipeline を通すことにより行うのですが、通常のプログラミング言語で開発するととても複雑なのです。
VideoShader は、VSScript というスクリプト言語を導入することにより、開発を簡単にするだけでなく、デザイナーやユーザー同士でスクリプトを共有したり、オーサリング環境を作ることを可能にしようというビジョンの元に作りました(実際、VideoShader Composer というオーサリング・アプリも同時にリリースしました)。
VSScript は JSON (JavaScript から派生した階層状のデータ構造を記述する言語)で、上のプロモーションビデオで使っている "Cartoon II" というパイプラインは以下のように記述できます。
この記事は約
NaN 分で読めます(
NaN 文字 / 画像
NaN
枚)