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

 

StageVideo クラスについて

 


■StageVideo クラスについて

 
StageVideo クラスは、Flash Player 10.2 以降、AIR 2.5 以降で利用可能です。
 
StageVideo クラスを使用すると、外部にある動画ファイルを読み込んで再生したり、Webカメラの映像を表示することができます。
 
■ハードウェアアクセラレータについて
 
実行環境が、ハードウェアアクセラレータに対応している場合、ハードウェアデコード機能を使って動画を再生する事ができます。
 
実行環境が対応していない場合は、ソフトウェアでデコードされます。
 
最終的なレンダリングは、必ずハードウェアを使って描画されます。
 
■ StageVideo クラスの派生について

Video クラスは、以下の様に派生しています。
 
ここで解説してない分は、リンク先に解説がありますので合わせてご覧下さい。
 
DisplayObject クラスを継承していないので、スプライトのように制御する事はできません
 
Object
↓派生
EventDispatcher
↓派生
StageVideo
 
■ Video クラスとの関係
 
Video クラスについては、こちらで解説しています。
 
StageVideo クラスの方が、より GPU を駆使して、動画を再生することができます。
 
StageVideo クラスは、実行中に描画できなくなる可能性があります
 
動作を継続する場合、Video クラスに切り替える必要があります。
 
 


■ステージビデオ機能が利用可能か調べる


ステージビデオは、必ずしも継続して利用し続けれるとは限りません
 
利用可能だったり、利用不可能な状態に変化する事があります。
 
ステージビデオの可用性を調べるには、StageVideoAvailabilityEvent.STAGE_VIDEO_AVAILABILITY イベントを使用します。
 
引数から得られる StageVideoAvailabilityEvent オブジェクトの availability プロパティから、StageVideoAvailability 定数を取得することができます。
 
定数文字列説明
StageVideoAvailability.AVAILABLE"available"ステージビデオは使用可能な状態です。
StageVideoAvailability.UNAVAILABLE"unavailable"ステージビデオは使用不可能な状態です。
 
ステージビデオの可用性を調べる

import flash.text.TextField;
import flash.events.StageVideoAvailabilityEvent;
import flash.media.StageVideoAvailability;

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


// ------------------------------------------------------------
// ステージビデオ
// ------------------------------------------------------------
// StageVideo の可用性に変化があると呼び出されるイベント
stage.addEventListener(StageVideoAvailabilityEvent.STAGE_VIDEO_AVAILABILITY,function (e:StageVideoAvailabilityEvent):void{

	switch(e.availability){
	case StageVideoAvailability.AVAILABLE:
		text_field.text = "ステージビデオは使用可能な状態である\n" + text_field.text;
		break;
	case StageVideoAvailability.UNAVAILABLE:
		text_field.text = "ステージビデオは使用不可能な状態である\n" + text_field.text;
		break;
	}
});
 


 

ステージビデオを表示する

 


■StageVideo オブジェクトを取得する


StageVideo オブジェクトを取得するには、stage.stageVideos プロパティを使用します。
 
このプロパティは、Vector.<StageVideo> 型です。
 
■StageVideo オブジェクトの取得が可能になるまで監視する
 
初期状態では、StageVideo オブジェクトを取得することはできません
 
StageVideoAvailabilityEvent.STAGE_VIDEO_AVAILABILITY イベントを使って、StageVideoAvailability.AVAILABLE 定数が得られるまで待つ必要があります。
 
StageVideo オブジェクトを取得する

import flash.text.TextField;
import flash.media.StageVideo;
import flash.events.StageVideoAvailabilityEvent;
import flash.media.StageVideoAvailability;

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


