イナヅマTVログ

Stage3D, Starlingを使ってWebcamを表示

| 0件のコメント

WebcamをStage3Dで使う2回目。
今回はAdobe押しのStarlingを使ってみます。
あっAway3DもAdobe押しだったけ。

Main.as

package {
	import starling.core.Starling;
	import flash.display.Sprite;
 
	[SWF(frameRate="60", width="640", height="480", backgroundColor="#DDDDDD")]
	public class Main extends Sprite {
		private var _starling : Starling;
		public function Main() {
			init();
		}
 
		private function init() : void {
			var starling : Starling = new Starling(Webcam, stage);
			_starling = starling;
			starling.start();
		}
	}
}


Webcam.as

package {
	import starling.display.Image;
	import starling.display.Sprite;
	import starling.events.Event;
	import starling.textures.Texture;
 
	import flash.display.Bitmap;
	import flash.display.BitmapData;
	import flash.display.PixelSnapping;
	import flash.display3D.textures.Texture;
	import flash.geom.Matrix;
	import flash.media.Camera;
	import flash.media.Video;
 
	public class Webcam extends Sprite {
		private var _cam : Camera;
		private var _vid : Video;
		private var _bmd : BitmapData;
		private var _matrix : Matrix = new Matrix(-2, 0, 0, 2, 640, 0);
		private var _image : Image;
 
		public function Webcam() {
			super();
			initCamera();
		}
 
		private function initCamera() : void {
			var camera : Camera = Camera.getCamera();
			_cam = camera;
 
			if(!_cam) {
				throw new Error('you have to need Webcam!');
				return;
			} else {
				setupCamera(camera);
				addEventListener(Event.ENTER_FRAME, onLoop);
			}
		}
 
		private function onLoop(e: Event=null) : void {
			drawVideo();
		}
 
		private function setupCamera(cam: Camera) : void {
			var video : Video = new Video();
			_vid = video;
 
			cam.setMode(320, 240, 30);
 
			video.width = 320;
			video.height = 240;
			video.attachCamera(cam);
 
			var bitmapData : BitmapData = new BitmapData(640, 480, false, 0xff0000);
			_bmd = bitmapData;
			var bitmap : Bitmap = new Bitmap(bitmapData, PixelSnapping.AUTO, true);
			var texture : starling.textures.Texture = starling.textures.Texture.fromBitmap(bitmap);
			var image : Image = new Image(texture);
			_image = image;
 
			addChild(image);
 
			drawVideo();
		}
 
		private function drawVideo() : void {
			_bmd.draw(_vid, _matrix);									flash.display3D.textures.Texture(_image.texture.base).uploadFromBitmapData(_bmd);
		}
	}
}

前回と同じようにWebcam映像はMatrixで鏡像にしています。
毎フレーム度にImage.textureを更新する方法がなかなか分からず少し時間がかかってしまいました。

flash.display3D.textures.Texture().uploadFromBitmapData を使うのは思いつかない。
Google大先生が Starling Forum の Integrate a webcam/video with Starling を教えてくれました。

他に以下の記事を参考にしました。
kamijoさんのStarling でビットマップを表示する方法
野中先生のStarlingフレームワークを使う

ところで、なんでStarlingはClass名をActionScriptのオリジナルと同じ名前にしたんだろう?
ややこしくてしょうがない。
StarlingのClassしか使わないならいいけど、今回のTextureみたいにオリジナルとClass名が被るとコードが長くなって見にくいったらありゃしない。

【制作環境】
FDT 5.5
Flex 4.6
Starling 1.1

コメントを残す