動画の制御について
動画ファイルの再生について
■動画ファイルの再生に必要なクラスについて
■ NetStream クラスについて
動画ファイルを再生するには、NetStream クラスを使用します。
動画ファイルを読み込んで、再生制御する事ができます。
■ Video クラスについて
動画を表示するには、Video クラスを使用します。
表示に関する制御ができます。
Video クラスについては、こちらで解説しています。
■動画ファイル再生までの準備について
1.Video オブジェクトを用意する
こちらで解説しています。
2.NetConnection オブジェクトを作成する
new 演算子を使って、NetConnection クラスをインスタンス化します。
new NetConnection ( ) :NetConnection
引数 | void | なし |
戻り値 | NetStream | 新しい NetStream オブジェクトが得られる |
3.動画ファイル再生用の設定
connect() メソッドを使用します。
ここでは、第01引数に null を指定します。
NetConnection.connect ( command , args ... ) :void
第01引数 | String | 接続先の URI を指定。 |
可変引数(略可) | * | ここでは省略 |
戻り値 | void | なし |
4.NetStream オブジェクトを作成する
new 演算子を使って、NetStream クラスをインスタンス化します。
第01引数に、NetConnection オブジェクトを指定します。
new NetStream ( connection , peerID ) :NetStream
第01引数 | NetConnection | NetConnection オブジェクトを指定。 |
第02引数(略可) | String | ここでは省略 |
戻り値 | NetStream | 新しい NetStream オブジェクトが得られる |
5.Video と NetStream オブジェクトを関連付ける
attachNetStream() メソッドを使用します。
■使用例
外部にある動画ファイルを読み込んで、再生する
import flash.media.Video;
import flash.net.NetConnection;
import flash.net.NetStream;
// ------------------------------------------------------------
// Video オブジェクトを作成
// ------------------------------------------------------------
var video_obj:Video = new Video();
// 位置とサイズ
video_obj.x = 10;
video_obj.y = 10;
video_obj.width = stage.stageWidth - 20;
video_obj.height = stage.stageHeight - 20;
// ステージに配置
stage.addChild(video_obj);
// ------------------------------------------------------------
// NetConnection オブジェクトを作成
// ------------------------------------------------------------
var net_connection:NetConnection = new NetConnection();
// 動画ファイル再生用の設定
net_connection.connect( null );
// ------------------------------------------------------------
// NetStream オブジェクトを作成
// ------------------------------------------------------------
var net_stream:NetStream = new NetStream(net_connection);
// ------------------------------------------------------------
// ビデオと NetStream を関連付け
// ------------------------------------------------------------
video_obj.attachNetStream(net_stream);
// ------------------------------------------------------------
// リスナー用オブジェクトを渡して、リッスンを開始(ここではエラー回避用のダミー)
// ------------------------------------------------------------
net_stream.client = { onMetaData:function ():void{} };
// ------------------------------------------------------------
// URL を指定して、ストリーム再生を開始する
// ------------------------------------------------------------
net_stream.play ( "http://example.com/video/test.flv" );
動画の再生制御について
■ストリーム再生を開始する
play() メソッドを使用します。
このメソッドを呼び出すと、動画ファイルの読み込みを開始します。
NetStream.play ( name , start , len , reset ) :void
第01引数 | Object | 動画ファイルの URL を指定。 |
第02引数(略可) | Number | ここでは省略 |
第03引数(略可) | Number | ここでは省略 |
第04引数(略可) | Object | ここでは省略 |
戻り値 | void | なし |
■一時停止状態から、再生を再開したい場合
resume() メソッドが最適です。
play() メソッドは、動画ファイルの読み込みを、新規に開始します。
■読み込み結果を取得する
NetStatusEvent.NET_STATUS イベントを使用します。
コールバック関数の引数から、NetStatusEvent オブジェクトが得られます。
info プロパティから、情報オブジェクトが得られます。
情報オブジェクトの code プロパティから、以下の文字列が得られます。
文字列 | 説明 |
"NetStream. | 動画ファイルの読み込みに失敗した |
"NetStream. | 動画ファイルの読み込みを開始した |
"NetStream. | 再生ヘッダが最終フレームまで移動した |
■使用例
外部にある動画ファイルを読み込んで、再生する
import flash.media.Video;
import flash.net.NetConnection;
import flash.net.NetStream;
import flash.events.NetStatusEvent;
// ------------------------------------------------------------
// Video オブジェクトを作成
// ------------------------------------------------------------
var video_obj:Video = new Video();
// 位置とサイズ
video_obj.x = 10;
video_obj.y = 10;
video_obj.width = stage.stageWidth - 20;
video_obj.height = stage.stageHeight - 20;
// ステージに配置
stage.addChild(video_obj);
// ------------------------------------------------------------
// NetConnection オブジェクトを作成
// ------------------------------------------------------------
var net_connection:NetConnection = new NetConnection();
// 動画ファイル再生用の設定
net_connection.connect( null );
// ------------------------------------------------------------
// NetStream オブジェクトを作成
// ------------------------------------------------------------
var net_stream:NetStream = new NetStream(net_connection);
// ------------------------------------------------------------
// ビデオと NetStream を関連付け
// ------------------------------------------------------------
video_obj.attachNetStream(net_stream);
// ------------------------------------------------------------
// リスナー用オブジェクトを渡して、リッスンを開始(ここではエラー回避用のダミー)
// ------------------------------------------------------------
net_stream.client = { onMetaData:function ():void{} };
// ------------------------------------------------------------
// 状態が変化すると実行されるイベント
// ------------------------------------------------------------
net_stream.addEventListener( NetStatusEvent.NET_STATUS , function(e:NetStatusEvent):void {
// 情報オブジェクトを取得
var info:Object = e.info;
switch(info.code){
// ------------------------------------------------------------
// 動画ファイルの読み込みに失敗した
// ------------------------------------------------------------
case "NetStream.Play.StreamNotFound":
trace("動画ファイルの読み込みに失敗した");
break;
// ------------------------------------------------------------
// 動画ファイルの読み込みを開始した
// ------------------------------------------------------------
case "NetStream.Play.Start":
trace("動画ファイルの読み込みを開始した");
break;
// ------------------------------------------------------------
// 再生ヘッダが最終フレームまで移動した
// ------------------------------------------------------------
case "NetStream.Play.Stop":
trace("再生ヘッダが最終フレームまで移動した");
break;
}
});
// ------------------------------------------------------------
// URL を指定して、ストリーム再生を開始する
// ------------------------------------------------------------
net_stream.play( "http://example.com/video/test.flv" );
■ストリーム再生を終了する
close() メソッドを使用します。
読み込み中の場合、中止されます。
ローカルに一時的に作成された作業ファイルが、削除されます。
ブラウザのファイルキャッシュには、残る可能性があります。
NetStream.close ( ) :void
引数 | void | なし |
戻り値 | void | なし |
■再生状態から、一時停止したい場合
pause() メソッドが最適です。
close() メソッドは、読み込んだ動画データを破棄します。
■使用例
クリックすると、動画再生を終了する
import flash.media.Video;
import flash.net.NetConnection;
import flash.net.NetStream;
import flash.events.MouseEvent;
// ------------------------------------------------------------
// Video オブジェクトを作成
// ------------------------------------------------------------
var video_obj:Video = new Video();
// 位置とサイズ
video_obj.x = 10;
video_obj.y = 10;
video_obj.width = stage.stageWidth - 20;
video_obj.height = stage.stageHeight - 20;
// ステージに配置
stage.addChild(video_obj);
// ------------------------------------------------------------
// NetConnection オブジェクトを作成
// ------------------------------------------------------------
var net_connection:NetConnection = new NetConnection();
// 動画ファイル再生用の設定
net_connection.connect( null );
// ------------------------------------------------------------
// NetStream オブジェクトを作成
// ------------------------------------------------------------
var net_stream:NetStream = new NetStream(net_connection);
// ------------------------------------------------------------
// ビデオと NetStream を関連付け
// ------------------------------------------------------------
video_obj.attachNetStream(net_stream);
// ------------------------------------------------------------
// リスナー用オブジェクトを渡して、リッスンを開始(ここではエラー回避用のダミー)
// ------------------------------------------------------------
net_stream.client = { onMetaData:function ():void{} };
// ------------------------------------------------------------
// URL を指定して、ストリーム再生を開始する
// ------------------------------------------------------------
net_stream.play ( "http://example.com/video/test.flv" );
// ------------------------------------------------------------
// マウスの左ボタンをクリックすると実行されるイベント
// ------------------------------------------------------------
stage.addEventListener( MouseEvent.MOUSE_DOWN , function (e:MouseEvent):void{
// ------------------------------------------------------------
// ストリーム再生を終了する
// ------------------------------------------------------------
net_stream.close();
});
■ NetStream オブジェクトを解放する(Flash 11 以降)
dispose() メソッドを使用します。
ガベージコレクションでも解放されますが、すぐに実行されるとは限りません。
不要になった場合、即解放するように心掛けます。
NetStream.dispose ( ) :void
引数 | void | なし |
戻り値 | void | なし |
■一時停止と再生再開について
以下のメソッドを使用します。
メソッド | 説明 |
pause() | 一時停止します。 |
resume() | 再生を再開します。 |
togglePause() | 「一時停止」と「再生再開」を、交互に切り替えます。 |
■一時停止する
NetStream.pause ( ) :void
引数 | void | なし |
戻り値 | void | なし |
■再生を再開する
NetStream.resume ( ) :void
引数 | void | なし |
戻り値 | void | なし |
■「一時停止」と「再生再開」を交互に切り替える
NetStream.togglePause ( ) :void
引数 | void | なし |
戻り値 | void | なし |
■使用例
クリックすると、一時停止と再生再開を交互に切り替える
import flash.media.Video;
import flash.net.NetConnection;
import flash.net.NetStream;
import flash.events.MouseEvent;
// ------------------------------------------------------------
// Video オブジェクトを作成
// ------------------------------------------------------------
var video_obj:Video = new Video();
// 位置とサイズ
video_obj.x = 10;
video_obj.y = 10;
video_obj.width = stage.stageWidth - 20;
video_obj.height = stage.stageHeight - 20;
// ステージに配置
stage.addChild(video_obj);
// ------------------------------------------------------------
// NetConnection オブジェクトを作成
// ------------------------------------------------------------
var net_connection:NetConnection = new NetConnection();
// 動画ファイル再生用の設定
net_connection.connect( null );
// ------------------------------------------------------------
// NetStream オブジェクトを作成
// ------------------------------------------------------------
var net_stream:NetStream = new NetStream(net_connection);
// ------------------------------------------------------------
// ビデオと NetStream を関連付け
// ------------------------------------------------------------
video_obj.attachNetStream(net_stream);
// ------------------------------------------------------------
// リスナー用オブジェクトを渡して、リッスンを開始(ここではエラー回避用のダミー)
// ------------------------------------------------------------
net_stream.client = { onMetaData:function ():void{} };
// ------------------------------------------------------------
// URL を指定して、ストリーム再生を開始する
// ------------------------------------------------------------
net_stream.play ( "http://example.com/video/test.flv" );
// ------------------------------------------------------------
// マウスの左ボタンをクリックすると実行されるイベント
// ------------------------------------------------------------
stage.addEventListener( MouseEvent.MOUSE_DOWN , function (e:MouseEvent):void{
// ------------------------------------------------------------
// 「一時停止」と「再生再開」を交互に切り替える
// ------------------------------------------------------------
net_stream.togglePause();
});
■ビデオの再生位置を取得する
time プロパティを使用します。
得られる単位は、秒です。
再生ヘッダの位置を指定するには、seek() メソッドを使用します。
■ビデオの再生位置(シーク)を設定する
seek() メソッドを使用します。
NetStream.seek ( 位置 ) :void
第02引数(略可) | Number | 再生ヘッダの位置を、秒数で指定する。 |
戻り値 | void | なし |
■第01引数 (位置)
再生ヘッダの位置を、秒数で指定します。
■フレーム間予測について
動画ファイルは、フレーム間予測と呼ばれる仕組みで、圧縮されています。
https://ja.wikipedia.org/wiki/フレーム間予測
■イントラフレームについて(I-frame)
I-frame は、単独で静止画を計算できます。
I-frame が多いほど、圧縮効率は悪くなります。
■予測フレームについて(P-frame)
P-frame は、前回フレームとの差分データです。
静止画を計算するには、前回フレームの完全な静止画が必要です。
もし P-frame が連続している場合、I-frame が出現するまで戻ります。
■実際にシーク可能なフレームについて
指定した位置が、P-frame だった場合、シークできません。
この場合、次に出現する I-frame の位置まで、先送り補正されます。
もし、I-frame が1フレーム目にしかない場合、シークは機能しないでしょう。
シーク操作が完了したか調べる
NetStatusEvent.NET_STATUS イベントを使用します。
コールバック関数の引数から、NetStatusEvent オブジェクトが得られます。
info プロパティから、情報オブジェクトが得られます。
情報オブジェクトの code プロパティから、以下の文字列が得られます。
文字列 | 説明 |
"NetStream. | シーク操作が完了した |
"NetStream. | シーク操作中の通知 |
"NetStream. | シーク操作に無効な時間を設定した (details プロパティから、設定可能な秒数が得られる) |
■使用例
クリックすると、ランダムな秒数でシーク操作を開始する
import flash.media.Video;
import flash.text.TextField;
import flash.net.NetConnection;
import flash.net.NetStream;
import flash.events.NetStatusEvent;
import flash.events.MouseEvent;
import flash.events.Event;
// ------------------------------------------------------------
// テキストフィールドを作成
// ------------------------------------------------------------
var text_field0:TextField = new TextField();
var text_field1:TextField = new TextField();
// 位置とサイズ
text_field0.x = 10;
text_field0.y = 10;
text_field0.width = stage.stageWidth - 20;
text_field0.height = 80;
text_field1.x = 10;
text_field1.y = 100;
text_field1.width = stage.stageWidth - 20;
text_field1.height = stage.stageHeight - 110;
// 枠線を表示
text_field0.border = true;
text_field1.border = true;
// ステージに配置
stage.addChild(text_field0);
stage.addChild(text_field1);
// ------------------------------------------------------------
// 動画用変数
// ------------------------------------------------------------
var video_duration:Number = 0;
var video_frame_rate:Number = 0;
// ------------------------------------------------------------
// Video オブジェクトを作成
// ------------------------------------------------------------
var video_obj:Video = new Video();
// 位置とサイズ
video_obj.width = 320;
video_obj.height = 240;
video_obj.x = stage.stageWidth - video_obj.width - 10;
video_obj.y = stage.stageHeight - video_obj.height - 10;
// 透明度
video_obj.alpha = 0.2;
// ステージに配置
stage.addChild(video_obj);
// ------------------------------------------------------------
// NetConnection オブジェクトを作成
// ------------------------------------------------------------
var net_connection:NetConnection = new NetConnection();
// 動画ファイル再生用の設定
net_connection.connect( null );
// ------------------------------------------------------------
// NetStream オブジェクトを作成
// ------------------------------------------------------------
var net_stream:NetStream = new NetStream(net_connection);
// ------------------------------------------------------------
// ビデオと NetStream を関連付け
// ------------------------------------------------------------
video_obj.attachNetStream(net_stream);
// ------------------------------------------------------------
// 状態が変化すると実行されるイベント
// ------------------------------------------------------------
net_stream.addEventListener( NetStatusEvent.NET_STATUS , function(e:NetStatusEvent):void {
// 情報オブジェクトを取得
var info:Object = e.info;
var str:String = "";
switch(info.code){
// ------------------------------------------------------------
// シーク操作が完了した
// ------------------------------------------------------------
case "NetStream.Seek.Complete":
str += "シーク操作が完了 (time:" + (net_stream.time) + ")\n";
break;
// ------------------------------------------------------------
// シーク操作の通知
// ------------------------------------------------------------
case "NetStream.Seek.Notify":
str += "シーク操作の通知\n";
break;
// ------------------------------------------------------------
// シーク操作に無効な時間を設定した
// ------------------------------------------------------------
case "NetStream.Seek.InvalidTime":
str += "シークに無効な時間を設定 (設定可能な限界秒数:" + (info.details) + ")\n";
break;
}
if(str){
// 出力
text_field1.text = str + text_field1.text;
}
});
// ------------------------------------------------------------
// リスナー用オブジェクトを渡して、リッスンを開始
// ------------------------------------------------------------
net_stream.client = (function():Object {
// ------------------------------------------------------------
// リスナー用オブジェクトを作成
// ------------------------------------------------------------
var listener_obj:Object = new Object();
// ------------------------------------------------------------
// メタデータが含まれる場合に実行されるイベント
// ------------------------------------------------------------
listener_obj.onMetaData = function (info:Object):void{
// 動画の総時間を取得(秒数)
video_duration = info.duration;
// 動画のフレームレートを取得
video_frame_rate = info.framerate;
};
return listener_obj;
})();
// ------------------------------------------------------------
// URL を指定して、ストリーム再生を開始する
// ------------------------------------------------------------
net_stream.play ( "http://example.com/video/test.flv" );
// ------------------------------------------------------------
// マウスの左ボタンをクリックすると実行されるイベント
// ------------------------------------------------------------
stage.addEventListener( MouseEvent.MOUSE_DOWN , function (e:MouseEvent):void{
// ------------------------------------------------------------
// ビデオの再生位置(シーク)を設定する
// ------------------------------------------------------------
// 適当な秒数を用意
var time:Number = Math.random() * 100;
// シーク操作を開始
net_stream.seek ( time );
// 出力
text_field1.text = "シーク操作を開始 (time:" + (net_stream.time) + " seek:" + (time) + ")\n" + text_field1.text;
});
// ------------------------------------------------------------
// 毎フレーム実行されるイベント
// ------------------------------------------------------------
stage.addEventListener( Event.ENTER_FRAME , function (e:Event):void{
// 再生ヘッダの位置(秒)を取得
var time:Number = net_stream.time;
// 再生ヘッダの位置(フレーム数)を計算
var frame_pos:Number = 0;
var frame_max:Number = 0;
if( (video_duration) && (video_frame_rate) ){
frame_pos = Math.round(time * video_frame_rate);
frame_max = Math.round(video_duration * video_frame_rate);
}
// 出力
text_field0.text = "time:" + (time) + "\n" + "duration:" + (video_duration) + "\n" + "frame pos:" + (frame_pos) + "\n" + "frame max:" + (frame_max);
});
■現在のフレームレートを取得する
currentFps プロパティを使用します。
現在の環境の、リアルタイムの実測値です。
動画のフレームレートを取得するには、onMetaData イベントを使用します。
■動画ファイル読み込みのセキュリティについて
■クロスドメイン環境でも可能な処理について
動画ファイルの再生に、制限はありません。
別ドメインの動画ファイルを読み込んで、再生する事は可能です。
■クロスドメイン環境では不可能な処理について
静止画をキャプチャする事はできません。
■クロスドメインポリシーの解除について
クロスドメインポリシーは、解除する事ができます。
動画ファイルを格納しているサーバーに、ポリシーファイルを設置しておきます。
その後、play() メソッドを呼び出します。
■ローカルで実行されている Flash について
ローカルで実行されている Flash から、ネットワークに格納されている動画ファイルに、読み取りアクセスする事はできません。
パブリッシュ設定から「ネットワークにのみアクセスする」を選択すると、読み取りアクセス可能になります。
動画のサウンド制御について
■動画のサウンド制御について
1.SoundTransform オブジェクトを取得する
soundTransform プロパティを使用します。
2.サウンドの出力を設定する
こちらで解説しています。
3.サウンドの出力を更新する
soundTransform プロパティを使用します。
設定後の SoundTransform オブジェクトを渡します。
■使用例
ビデオのサウンド出力を設定する
import flash.media.Video;
import flash.media.SoundTransform;
import flash.net.NetConnection;
import flash.net.NetStream;
// ------------------------------------------------------------
// Video オブジェクトを作成
// ------------------------------------------------------------
var video_obj:Video = new Video();
// 位置とサイズ
video_obj.x = 10;
video_obj.y = 10;
video_obj.width = stage.stageWidth - 20;
video_obj.height = stage.stageHeight - 20;
// ステージに配置
stage.addChild(video_obj);
// ------------------------------------------------------------
// NetConnection オブジェクトを作成
// ------------------------------------------------------------
var net_connection:NetConnection = new NetConnection();
// 動画ファイル再生用の設定
net_connection.connect( null );
// ------------------------------------------------------------
// NetStream オブジェクトを作成
// ------------------------------------------------------------
var net_stream:NetStream = new NetStream(net_connection);
// ------------------------------------------------------------
// ビデオと NetStream を関連付け
// ------------------------------------------------------------
video_obj.attachNetStream(net_stream);
// ------------------------------------------------------------
// リスナー用オブジェクトを渡して、リッスンを開始(ここではエラー回避用のダミー)
// ------------------------------------------------------------
net_stream.client = { onMetaData:function ():void{} };
// ------------------------------------------------------------
// URL を指定して、ストリーム再生を開始する
// ------------------------------------------------------------
net_stream.play ( "http://example.com/video/test.flv" );
// ------------------------------------------------------------
// SoundTransform オブジェクトを取得する
// ------------------------------------------------------------
var sound_transform:SoundTransform = net_stream.soundTransform;
// ボリュームを設定する
sound_transform.volume = 1.0;
// パンを設定する
sound_transform.pan = 0.75;
// ------------------------------------------------------------
// サウンド出力を更新する
// ------------------------------------------------------------
net_stream.soundTransform = sound_transform;
動画の再生バッファについて
■再生バッファについて
再生バッファが完全に尽きた場合(初期状態)
ビデオを再生する事はできません。
再生バッファは、自動的に補充され続けます。
再生バッファが完全に満たされるまで、再生は開始できません。
再生バッファが満たされると、再生可能状態に遷移します。
再生バッファが完全に満たされた場合(再生可能状態)
ビデオの再生が可能です。
再生中は、再生バッファを消費します。
消費と並行して、再生バッファは自動的に補充され続けます。
消費と補充のバランスが良好な場合、この状態を維持し続けます。
読み込み遅延などの理由で、再生バッファが完全に尽きる事があります。
この場合、初期状態に遷移します。
■再生バッファを設定する
bufferTime プロパティを使用します。
再生バッファのサイズを秒数で指定します。
デフォルトは、0.1 です。
■再生バッファの進捗状況を取得する
再生バッファの現在の蓄積量を、秒数で取得する
bufferLength を使用します。
再生バッファの状況を取得する
NetStatusEvent.NET_STATUS イベントを使用します。
コールバック関数の引数から、NetStatusEvent オブジェクトが得られます。
info プロパティから、情報オブジェクトが得られます。
情報オブジェクトの code プロパティから、以下の文字列が得られます。
文字列 | 説明 |
"NetStream. | 再生バッファが空になった |
"NetStream. | 再生バッファが満たされた |
"NetStream. | 再生バッファのフラッシュ(クリア)関連 「フラッシュ開始(デコードが最後まで完了した瞬間)」 「フラッシュ完了(最後まで再生し終えた瞬間)」 |
■取得例
再生バッファの進捗状況を取得する
import flash.media.Video;
import flash.text.TextField;
import flash.net.NetConnection;
import flash.net.NetStream;
import flash.events.NetStatusEvent;
import flash.events.MouseEvent;
import flash.events.Event;
// ------------------------------------------------------------
// テキストフィールドを作成
// ------------------------------------------------------------
var text_field0:TextField = new TextField();
var text_field1:TextField = new TextField();
// 位置とサイズ
text_field0.x = 10;
text_field0.y = 10;
text_field0.width = stage.stageWidth - 20;
text_field0.height = 80;
text_field1.x = 10;
text_field1.y = 100;
text_field1.width = stage.stageWidth - 20;
text_field1.height = stage.stageHeight - 110;
// 枠線を表示
text_field0.border = true;
text_field1.border = true;
// ステージに配置
stage.addChild(text_field0);
stage.addChild(text_field1);
// ------------------------------------------------------------
// Video オブジェクトを作成
// ------------------------------------------------------------
var video_obj:Video = new Video();
// 位置とサイズ
video_obj.width = 320;
video_obj.height = 240;
video_obj.x = stage.stageWidth - video_obj.width - 10;
video_obj.y = stage.stageHeight - video_obj.height - 10;
// 透明度
video_obj.alpha = 0.2;
// ステージに配置
stage.addChild(video_obj);
// ------------------------------------------------------------
// NetConnection オブジェクトを作成
// ------------------------------------------------------------
var net_connection:NetConnection = new NetConnection();
// 動画ファイル再生用の設定
net_connection.connect( null );
// ------------------------------------------------------------
// NetStream オブジェクトを作成
// ------------------------------------------------------------
var net_stream:NetStream = new NetStream(net_connection);
// ------------------------------------------------------------
// ビデオと NetStream を関連付け
// ------------------------------------------------------------
video_obj.attachNetStream(net_stream);
// ------------------------------------------------------------
// 状態が変化すると実行されるイベント
// ------------------------------------------------------------
net_stream.addEventListener( NetStatusEvent.NET_STATUS , function(e:NetStatusEvent):void {
// 情報オブジェクトを取得
var info:Object = e.info;
var str:String = "";
switch(info.code){
// ------------------------------------------------------------
// 再生バッファが尽きた
// ------------------------------------------------------------
case "NetStream.Buffer.Empty":
str += "再生バッファが尽きた\n";
break;
// ------------------------------------------------------------
// 再生バッファが満たされた
// ------------------------------------------------------------
case "NetStream.Buffer.Full":
str += "再生バッファが満たされた\n";
break;
// ------------------------------------------------------------
// 再生バッファのフラッシュ関連
// ------------------------------------------------------------
case "NetStream.Buffer.Flush":
str += "再生バッファのフラッシュ関連\n";
break;
}
if(str){
// 出力
text_field1.text = str + text_field1.text;
}
});
// ------------------------------------------------------------
// リスナー用オブジェクトを渡して、リッスンを開始(ここではエラー回避用のダミー)
// ------------------------------------------------------------
net_stream.client = { onMetaData:function ():void{} };
// ------------------------------------------------------------
// URL を指定して、ストリーム再生を開始する
// ------------------------------------------------------------
net_stream.play ( "http://example.com/video/test.flv" );
// ------------------------------------------------------------
// 再生バッファのサイズを秒数で設定
// ------------------------------------------------------------
net_stream.bufferTime = 10.0;
// ------------------------------------------------------------
// 毎フレーム実行されるイベント
// ------------------------------------------------------------
stage.addEventListener( Event.ENTER_FRAME , function (e:Event):void{
var str:String = "";
// 再生ヘッダの位置(秒)
str += "time:" + (net_stream.time) + "\n";
// 再生バッファの現在の蓄積量(秒)
str += "bufferLength:" + (net_stream.bufferLength) + "\n";
// 再生バッファのサイズ(秒)
str += "bufferTime:" + (net_stream.bufferTime) + "\n";
// 出力
text_field0.text = str;
});
動画のメタデータを取得する
■動画のメタデータを取得する
onMetaData イベントを使用します。
動画ファイルに、メタデータが含まれる場合、発行されます。
1.リスナー用オブジェクトを作成する
リスナー用のオブジェクトを作成します。
2.コールバック関数を登録する
オブジェクトに、onMetaData という名前のプロパティを追加します。
コールバック関数を登録します。
3.リッスンを開始する
client プロパティに、リスナー用のオブジェクトを渡します。
■コールバック関数の仕様について
第01引数から、情報オブジェクトが得られます。
for..in 文を使用すると、すべてのデータを取り出せます。
得られるプロパティの一例です。
プロパティ | 型 | 説明 |
duration | Number | ビデオの総時間(秒数) |
width | Number | ビデオ解像度の幅 |
height | Number | ビデオ解像度の高さ |
framerate | Number | フレームレート(FPS) |
プロパティ | 型 | 説明 |
videocodecid | Number | ビデオのコーデックID |
videodatarate | Number | ビデオのデータレート(kb/s) |
プロパティ | 型 | 説明 |
audiocodecid | Number | オーディオのコーデックID |
audiodatarate | Number | オーディオのデータレート(kb/s) |
■取得例
メタデータを取得する
import flash.media.Video;
import flash.text.TextField;
import flash.net.NetConnection;
import flash.net.NetStream;
import flash.events.NetStatusEvent;
import flash.events.MouseEvent;
import flash.events.Event;
// ------------------------------------------------------------
// テキストフィールドを作成
// ------------------------------------------------------------
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;
// ステージに配置
stage.addChild(text_field);
// ------------------------------------------------------------
// Video オブジェクトを作成
// ------------------------------------------------------------
var video_obj:Video = new Video();
// 位置とサイズ
video_obj.width = 320;
video_obj.height = 240;
video_obj.x = stage.stageWidth - video_obj.width - 10;
video_obj.y = stage.stageHeight - video_obj.height - 10;
// 透明度
video_obj.alpha = 0.2;
// ステージに配置
stage.addChild(video_obj);
// ------------------------------------------------------------
// NetConnection オブジェクトを作成
// ------------------------------------------------------------
var net_connection:NetConnection = new NetConnection();
// 動画ファイル再生用の設定
net_connection.connect( null );
// ------------------------------------------------------------
// NetStream オブジェクトを作成
// ------------------------------------------------------------
var net_stream:NetStream = new NetStream(net_connection);
// ------------------------------------------------------------
// ビデオと NetStream を関連付け
// ------------------------------------------------------------
video_obj.attachNetStream(net_stream);
// ------------------------------------------------------------
// リスナー用オブジェクトを渡して、リッスンを開始
// ------------------------------------------------------------
net_stream.client = (function():Object {
// ------------------------------------------------------------
// リスナー用オブジェクトを作成
// ------------------------------------------------------------
var listener_obj:Object = new Object();
// ------------------------------------------------------------
// メタデータが含まれる場合に実行されるイベント
// ------------------------------------------------------------
listener_obj.onMetaData = function (info:Object):void{
// ------------------------------------------------------------
// 出力テスト
// ------------------------------------------------------------
trace( info.duration );
trace( info.width );
trace( info.height );
trace( info.framerate );
trace( info.videocodecid );
trace( info.videodatarate );
trace( info.audiocodecid );
trace( info.audiodatarate );
// ------------------------------------------------------------
// for..in 文を使ってすべて取得
// ------------------------------------------------------------
var str:String = "";
var name:String;
for(name in info){
// 値を取得
var value:* = info[name];
str += (name) + ": " + (value) + "\n";
}
// 出力
text_field.text = str;
};
return listener_obj;
})();
// ------------------------------------------------------------
// URL を指定して、ストリーム再生を開始する
// ------------------------------------------------------------
net_stream.play ( "http://example.com/video/test.flv" );
// 一時停止
net_stream.pause();
動画の読み込み状況を取得する
■動画の読み込み状況を取得する
以下のプロパティを使用します。
プロパティ | 型 | 説明 |
bytesLoaded | uint | これまでに完了した受信バイト数を取得する |
bytesTotal | uint | 全体の受信バイト数を取得する |
■取得例
動画の読み込み状況を取得する
import flash.media.Video;
import flash.text.TextField;
import flash.net.NetConnection;
import flash.net.NetStream;
import flash.events.NetStatusEvent;
import flash.events.MouseEvent;
import flash.events.Event;
// ------------------------------------------------------------
// テキストフィールドを作成
// ------------------------------------------------------------
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;
// ステージに配置
stage.addChild(text_field);
// ------------------------------------------------------------
// Video オブジェクトを作成
// ------------------------------------------------------------
var video_obj:Video = new Video();
// 位置とサイズ
video_obj.width = 320;
video_obj.height = 240;
video_obj.x = stage.stageWidth - video_obj.width - 10;
video_obj.y = stage.stageHeight - video_obj.height - 10;
// 透明度
video_obj.alpha = 0.2;
// ステージに配置
stage.addChild(video_obj);
// ------------------------------------------------------------
// NetConnection オブジェクトを作成
// ------------------------------------------------------------
var net_connection:NetConnection = new NetConnection();
// 動画ファイル再生用の設定
net_connection.connect( null );
// ------------------------------------------------------------
// NetStream オブジェクトを作成
// ------------------------------------------------------------
var net_stream:NetStream = new NetStream(net_connection);
// ------------------------------------------------------------
// ビデオと NetStream を関連付け
// ------------------------------------------------------------
video_obj.attachNetStream(net_stream);
// ------------------------------------------------------------
// リスナー用オブジェクトを渡して、リッスンを開始(ここではエラー回避用のダミー)
// ------------------------------------------------------------
net_stream.client = { onMetaData:function ():void{} };
// ------------------------------------------------------------
// URL を指定して、ストリーム再生を開始する
// ------------------------------------------------------------
net_stream.play ( "http://example.com/video/test.flv" );
// ------------------------------------------------------------
// 毎フレーム実行されるイベント
// ------------------------------------------------------------
stage.addEventListener( Event.ENTER_FRAME , function (e:Event):void{
// これまでに完了した受信バイト数
var loaded:uint = net_stream.bytesLoaded;
// 全体の受信バイト数
var total:uint = net_stream.bytesTotal;
// パーセント数
var percent:Number = 0;
if(total > 0){
percent = loaded / total * 100;
}
// 出力
text_field.text = "bytesLoaded:" + (loaded) + "\n" + "bytesTotal:" + (total) + "\n" + "percent:" + (percent) + "\n";
});