StageVideo クラスについて(Flash 10.2 以降)
・ | StageVideo クラスについて |
・ | ステージビデオを表示する |
・ | 動画ファイルを再生する |
・ | Webカメラの映像を表示する(Flash 11.4 以降) |
・ | 映像ソースの解像度を取得する |
・ | レンダリング状況を調べる |
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" | ステージビデオは使用可能な状態です。 |
StageVideoAvailability. | "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 オブジェクトは、「描画範囲」を設定することで、画面に表示することができます。
描画矩形範囲を設定するには、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" | ハードウェアデコード機能を使用して動作しています。 |
VideoStatus. | "software" | ソフトウェアデコード機能を使用して動作しています。 |
VideoStatus. | "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");