// ------------------------------------------------------------
// ステージビデオ
// ------------------------------------------------------------
// StageVideo の可用性に変化があると呼び出されるイベント
stage.addEventListener(StageVideoAvailabilityEvent.STAGE_VIDEO_AVAILABILITY,function (e:StageVideoAvailabilityEvent):void{

	// ステージビデオの取得が可能
	if(e.availability == StageVideoAvailability.AVAILABLE){

		// StageVideo オブジェクトを配列で取得
		var stage_videos:Vector.<StageVideo> = stage.stageVideos;
		var i:Number;
		var num:Number = stage_videos.length;
		for(i=0;i < num;i++){
			var stage_video:StageVideo = stage_videos[i];

			// 出力テスト
			trace(stage_video);
		}

		text_field.text = "ステージビデオの個数:" + num + "\n" + text_field.text;
	}

	text_field.text = "ステージビデオのアベイラビリティ:" + e.availability + "\n" + text_field.text;

});
 
■得られる StageVideo オブジェクトの数について
 
最大で4つの StageVideo オブジェクトを取得することができます。
 
実行環境によっては、1つの場合や、0の場合もあります
 
実行環境ごとのサポート状況については、公式リファレンスが参考になります。
 
http://help.adobe.com/ja_JP/FlashPlatform/reference/actionscript/3/flash/media/StageVideo.html
 

■StageVideo オブジェクトをステージに表示する


StageVideo オブジェクトは、表示オブジェクトではありません。
 
よって、表示リストに登録することはできません。
 
StageVideo オブジェクトは、「描画範囲」を設定することで、画面に表示することができます。
 
描画矩形範囲を設定するには、viewPort プロパティを使用します。
 
矩形を Rectangle 型で指定します。
 
動画は、矩形内に丁度収まるように伸縮されます。
 
StageVideo オブジェクトをステージに表示する

import flash.media.StageVideo;
import flash.geom.Rectangle;
import flash.events.StageVideoAvailabilityEvent;
import flash.media.StageVideoAvailability;

// StageVideo の可用性に変化があると呼び出されるイベント
stage.addEventListener(StageVideoAvailabilityEvent.STAGE_VIDEO_AVAILABILITY,function (e:StageVideoAvailabilityEvent):void{

	var stage_video:StageVideo;

	// ステージビデオの取得が可能
	if(e.availability == StageVideoAvailability.AVAILABLE){
		// 0 番目の StageVideo オブジェクトを取得
		var stage_videos:Vector.<StageVideo> = stage.stageVideos;
		if(stage_videos.length){
			stage_video = stage_videos[0];
		}
	}

	// ステージビデオが利用可能
	if(stage_video){
		// 矩形
		var view_rect:Rectangle = new Rectangle();
		view_rect.x = 5;
		view_rect.y = 5;
		view_rect.width  = stage.stageWidth - 10;
		view_rect.height = stage.stageHeight - 10;

		// 描画する矩形範囲を指定
		stage_video.viewPort = view_rect;
	}

});
 

■ StageVideo の表示優先度について


StageVideo オブジェクトは、ステージのすべての表示オブジェクトよりも、奥に描画されます
 
ブレンドの背景としては、動作しません。
 
■ StageVideo オブジェクト同士の重なりについて
 
StageVideo オブジェクト同士が重なっている場合、配列の最後尾にあるほど手前に描画されます。
 
深度を指定して、表示優先度を変更する場合は、depthプロパティを使用します。
 
値が大きいほど、手前に描画されます。
 

■利用可能なカラースペース(色空間)の名称をまとめて取得する

 
利用可能なカラースペース(色空間)の名称をまとめて取得するには、colorSpaces プロパティを使用します。
 
このプロパティは、Vector.<String> 型です。
 
実行環境ごとのサポート状況については、公式リファレンスが参考になります。
 
http://help.adobe.com/ja_JP/FlashPlatform/reference/actionscript/3/flash/media/StageVideo.html
 
利用可能なカラースペース(色空間)の名称をまとめて取得する

import flash.text.TextField;
import flash.media.StageVideo;
import flash.events.StageVideoAvailabilityEvent;
import flash.media.StageVideoAvailability;

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


