« 企業が好む表現対策 Part3<磁石>::RM(JP) | Main | ケーススタディ[2] mp3の再生(JP) »

ケーススタディ[1] FLVの無限ループ(JP)

今回は制作したプロジェクトの中で使われた技術の解説と応用出来る形で提供していく。今後数回に渡りこのプロジェクトに関連したアクションスクリプトの解説を行う。今回はサイトトップで映像を繰り返し流したいという要件を満たすためにNetStreamクラスを拡張しNetStreamLoopクラスを作成した。

NetStreamクラス
NetStreamクラスは一般にhttpサーバ又はFMS(旧FCS)から配信された映像や音声データをストリーミング再生するために使われる。以前の記事でplay()メソッドは詳しく説明してあるので参照していただきたい。

var conn:NetConnection = new NetConnection();
conn.connect(URL);
var stream:NetStream = new NetStream(conn);
stream.play(URI);
NetStreamクラスはストリーミングの再生の開始停止ポーズやバッファの状態が変化するとonStatusイベントを呼び出す。play()メソッドが実行されて再生が停止するまでの一連のステータス通知は次のようになる。

NetStream.Play.Reset
NetStream.PlayStart
NetStream.Buffer.Full
NetStream.Buffer.Empty
..バッファを埋めながら再生..
NetStream.Buffer.Full
NetStream.Buffer.Empty
NetStream.Buffer.Full
NetStream.Play.Stop
NetStream.Buffer.Empty

通常の再生環境ではバッファが減ったり増えたりしながら再生が行われる。バッファの容量が空になれば再生が続かずに停止するが、再生中は受信したデータでバッファを満たそうとする。バッファが空になる時は通常の再生中と再生が停止した時の2回あることが分かる。映像の再生はNetStream.Play.Stopの後にNetStream.Buffer.Emptyが呼ばれたときに初めて停止するので、NetStream.Play.Stopそのものが映像の再生停止を意味していない。

再生停止を取得する
前述したonStatusイベントから再生停止はどういうコードかが分かったので、これをもとにonStatusを記述してみる。stopped変数を使い、NetStream.Buffer.Emptyが呼ばれたときに、NetStream.Play.Stopが既に呼ばれているのかで条件分岐することで終了を見分けることが出来る。

var _stopped:Boolean;
var url:String = "movie";
function onStatus(info:Object):Void{
	switch (info.code) {
		case 'NetStream.Play.Start' :
			_stopped = false;
			break;
		case "NetStream.Play.Stop":
			_stopped = true;
			break;
		case "NetStream.Buffer.Empty":
			if(_stopped){
				//終了
			}
			break;
	}
}
終了が分かれば同じ映像をplay()メソッドで呼ぶだけでループ再生が実現する。ここではNetStreamクラスを拡張して新たにNetStreamLoopクラスを作成した。
var conn:NetConnection = new NetConnection();
conn.connect(URL);
var stream:NetStreamLoop = new NetStreamLoop(conn);
stream.play(URI);
このクラスのサンプルは自由にダウンロード出来る。

Post a comment