[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されなくなった。
とりあえず、同じ現象に遭遇してしまった人の参考になれば幸いです。
Tweet