// ------------------------------------------------------------
// レンダリング状況を監視
// ------------------------------------------------------------
// StageVideo の可用性に変化があると呼び出されるイベント
stage.addEventListener(StageVideoAvailabilityEvent.STAGE_VIDEO_AVAILABILITY,function (e:StageVideoAvailabilityEvent):void{

	// StageVideo オブジェクトを配列で取得
	var stage_videos:Vector.<StageVideo> = stage.stageVideos;
	var i:Number;
	var num:Number = stage_videos.length;
	for(i=0;i < num;i++){
		// StageVideo オブジェクトを取得
		var stage_video:StageVideo = stage_videos[i];

		var str:String = "・StaegVideo (id:" + i + ") の利用可能なカラースペース(色空間)\n";

		// 利用可能なカラースペース(色空間)の名称を取得
		var color_spaces:Vector.<String> = stage_video.colorSpaces;
		for(var key:String in color_spaces){
			str += "\t" + color_spaces[key] + "\n";
		}

		text_field.text = str + "\n" + text_field.text;
	}
});
 

■Video と StageVideo を切り替えて使用する

 
StageVideo オブジェクトは、利用不可能な状態に変化する事があります
 
StageVideo オブジェクトが利用できない場合、Video オブジェクトを使って動作させる必要があります。
 
Video と StageVideo を切り替えて使用した場合の、レンダリング状況を確認する例です。
 
Video と StageVideo を切り替えて使用した場合の、レンダリング状況を確認する

import flash.text.TextField;
import flash.media.Video;
import flash.media.StageVideo;
import flash.net.NetConnection;
import flash.net.NetStream;
import flash.geom.Rectangle;
import flash.utils.Dictionary;
import flash.events.StageVideoAvailabilityEvent;
import flash.events.VideoEvent;
import flash.events.StageVideoEvent;
import flash.events.MouseEvent;
import flash.media.StageVideoAvailability;
import flash.media.VideoStatus;
import flash.display.StageDisplayState;

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

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

// ビデオのサイズ
video_obj.x = 10;
video_obj.y = 10;
video_obj.width  = stage.stageWidth  - 20;
video_obj.height = 100;


// ------------------------------------------------------------
// ステージビデオ
// ------------------------------------------------------------
// StageVideo の可用性に変化があると呼び出されるイベント
stage.addEventListener(StageVideoAvailabilityEvent.STAGE_VIDEO_AVAILABILITY,function (e:StageVideoAvailabilityEvent):void{

	var stage_video:StageVideo;

	// ステージビデオの取得が可能
	if(e.availability == StageVideoAvailability.AVAILABLE){
		// 0 番目の StageVideo オブジェクトを取得
		var stage_videos:Vector.<StageVideo> = stage.stageVideos;
		if(stage_videos.length){
			stage_video = stage_videos[0];
		}
	}

	// ------------------------------------------------------------
	// ステージビデオが利用可能
	// ------------------------------------------------------------
	if(stage_video){

		// 描画する句形範囲を指定
		var view_rect:Rectangle = new Rectangle(video_obj.x,video_obj.y,video_obj.width,video_obj.height);
		stage_video.viewPort = view_rect;

		// ステージビデオとネットストリームを関連付け
		stage_video.attachNetStream(net_stream);

		// Video オブジェクトを非表示
		video_obj.visible = false;
		video_obj.clear();

	// ------------------------------------------------------------
	// ステージビデオの利用が不可能
	// ------------------------------------------------------------
	}else{
		// ビデオとネットストリームを関連付け
		video_obj.attachNetStream(net_stream);

		// Video オブジェクトを可視表示
		video_obj.visible = true;
	}

});


// ------------------------------------------------------------
// ネットストリーム
// ------------------------------------------------------------
// ネットコネクションオブジェクトを作成
var net_connection:NetConnection = new NetConnection();
net_connection.connect( null );

// ネットストリームオブジェクトを作成
var net_stream:NetStream = new NetStream (net_connection);

// ビデオとネットストリームを関連付け
video_obj.attachNetStream(net_stream);


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


