Flashゲームプログラミング講座 for ActionScript3.0

 

Webカメラの映像を表示する

 

サンプルをダウンロード
 


■Flash Player の設定について

 
■カメラへのアクセス許可
 
カメラを使用するには、ユーザーがカメラへのアクセスを許可する必要があります
 
Flash Player の設定画面から、カメラへのアクセスを設定することができます。
 
 
■カメラの種類を選択
 
Flash Player の設定画面から、カメラの種類を選択することができます。
 
 

■Webカメラの映像を表示する

 
1.Video オブジェクトを作成する
 
new 演算子を使って、Video クラスをインスタンス化します。
 
Video クラスについては、こちらで解説しています。
 
ビデオオブジェクトを作成

import flash.media.Video;

// ビデオオブジェクトを作成
var video_obj:Video = new Video(320,240);

// ステージに配置
stage.addChild(video_obj);

// 出力テスト
trace(video_obj);
 
2.Camera オブジェクトを取得する

Camera オブジェクトを取得するには、Camera.getCamera() メソッドを使用します。
 
第01引数を省略した場合、Flash Player の設定画面で選択したカメラデバイスを取得できます。
 
カメラが利用できない場合、null が得られます。
 
Camera.getCamera ( "デバイス名" ) :Camera
第01引数(略可)String取得したいカメラデバイスの名称を指定。または 0 からの番号を指定。(複数のカメラデバイスが存在する場合)
戻り値 CameraCamera オブジェクトが得られる。カメラが利用できない場合 null
 
デフォルトのカメラオブジェクトを取得

import flash.media.Camera;

// デフォルトのカメラオブジェクトを取得
var camera_obj:Camera = Camera.getCamera();

// 出力テスト
trace(camera_obj);
 
複数のカメラオブジェクトを取得

import flash.media.Camera;

// 0 番目のカメラオブジェクトを取得
var camera_obj0:Camera = Camera.getCamera("0");

// 1 番目のカメラオブジェクトを取得
var camera_obj1:Camera = Camera.getCamera("1");

// 出力テスト
trace(camera_obj0);
trace(camera_obj1);
 
3.ビデオとカメラを関連付ける
 
ビデオとカメラを関連付けるには、attachCamera() メソッドを使用します。
 
Video オブジェクトから呼び出し、引数に「Camera オブジェクト」を指定します。
 
ビデオとカメラを関連付ける

import flash.media.Camera;
import flash.media.Video;

// ビデオオブジェクトを作成
var video_obj:Video = new Video(320,240);

// ステージに配置
stage.addChild(video_obj);

// デフォルトのカメラオブジェクトを取得
var camera_obj:Camera = Camera.getCamera();

// カメラが利用可能
if(camera_obj){

	// ビデオとカメラを関連付け
	video_obj.attachCamera(camera_obj);

}
 

■ユーザーがカメラへのアクセスを許可しているか調べる


■カメラへのアクセス許可設定について
 
プログラムからカメラへのアクセスを試みると、以下の様な確認ダイアログが表示されます。
 
ユーザーが、カメラへのアクセスを拒否した場合、カメラ機能を利用することはできません。
 
 
■カメラへのアクセス許可設定を調べる
 
ユーザーが、カメラへのアクセスを許可しているか調べるには、muted プロパティを使用します。
 
true であれば、利用できません。
 
カメラ機能のミュート設定を調べる

import flash.media.Camera;

// デフォルトのカメラオブジェクトを取得
var camera_obj:Camera = Camera.getCamera();

// カメラが利用可能
if(camera_obj){

	trace("カメラ機能のミュート設定:" + camera_obj.muted);

}
 
■「カメラへのアクセス許可設定」の変更を監視する
 
「カメラへのアクセス許可設定」の変更を監視するには、StatusEvent.STATUS イベントを使用します。
 
このイベントは、Adobe AIR では動作しません。
 
引数から得られるオブジェクトの、code プロパティから結果を取得できます。
 
以下の種類があります。
 
文字列 名称
"Camera.Muted" カメラへのアクセスが拒否に変化した
"Camera.Unmuted" カメラへのアクセスが許可に変化した
 
カメラのアクセス許可設定の結果を取得する

import flash.media.Camera;
import flash.media.Video;
import flash.events.StatusEvent;

