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