// ------------------------------------------------------------
// レンダリング状況を監視
// ------------------------------------------------------------
// StageVideo の可用性に変化があると呼び出されるイベント
stage.addEventListener(StageVideoAvailabilityEvent.STAGE_VIDEO_AVAILABILITY,function (e:StageVideoAvailabilityEvent):void{

	switch(e.availability){
	case StageVideoAvailability.AVAILABLE:
		text_field.text = "・ステージビデオは使用可能な状態である\n\n" + text_field.text;
		break;
	case StageVideoAvailability.UNAVAILABLE:
		text_field.text = "・ステージビデオは使用不可能な状態である\n\n" + text_field.text;
		break;
	}
});

// Video のレンダリング状況に変化があると呼び出されるイベント
video_obj.addEventListener(VideoEvent.RENDER_STATE,function (e:VideoEvent):void{
	var str:String = "・Video のレンダリング状況\n";
	switch(e.status){
	case VideoStatus.ACCELERATED:
		str += "\tハードウェアデコード機能を使用して動作している\n";
		break;
	case VideoStatus.SOFTWARE:
		str += "\tソフトウェアデコード機能を使用して動作している\n";
		break;
	}
	text_field.text = str + "\n" + text_field.text;
});

// ステージビデオ用辞書
var stage_video_dictonary:Dictionary = new Dictionary();

// StageVideo の可用性に変化があると呼び出されるイベント
stage.addEventListener(StageVideoAvailabilityEvent.STAGE_VIDEO_AVAILABILITY,function (e:StageVideoAvailabilityEvent):void{

	// StageVideo オブジェクトを配列で取得
	var stage_videos:Vector.<StageVideo> = stage.stageVideos;
	var i:Number;
	var num:Number = stage_videos.length;
	for(i=0;i < num;i++){
		// StageVideo オブジェクトを取得
		var stage_video:StageVideo = stage_videos[i];

		// 初回アクセスかチェック
		if(!stage_video_dictonary[stage_video]){

			// 辞書にパラメータをセット
			var param:Object = {index:i};
			stage_video_dictonary[stage_video] = param;

			// StageVideo のレンダリング状況に変化があると呼び出されるイベント
			stage_video.addEventListener(StageVideoEvent.RENDER_STATE,function (e:StageVideoEvent):void{

				var stage_video:StageVideo = e.currentTarget as StageVideo;
				var param:Object = stage_video_dictonary[stage_video];

				var str:String = "・StaegVideo (id:" + param.index + ") のレンダリング状況\n";

				switch(e.status){
				case VideoStatus.ACCELERATED:
					str += "\tハードウェアデコード機能を使用して動作している\n";
					break;
				case VideoStatus.SOFTWARE:
					str += "\tソフトウェアデコード機能を使用して動作している\n";
					break;
				case VideoStatus.UNAVAILABLE:
					str += "\t使用不可能である\n";
					break;
				}

				str += "\tカラースペース(色空間):" + e.colorSpace + "\n";

				text_field.text = str + "\n" + text_field.text;
			});

			// サポートチェック
			var str:String = "・StaegVideo (id:" + i + ") の利用可能なカラースペース(色空間)\n";
			var color_spaces:Vector.<String> = stage_video.colorSpaces;
			for(var key:String in color_spaces){
				str += "\t" + color_spaces[key] + "\n";
			}
			text_field.text = str + "\n" + text_field.text;
		}
	}
});


// ------------------------------------------------------------
// マウスの左ボタンをクリックすると実行されるイベント
// ------------------------------------------------------------
stage.addEventListener(MouseEvent.CLICK, function (e:MouseEvent):void{
	// フルスクリーンに変更
	stage.displayState = StageDisplayState.FULL_SCREEN;
});


// ------------------------------------------------------------
// URL を指定して、ストリーム再生を開始する
// ------------------------------------------------------------
net_stream.play ("http://hakuhin.jp/test.mp4");
 


 

動画ファイルを再生する

 


■動画ファイルを再生する


外部にある動画ファイルを読み込んで、再生する事ができます。
 
動画ファイルの再生制御は、StageVideo クラスではなく、NetStream クラスで行います。
 