// ビデオオブジェクトを作成
var video_obj:Video = new Video(320,240);

// ステージに配置
stage.addChild(video_obj);

// デフォルトのカメラオブジェクトを取得
var camera_obj:Camera = Camera.getCamera();

// カメラが利用可能
if(camera_obj){

	// ビデオとカメラを関連付け
	video_obj.attachCamera(camera_obj);

	// カメラへのアクセス許可が変化した時に実行されるイベント
	camera_obj.addEventListener(StatusEvent.STATUS,function (e:StatusEvent):void{
		switch(e.code){
		case "Camera.Unmuted":
			trace("カメラ利用可能");
			break;
		case "Camera.Muted":
			trace("カメラ利用不可能");
			break;
		}
	});
}
 

■カメラデバイスの総数を取得する

 
カメラデバイスの総数を調べるには、Camera.names.length プロパティを使用します。
 
カメラデバイスの総数を取得

import flash.media.Camera;

// カメラデバイスの総数を取得
var num:int = Camera.names.length;

// 出力テスト
trace(num);
 

■カメラデバイスの名称を取得する

 
■カメラデバイスの名称をまとめて取得する
 
カメラデバイスの名称を、配列としてまとめて取得するには、Camera.names プロパティを使用します。
 
カメラデバイスの名称を順番に列挙する

import flash.media.Camera;

// カメラデバイスの名称をまとめて取得する
var camera_names:Array = Camera.names;

var i:int;
var num:int = camera_names.length;
for(i=0;i < num;i++){
	// デバイス名を出力
	trace("id:" + i + " name:" + camera_names[i]);
}
 
■カメラオブジェクトからデバイスの名称を取得する
 
カメラオブジェクトから、デバイスの名称を取得するには、name プロパティを使用します。
 
カメラデバイスの名称を順番に列挙する

import flash.media.Camera;

var i:int;
var num:int = Camera.names.length;
for(i=0;i < num;i++){

	// カメラオブジェクトを取得
	var camera_obj:Camera = Camera.getCamera(String(i));

	// デバイス名を出力
	trace("id:" + i + " name:" + camera_obj.name);
}
 
 


■カメラ機能が利用可能か調べる


実行環境でカメラ機能をサポートしているかを調べるには、Camera.isSupported プロパティを使用します。
 
この確認用のプロパティは、Flash Player 10.1 以降、Adobe AIR 2.0 以降で利用可能です。
 
モバイルなどの環境で動作させる場合、カメラ機能をサポートしていない事があります。
 
実行環境ごとのサポート状況については、公式リファレンスが参考になります。
 
http://help.adobe.com/ja_JP/FlashPlatform/reference/actionscript/3/flash/media/Camera.html
 
カメラ機能が利用可能か調べる

import flash.media.Camera;
import flash.text.TextField;

// テキストフィールドを作成
var text_field:TextField = new TextField();
text_field.x = 10;
text_field.y = 10;
text_field.width = stage.stageWidth - 20;
text_field.height = 20;
text_field.border = true;
stage.addChild(text_field);

text_field.text = "カメラ機能が利用可能:" + Camera.isSupported;
 

■「AIR for Android」でカメラ機能を使用する


「AIR for Android」でカメラ機能を使用するには、以下のパーミッション設定を追加します。
 
権限名説明
CAMERAカメラデバイスにアクセスする
 
■Adobe Flash による設定方法
 
「AIR for Android 設定」の「権限」タブにある、「CAMERA」のチェックを有効にします。
 
 
■アプリケーション記述ファイルを直接編集する方法
 
アプリケーション記述ファイルに、以下のパーミッション設定を追加します。
 
アプリケーション記述ファイルに autoOrients タグを追加する

<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<application xmlns="http://ns.adobe.com/air/application/2.0">

  ~略~

  <android>
    <manifestAdditions>
      <![CDATA[<manifest>
<uses-permission android:name="android.permission.CAMERA"/>
      </manifest>]]>
    </manifestAdditions>
  </android>

</application>
 


 

キャプチャモードを設定する

 


■キャプチャモードを設定する


カメラデバイスから入力される、映像ソースの解像度と、フレームレートを設定する事ができます。
 
解像度が大きいほど、負荷が高くなり、フレームレートが低下する可能性があります。
 

