[AS]FlashPlayer11で、FMS接続でのNetStatusEvent.NET_STATUSをリスナーしてるときのNetStreamからのdispatchの挙動が変わったっぽい。
FlashPlayer11(以下FP11)とFlashPlayer10(FP10)で、FMSの動画を再生する際に、NetStreamでNetStatusEvent.NET_STATUSイベントをaddEventLinster登録したさいのイベント配信のタイミングがFP11とFP10で異なる現象に遭遇した。
具体的には以下をドキュメントクラスとしてパブリッシュしたswfを再生した場合に、traceされる結果がFP11とFP10で異なった。
package { import flash.display.Sprite; public class FMSTest extends Sprite { public function FMSTest() { //FMSサーバーへのパス var dirPath:String = "rtmp://hoge.hoge.hoge.hoge"; var filePath:String = "mp4:hoge.mp4"; addChild(new LoadMovie(dirPath, filePath)); } } } import flash.display.MovieClip; import flash.events.NetStatusEvent; import flash.media.Video; import flash.net.NetConnection; import flash.net.NetStream; class LoadMovie extends MovieClip { private var nsUrl:String private var nc:NetConnection; private var video:Video; public function LoadMovie(ncUrl:String, nsUrl:String, w:uint = 320, h:uint = 320 ) { this.nsUrl = nsUrl; //ネットコネクションを作る nc = new NetConnection(); //ネットコネクションの接続状態を調べるリスナー nc.addEventListener(NetStatusEvent.NET_STATUS , onNcStatus); //ネットコネクションを接続する。 nc.connect(ncUrl); nc.client = new Object(); } //ネットコネクションの状態でいろいろ出力される private function onNcStatus(e:NetStatusEvent):void { switch (e.info.code) { //もし無事に接続されたら、 case "NetConnection.Connect.Success": initStream(); break; } } //ネットストリームの初期化処理 private function initStream():void { //ネットコネクションを作る var ns:NetStream = new NetStream(nc); //ネットコネクションの接続状態を調べるリスナー ns.addEventListener(NetStatusEvent.NET_STATUS, onNsStatus); //読み込みの時間を設定 ns.bufferTime = .1 //メタデータ取得用のオブジェクトを設定 ns.client = new Object(); //videoインスタンスを作成 video = new Video(); video.attachNetStream(ns); addChild(video); //再生開始 ns.play(nsUrl); } private function onNsStatus(e:NetStatusEvent):void { trace("onNsStatus : "+e.info.code); } }
再生した際のtraceの出力結果を以下に示す。
FP10
onNsStatus : NetStream.Play.Reset
onNsStatus : NetStream.Play.Start
onNsStatus : NetStream.Buffer.Full
FP11
onNsStatus : NetStream.Play.Reset
onNsStatus : NetStream.Play.Start
onNsStatus : NetStream.Buffer.Empty
onNsStatus : NetStream.Buffer.Full
FP11では、NetStream.Buffer.Emptyが追加されている。
再現性は100%ではないが、6割~9割位の割合でNetStream.Buffer.Emptyイベントを取得するっぽい。
で、再生開始のタイミングでNetStream.Buffer.Emptyイベントがでることで何が困るかというと、FMSでは動画の終了のタイミングを取るのにNetStream.Buffer.Emptyを使うことがあるからだ。
参考:RTMP接続のランダム再生で最後の数秒が途切れてしまう!
再生開始のタイミングでNetStream.Buffer.Emptyを出したくない、どうしたもんかと思ってたら解決策っぽいのが見つかった。
Netstream.bufferTimeを多めに取ってあげるとよいようだ。
具体的には上記コードの59行目
ns.bufferTime = .1; //0.1秒 //↓0.1秒を2秒にする ns.bufferTime = 2; //2秒
これでNetStream.Buffer.Emptyはtraceされなくなった。
とりあえず、同じ現象に遭遇してしまった人の参考になれば幸いです。