ステージビデオと、NetStream オブジェクトを関連付けるには、attachNetStream() メソッドを使用します。
 
ステージビデオが利用不可能な状態に変化した場合、ネットストリームとの関連付けは解除されます
 
詳しい使用方法は、こちらで解説しています。
 
外部にある動画ファイルを読み込んで、再生する

import flash.media.Video;
import flash.media.StageVideo;
import flash.net.NetConnection;
import flash.net.NetStream;
import flash.geom.Rectangle;
import flash.events.StageVideoAvailabilityEvent;
import flash.media.StageVideoAvailability;

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

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

// ビデオのサイズ
video_obj.x = 10;
video_obj.y = 10;
video_obj.width  = stage.stageWidth  - 20;
video_obj.height = stage.stageHeight - 20;


// ------------------------------------------------------------
// ステージビデオ
// ------------------------------------------------------------
// StageVideo の可用性に変化があると呼び出されるイベント
stage.addEventListener(StageVideoAvailabilityEvent.STAGE_VIDEO_AVAILABILITY,function (e:StageVideoAvailabilityEvent):void{

	var stage_video:StageVideo;

	// ステージビデオの取得が可能
	if(e.availability == StageVideoAvailability.AVAILABLE){
		// 0 番目の StageVideo オブジェクトを取得
		var stage_videos:Vector.<StageVideo> = stage.stageVideos;
		if(stage_videos.length){
			stage_video = stage_videos[0];
		}
	}

	// ------------------------------------------------------------
	// ステージビデオが利用可能
	// ------------------------------------------------------------
	if(stage_video){

		// 描画する句形範囲を指定
		var view_rect:Rectangle = new Rectangle(video_obj.x,video_obj.y,video_obj.width,video_obj.height);
		stage_video.viewPort = view_rect;

		// ステージビデオとネットストリームを関連付け
		stage_video.attachNetStream(net_stream);

		// Video オブジェクトを非表示
		video_obj.visible = false;
		video_obj.clear();


	// ------------------------------------------------------------
	// ステージビデオの利用が不可能
	// ------------------------------------------------------------
	}else{
		// ビデオとネットストリームを関連付け
		video_obj.attachNetStream(net_stream);

		// Video オブジェクトを可視表示
		video_obj.visible = true;
	}

});


// ------------------------------------------------------------
// ネットストリーム
// ------------------------------------------------------------
// ネットコネクションオブジェクトを作成
var net_connection:NetConnection = new NetConnection();
net_connection.connect( null );

// ネットストリームオブジェクトを作成
var net_stream:NetStream = new NetStream (net_connection);

// ビデオとネットストリームを関連付け
video_obj.attachNetStream(net_stream);

// URL を指定して、ストリーム再生を開始する
net_stream.play ("http://hakuhin.jp/test.mp4");
 


 

Webカメラの映像を表示する(Flash 11.4 以降)

 


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

 
Webカメラの映像を、ステージビデオオブジェクトに表示することができます。
 
ステージビデオと、カメラを関連付けるには、attachCamera() メソッドを使用します。
 
このプロパティは、Flash Player 11.4 以降、AIR 3.4 以降で利用可能です。
 
ステージビデオが利用不可能な状態に変化した場合、カメラとの関連付けは解除されます
 
詳しい使用方法は、こちらで解説しています。
 
Webカメラの映像を表示する

import flash.media.Video;
import flash.media.StageVideo;
import flash.media.Camera;
import flash.geom.Rectangle;
import flash.events.StageVideoAvailabilityEvent;
import flash.media.StageVideoAvailability;

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

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

// ビデオのサイズ
video_obj.x = 10;
video_obj.y = 10;
video_obj.width  = stage.stageWidth  - 20;
video_obj.height = stage.stageHeight - 20;


