CameraUIが使えれば良いんですが、Stage表示ツリー上でCameraからの映像を表示させたいとき、いろいろポイントがあったのでまとめておきます。
基本的には普通にFlashでカメラの映像を表示するように、Camera.getCamera()で取得したCameraオブジェクトをvideo.attachCameraすればいいのですが、iOS独自で詰まったポイントをいくつか。
まず、カメラの画像が何故か横に回転した状態で取得されるので、videoを90度回転させるようにしています。
カメラをsetModeでstageサイズと一緒にしても、ちょっとずれるのでvideoオブジェクトとさらにそれを内包するコンテナー用Spriteオブジェクトさんをちょっと拡大縮小表示してもらっています。
カメラの縦横比率はこちらのページを参考にさせて頂きました。
カメラのサイズの比率でゆがまないように調整をする。
こちらの記事がなければ自分だけでは縦横比を保持する考えは生まれませんでした。ありがとうございます。
今回スニペット化するにあたり個人的にはこういう機種ごとに差異が生まれる可能性を場当たり的に対処法をストックしていくのは嫌いなんですが、かといってこんなところで時間をとられるのも嫌なので、また同じ現象で悩んだ人が居たときに過去にこういう対処法をしたというのが見つかるだけでも心強いかも知れないので記録しておきます。
すがすがしいまでの手続き型で書いてますが、実際には必要に応じて書き換えていきたいと思います。
import flash.media.Camera;
import flash.media.Video;
import flash.display.Sprite;
//Cameraを初期化
var cam:Camera = Camera.getCamera();
var _w:Number;
var _h:Number;
var _p:Number = 4/3;
const _FPS:int = 10;
if(stage.stageHeight / stage.stageWidth > _p){
_w = stage.stageWidth;
_h = _w * _p;
}else{
_h = stage.stageHeight;
_w = _h * _p;
}
cam.setMode(_h, _w, _FPS);
//Viewoを初期化。90度回転
var video:Video = new Video(cam.width, cam.height);
video.attachCamera(cam);
video.rotation = 90;
video.x = cam.height;
//コンテナーを初期化
var cont:Sprite = new Sprite();
cont.addChild(video);
cont.width = stage.stageWidth;
cont.scaleY = cont.scaleX;
if(cont.height < stage.stageHeight){
cont.height = stage.stageHeight;
cont.scaleX = cont.scaleY;
}
cont.x = (stage.stageWidth - cont.width) * 0.5;
cont.y = (stage.stageHeight - cont.height) * 0.5;
addChild(cont);