■解像度とフレームレートを設定する

 
映像ソースの解像度とフレームレートを設定するには、setMode() メソッドを使用します。
 
デバイスが、指定した値に対応していない場合、対応している最も近い値が採用されます。
 
見た目の幅と高さを変更したい場合は、Video オブジェクトを操作します。
 
Camera.setMode ( 幅 , 高さ , フレームレート , 解像度を優先するか ) :void
第01引数 intカメラの入力解像度の幅
第02引数 intカメラの入力解像度の高さ
第03引数 Numberカメラの入力フレームレート
第04引数(略可)Boolean解像度を優先して処理するなら true、フレームレートを優先して処理するなら false(デフォルトは true)
戻り値 voidなし
 
解像度とフレームレートを設定する

import flash.media.Camera;

// デフォルトのカメラオブジェクトを取得
var camera_obj:Camera = Camera.getCamera();

// カメラが利用可能
if(camera_obj){
	// キャプチャ用パラメータ
	var camera_width:int = 400;
	var camera_height:int = 300;
	var camera_fps:Number = 30;

	// 解像度とフレームレートを設定する
	camera_obj.setMode(camera_width,camera_height,camera_fps);
}
 

■実際に設定された解像度とフレームレートを取得する

 
実際に設定された解像度を調べるには、widthheight プロパティを使用します。
 
実際に設定されたフレームレートを調べるには、fps プロパティを使用します。
 
これらのプロパティは、読み取り専用です。
 
実際に設定されたキャプチャモードの設定を取得する

import flash.media.Camera;

// デフォルトのカメラオブジェクトを取得
var camera_obj:Camera = Camera.getCamera();

// カメラが利用可能
if(camera_obj){
	// キャプチャ用パラメータ
	var camera_width:int = 400;
	var camera_height:int = 300;
	var camera_fps:Number = 30;

	// 解像度とフレームレートを設定する
	camera_obj.setMode(camera_width,camera_height,camera_fps);

	// 出力テスト
	trace("幅:" + camera_obj.width);
	trace("高さ:" + camera_obj.height);
	trace("フレームレート:" + camera_obj.fps);
}
 

■実測のフレームレートを取得する

 
実測のフレームレートを調べるには、currentFPS プロパティを使用します。
 
このプロパティは、読み取り専用です。
 
実測のフレームレートを取得する

import flash.media.Camera;
import flash.media.Video;
import flash.events.Event;

// ビデオオブジェクトを作成
var video_obj:Video = new Video(320,240);

// ステージに配置
stage.addChild(video_obj);

// デフォルトのカメラオブジェクトを取得
var camera_obj:Camera = Camera.getCamera();

// カメラが利用可能
if(camera_obj){
	// キャプチャ用パラメータ
	var camera_width:int = 400;
	var camera_height:int = 300;
	var camera_fps:Number = 30;

	// 解像度とフレームレートを設定する
	camera_obj.setMode(camera_width,camera_height,camera_fps);

	// ビデオとカメラを関連付け
	video_obj.attachCamera(camera_obj);

	// 毎フレーム実行されるイベント
	stage.addEventListener(Event.ENTER_FRAME,function (e:Event):void{
		trace("実測フレームレート:" + camera_obj.currentFPS);
	});
}
 


 

モーションを検出する

 
 


■アクティビティとは?

 
アクティビティとは、活動を意味します。
 
映像の変化の大きさから、動画状態、静止画状態であるかを検出します。
 

■モーションの有無の切り替わりを検出する

 
モーションの有無の切り替わりを検出するには、ActivityEvent.ACTIVITY イベントを使用します。
 
イベントに登録した関数の引数から得られる、ActivityEvent オブジェクトの activating プロパティから、Boolean 値が得られます。
 
true … 動画状態
 
false … 静止画状態
 
モーションの有無の切り替わりを検出する

import flash.media.Camera;
import flash.media.Video;
import flash.events.ActivityEvent;

// ビデオオブジェクトを作成
var video_obj:Video = new Video(320,240);

// ステージに配置
stage.addChild(video_obj);

// デフォルトのカメラオブジェクトを取得
var camera_obj:Camera = Camera.getCamera();