// ------------------------------------------------------------
// ステージビデオ
// ------------------------------------------------------------
// StageVideo の可用性に変化があると呼び出されるイベント
stage.addEventListener(StageVideoAvailabilityEvent.STAGE_VIDEO_AVAILABILITY,function (e:StageVideoAvailabilityEvent):void{

	var stage_video:StageVideo;

	// ステージビデオの取得が可能
	if(e.availability == StageVideoAvailability.AVAILABLE){
		// 0 番目の StageVideo オブジェクトを取得
		var stage_videos:Vector.<StageVideo> = stage.stageVideos;
		if(stage_videos.length){
			stage_video = stage_videos[0];
		}
	}

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

		// ------------------------------------------------------------
		// ステージビデオが利用可能
		// ------------------------------------------------------------
		if(stage_video){

			// 描画する句形範囲を指定
			var view_rect:Rectangle = new Rectangle(video_obj.x,video_obj.y,video_obj.width,video_obj.height);
			stage_video.viewPort = view_rect;

			// ステージビデオとカメラを関連付け
			stage_video.attachCamera(camera_obj);

			// Video オブジェクトを非表示
			video_obj.visible = false;
			video_obj.clear();


		// ------------------------------------------------------------
		// ステージビデオの利用が不可能
		// ------------------------------------------------------------
		}else{
			// ビデオとカメラを関連付け
			video_obj.attachCamera(camera_obj);

			// Video オブジェクトを可視表示
			video_obj.visible = true;
		}
	}
});


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

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

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

}
 


 

映像ソースの解像度を取得する

 


■映像ソースの解像度を取得する

 
映像ソースの解像度を取得するには、以下のプロパティを使用します。
 
videoWidth プロパティで 水平方向の大きさをピクセル単位で取得します。
 
videoHeight プロパティで 垂直方向の大きさをピクセル単位で取得します。
 
これらのプロパティは、読み取り専用です。
 
■動画ファイルの解像度を取得する場合
 
StageVideo オブジェクトのレンダリングが開始されるまでは、解像度の取得を試みても失敗します。
 
StageVideoEvent.RENDER_STATE イベント内で取得する事ができます。
 
動画ファイルの解像度を取得する

import flash.text.TextField;
import flash.media.StageVideo;
import flash.net.NetConnection;
import flash.net.NetStream;
import flash.geom.Rectangle;
import flash.utils.Dictionary;
import flash.events.StageVideoAvailabilityEvent;
import flash.events.StageVideoEvent;
import flash.media.StageVideoAvailability;


// ------------------------------------------------------------
// テキストフィールド
// ------------------------------------------------------------
// テキストフィールドを作成
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);


// ------------------------------------------------------------
// ステージビデオ
// ------------------------------------------------------------
// ステージビデオ用辞書
var stage_video_dictonary:Dictionary = new Dictionary();

// StageVideo の可用性に変化があると呼び出されるイベント
stage.addEventListener(StageVideoAvailabilityEvent.STAGE_VIDEO_AVAILABILITY,function (e:StageVideoAvailabilityEvent):void{

	var stage_video:StageVideo;

	// ステージビデオの取得が可能
	if(e.availability == StageVideoAvailability.AVAILABLE){
		// 0 番目の StageVideo オブジェクトを取得
		var stage_videos:Vector.<StageVideo> = stage.stageVideos;
		if(stage_videos.length){
			stage_video = stage_videos[0];
		}
	}

	// ------------------------------------------------------------
	// ステージビデオが利用可能
	// ------------------------------------------------------------
	if(stage_video){

		// 初回アクセスかチェック
		if(!stage_video_dictonary[stage_video]){

			// 辞書にパラメータをセット
			var param:Object = {};
			stage_video_dictonary[stage_video] = param;

			// ------------------------------------------------------------
			// StageVideo のレンダリング状況に変化があると呼び出されるイベント
			// ------------------------------------------------------------
			stage_video.addEventListener(StageVideoEvent.RENDER_STATE,function (e:StageVideoEvent):void{

				var stage_video:StageVideo = e.currentTarget as StageVideo;
				var param:Object = stage_video_dictonary[stage_video];

				// 解像度を取得
				var video_width:int  = stage_video.videoWidth;
				var video_height:int = stage_video.videoHeight;

				// 描画する句形範囲を指定
				var view_rect:Rectangle = new Rectangle(10,30,video_width,video_height);
				stage_video.viewPort = view_rect;

				// 出力テスト
				text_field.text = "w:" + video_width + " h:" + video_height;
			});
		}

		// ステージビデオとネットストリームを関連付け
		stage_video.attachNetStream(net_stream);
	}

});


