satkaku

色々かいたものの試行錯誤

AIR for iOS でのカメラの取り扱いメモ【どのクラスを使えばいいのか?】

AIR for iOSでカメラ使う際の選択肢は2つあります。

1. flash.media.CameraUI

iOSデフォルトのカメラアプリを使用する方法です。
CameraUI#launchを使うだけで、簡単に呼び出せます。デフォルトのカメラアプリなので、ズーム、フラッシュの有無、フロントカメラとの切り替え、などがなんも実装しなくてもついてくるのがメリットです。とにかく簡単。

ただ致命的な問題が一点。

撮影した画像データは、MediaEvent.COMPLETEで飛んできたMediaEventのdataをLoader#loadFilePromiseで読み込んだ後、BitmapDataに落とし込んでごにょごにょするのですが、それがとにかく遅いです。

手元のiPhone4S(iOS6)でデバッグビルドで計測したところ、MediaEventを拾ってからLoader#loadFilePromiseがEvent.COMPLETEを返すまでに大体4秒近くかかってます。リリースビルドでもそんなに変わらない印象だったので、正直使い物にならない感じです。なんもいじらない状態での画像サイズが3264×2448あるので、Loaderに渡す前に縮小出来ればなんとかなりそうですが、なんとかならなそうです(そこまで調べてないですが)。

まあ、それに加えて、カメラ画面へのトランジション描写をカスタマイズできないとか、カメラ画面自体をカスタマイズできないとか、融通が効かないので、今自分が作っているアプリではこいつは使わないことに。

画像のロードの遅さはかなり致命的で、これ解決できないとそもそもこのクラス使い物にならないじゃん、ということを考えるとなんか抜け道がありそうな気がするんですけど、どうなんですかね。

2. flash.media.Camera

カメラからの画像をflash.media.Video(DisplayObject)に表示する方法です。
まあ、言ってしまえばそれだけなので、後は好き放題。フィルターをかけて、リアルタイムで画像処理をかけてもいいしカメラ画像の上にグリッドやメーターを表示させるでもいいし、カスタマイズ甲斐があります。最終的にはBitmapData#drawで転写すれば、CameraRollにも保存できます。

BitmapData#drawはかなり早いので、iPhone4Sの画面サイズくらいだと、デバッグビルドでも30ミリ秒くらい。これならサクサクですね。

ただしデメリットもあります。
・高解像度に弱い(高解像度サイズでVideoクラスつくっておいて、その上に画面サイズめいっぱいのBitmapクラス置いて縮小させつつ転写すれば実現できそうな気もしますが、多分めちゃ重。)

・ズームとか、フラッシュの有無とかが使えない

・シャッター音が出ない
所詮BitmapData#drawしてるだけなので、シャッター音とか当然出ません。一応Soundで出せますが、マナーモードにされると出ないし、どうなんでしょうね。AppStoreで、無音カメラ的なのって結構あるから、審査的にOKなんですかね。
もし駄目だったらどうしようもないですね。涙をふきましょう。

・フロントカメラの取り扱いがむかつく
Camera#namesで使用できるカメラの名称の配列が返却されます。
iPhone4Sだとこんなん
「背面側カメラ」「前面側カメラ」

Camera#getCameraは引数として、name:Stringを受け取れるのでついつい「camera.getCemera("前面側カメラ")」とやりたくなりますが、これだと駄目で、ここにはnamesで返却された配列のインデックス位置をStringで渡します。なので正解は「camera.getCamera("1")」。
まあ、ASDocにも書いてあるんですけど、なんなんですかね。


【結論】
まあ、実質的にCameraUIが使えないんで、Camera一択という気がしなくもないんですが、Cameraのシャッター音出ない問題が審査に引っかかるとしたらこっちも駄目なわけで、そうなるとどうなんだAIR for iOSというわけで、やっぱり結論としては、マルチプラットフォームとかの謳い文句なんかに頼るな、というお話になります。