ケーススタディ[1] FLVの無限ループ(JP)
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);このクラスのサンプルは自由にダウンロード出来る。