// ------------------------------------------------------------
// ネットストリーム
// ------------------------------------------------------------
// ネットコネクションオブジェクトを作成
var net_connection:NetConnection = new NetConnection();
net_connection.connect( null );

// ネットストリームオブジェクトを作成
var net_stream:NetStream = new NetStream (net_connection);

// URL を指定して、ストリーム再生を開始する
net_stream.play ("http://hakuhin.jp/test.mp4");
 
■Webカメラの解像度を取得する場合
 
Webカメラの解像度を取得する場合、Camera オブジェクト側のプロパティを使用します。
 
StageVideo オブジェクトからアクセスすると、取得に失敗したり、変更前の古い結果が得られる事があります。
 
Webカメラの解像度を取得する

import flash.text.TextField;
import flash.media.StageVideo;
import flash.media.Camera;
import flash.geom.Rectangle;
import flash.events.StageVideoAvailabilityEvent;
import flash.media.StageVideoAvailability;


// ------------------------------------------------------------
// テキストフィールド
// ------------------------------------------------------------
// テキストフィールドを作成
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);


// ------------------------------------------------------------
// ステージビデオ
// ------------------------------------------------------------
// StageVideo の可用性に変化があると呼び出されるイベント
stage.addEventListener(StageVideoAvailabilityEvent.STAGE_VIDEO_AVAILABILITY,function (e:StageVideoAvailabilityEvent):void{

	var stage_video:StageVideo;

	// ステージビデオの取得が可能
	if(e.availability == StageVideoAvailability.AVAILABLE){
		// 0 番目の StageVideo オブジェクトを取得
		var stage_videos:Vector.<StageVideo> = stage.stageVideos;
		if(stage_videos.length){
			stage_video = stage_videos[0];
		}
	}

	// ステージビデオが利用可能
	if(stage_video){

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

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

			// ステージビデオとカメラを関連付け
			stage_video.attachCamera(camera_obj);

			// Camera クラスから解像度を取得
			var camera_width:int  = camera_obj.width;
			var camera_height:int = camera_obj.height;

			// 描画する句形範囲を指定
			var view_rect:Rectangle = new Rectangle(10,30,camera_width,camera_height);
			stage_video.viewPort = view_rect;

			// 出力テスト
			text_field.text = "w:" + camera_width + " h:" + camera_height;
		}
	}
});
 


 

レンダリング状況を調べる

 


■レンダリング状況を調べる

 
レンダリング状況を調べるには、StageVideoEvent.RENDER_STATE イベントを使用します。
 
登録した関数の引数から、StageVideoEvent オブジェクトが得られます。
 
ステージビデオが、カメラやネットストリームと関連付けられている必要があります。
 
■ステータスについて
 
ステータスを取得するには、status プロパティを使用します。
 
以下のような、VideoStatus 定数が得られます。
 
VideoStatus.UNAVAILABLE が得られた場合、カメラやネットストリームとの関連付けは解除されます。
 
定数文字列説明
VideoStatus.ACCELERATED"accelerated"ハードウェアデコード機能を使用して動作しています。
VideoStatus.SOFTWARE"software"ソフトウェアデコード機能を使用して動作しています。
VideoStatus.UNAVAILABLE"unavailable"ソフトウェアデコード機能を使用して動作していますが、StageVideo による描画が利用できません。描画を継続する場合、Video に切り替える必要があります。
 
■カラースペース(色空間)について
 
カラースペース(色空間)を取得するには、colorSpace プロパティを使用します。
 
■取得例
 
StageVideo オブジェクトのレンダリング状況を監視する