// カメラが利用可能
if(camera_obj){
	// ビデオとカメラを関連付け
	video_obj.attachCamera(camera_obj);

	// モーションの有無が切り替わると呼び出されるイベント
	camera_obj.addEventListener(ActivityEvent.ACTIVITY,function (e:ActivityEvent):void{
		if(e.activating){
			trace("動画状態");
		}else{
			trace("静止画状態");
		}
	});
}
 

■モーション検出のしきい値を設定する

 
モーション検出のしきい値を設定するには、setMotionLevel() メソッドを使用します。
 
Camera.setMotionLevel ( しきい値 , タイムアウト ) :void
第01引数 int0 ~ 100 までのしきい値を指定。0 に近いほど少しの変化でもモーションとして検出する。(デフォルトは 50)
第02引数(略可)int静止画状態と判定するまでのタイムアウト時間を指定(単位:ミリ秒)(デフォルトは 2000)
戻り値 voidなし
 
モーション検出のしきい値を設定する

import flash.media.Camera;
import flash.media.Video;
import flash.events.ActivityEvent;

// ビデオオブジェクトを作成
var video_obj:Video = new Video(320,240);

// ステージに配置
stage.addChild(video_obj);

// デフォルトのカメラオブジェクトを取得
var camera_obj:Camera = Camera.getCamera();

// カメラが利用可能
if(camera_obj){
	// ビデオとカメラを関連付け
	video_obj.attachCamera(camera_obj);

	// モーション検出のしきい値を設定
	camera_obj.setMotionLevel(10,0);

	// モーションの有無が切り替わると呼び出されるイベント
	camera_obj.addEventListener(ActivityEvent.ACTIVITY,function (e:ActivityEvent):void{
		if(e.activating){
			trace("動画状態");
		}else{
			trace("静止画状態");
		}
	});
}
 

■モーション検出のしきい値を取得する

 
モーション検出のしきい値を取得するには、motionLevel プロパティを使用します。
 
静止画状態と判定するまでの時間(単位:ミリ秒)を取得するには、motionTimeout プロパティを使用します。
 
これらのプロパティは、読み取り専用です。
 
モーション検出のしきい値を取得する

import flash.media.Camera;
import flash.media.Video;
import flash.events.ActivityEvent;

// ビデオオブジェクトを作成
var video_obj:Video = new Video(320,240);

// ステージに配置
stage.addChild(video_obj);

// デフォルトのカメラオブジェクトを取得
var camera_obj:Camera = Camera.getCamera();

// カメラが利用可能
if(camera_obj){
	// ビデオとカメラを関連付け
	video_obj.attachCamera(camera_obj);

	// モーション検出のしきい値を設定
	camera_obj.setMotionLevel(10,0);

	// モーション検出のしきい値を取得する
	trace(camera_obj.motionLevel);

	// 静止画状態と判定するまでの時間を取得
	trace(camera_obj.motionTimeout);
}
 

■モーションの実測値を取得する

 
モーションの実測値を取得するには、activityLevel プロパティを使用します。
 
このプロパティを利用するには、ActivityEvent.ACTIVITY イベントに関数を登録しておく必要があります。
 
0 から 100 までの値が得られます。
 
100 に近いほど大きく変化している事がわかります。
 
-1 が得られる場合、カメラデバイスの準備ができていません。
 
アクティビティレベルを取得する

import flash.media.Camera;
import flash.media.Video;
import flash.events.Event;
import flash.events.ActivityEvent;

// ビデオオブジェクトを作成
var video_obj:Video = new Video(320,240);

// ステージに配置
stage.addChild(video_obj);

// デフォルトのカメラオブジェクトを取得
var camera_obj:Camera = Camera.getCamera();

// カメラが利用可能
if(camera_obj){
	// ビデオとカメラを関連付け
	video_obj.attachCamera(camera_obj);

	// モーション検出のしきい値を設定
	camera_obj.setMotionLevel(10,0);

	// モーションの有無が切り替わると呼び出されるイベント
	camera_obj.addEventListener(ActivityEvent.ACTIVITY,function (e:ActivityEvent):void{
		trace("アクティビティ:" + e.activating);
	});

	// 毎フレーム実行されるイベント
	stage.addEventListener(Event.ENTER_FRAME,function (e:Event):void{
		trace("アクティビティレベル:" + camera_obj.activityLevel);
	});
}