import flash.text.TextField;
import flash.media.StageVideo;
import flash.net.NetConnection;
import flash.net.NetStream;
import flash.geom.Rectangle;
import flash.utils.Dictionary;
import flash.events.StageVideoAvailabilityEvent;
import flash.events.StageVideoEvent;
import flash.media.StageVideoAvailability;
import flash.media.VideoStatus;

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


// ------------------------------------------------------------
// ステージビデオ
// ------------------------------------------------------------
// StageVideo の可用性に変化があると呼び出されるイベント
stage.addEventListener(StageVideoAvailabilityEvent.STAGE_VIDEO_AVAILABILITY,function (e:StageVideoAvailabilityEvent):void{

	var stage_video:StageVideo;

	// ステージビデオの取得が可能
	if(e.availability == StageVideoAvailability.AVAILABLE){
		// 0 番目の StageVideo オブジェクトを取得
		var stage_videos:Vector.<StageVideo> = stage.stageVideos;
		if(stage_videos.length){
			stage_video = stage_videos[0];
		}
	}

	// ステージビデオが利用可能
	if(stage_video){
		// 描画する句形範囲を指定
		var view_rect:Rectangle = new Rectangle(10,10,stage.stageWidth-20,100);
		stage_video.viewPort = view_rect;

		// ステージビデオとネットストリームを関連付け
		stage_video.attachNetStream(net_stream);
	}

});


// ------------------------------------------------------------
// レンダリング状況を監視
// ------------------------------------------------------------
// ステージビデオ用辞書
var stage_video_dictonary:Dictionary = new Dictionary();

// StageVideo の可用性に変化があると呼び出されるイベント
stage.addEventListener(StageVideoAvailabilityEvent.STAGE_VIDEO_AVAILABILITY,function (e:StageVideoAvailabilityEvent):void{

	switch(e.availability){
	case StageVideoAvailability.AVAILABLE:
		text_field.text = "・ステージビデオは使用可能な状態である\n\n" + text_field.text;
		break;
	case StageVideoAvailability.UNAVAILABLE:
		text_field.text = "・ステージビデオは使用不可能な状態である\n\n" + text_field.text;
		break;
	}

	// StageVideo オブジェクトを配列で取得
	var stage_videos:Vector.<StageVideo> = stage.stageVideos;
	var i:Number;
	var num:Number = stage_videos.length;
	for(i=0;i < num;i++){
		// StageVideo オブジェクトを取得
		var stage_video:StageVideo = stage_videos[i];

		// 初回アクセスかチェック
		if(!stage_video_dictonary[stage_video]){

			// 辞書にパラメータをセット
			var param:Object = {index:i};
			stage_video_dictonary[stage_video] = param;

			// ------------------------------------------------------------
			// StageVideo のレンダリング状況に変化があると呼び出されるイベント
			// ------------------------------------------------------------
			stage_video.addEventListener(StageVideoEvent.RENDER_STATE,function (e:StageVideoEvent):void{

				var stage_video:StageVideo = e.currentTarget as StageVideo;
				var param:Object = stage_video_dictonary[stage_video];

				var str:String = "・StaegVideo (id:" + param.index + ") のレンダリング状況\n";

				switch(e.status){
				case VideoStatus.ACCELERATED:
					str += "\tハードウェアデコード機能を使用して動作している\n";
					break;
				case VideoStatus.SOFTWARE:
					str += "\tソフトウェアデコード機能を使用して動作している\n";
					break;
				case VideoStatus.UNAVAILABLE:
					str += "\t使用不可能である\n";
					break;
				}

				str += "\tカラースペース(色空間):" + e.colorSpace + "\n";

				text_field.text = str + "\n" + text_field.text;
			});
		}
	}
});

// ------------------------------------------------------------
// ネットストリーム
// ------------------------------------------------------------
// ネットコネクションオブジェクトを作成
var net_connection:NetConnection = new NetConnection();
net_connection.connect( null );

// ネットストリームオブジェクトを作成
var net_stream:NetStream = new NetStream (net_connection);

// URL を指定して、ストリーム再生を開始する
net_stream.play ("http://hakuhin.jp/test.mp4");