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

[iPhone]3GSから4sに機種変更するとき「実質無償機種変更キャンペーン」を利用するメリットとデメリット

以前書いた記事
「[iPhone]契約2年を迎えたときに、2年契約(キャンペーン)を更新する or しない のメリットとデメリット」
のオマケ的なお話。

本日iPhone4sに機種変更してきました。
現在softbankは以下のようなキャンペーンを実施しています。(11/30まで)

「実質無償機種変更キャンペーン」

これは、ざっくり以下の内容。

  • 使用中の3GSの端末価格の支払いが済んでない場合はその分はチャラにするよ
  • 支払いが完了してる人(ボクはここに該当)でも6000円キャッシュバックするよ

普通に考えると利用しない手はないのですが、ボクは今回このキャンペーンをあえて使わなかった。


その理由は、(前回の記事の内容とも関係するけど)
このキャンペーンを利用するといわゆる2年縛り状態になってしまう、ということ。
つまり特定の期間外でsoftbankを解約した場合に約1万円の違約金が発生してしまう。

前回の記事にも書いたようにボクは現在softbankの2年縛りの呪縛から開放されている状態だった。
目先の6000円を追うよりも、いつでも解約できるという精神的な安定を望んだわけだ。
もちろん解約しないでずっと使うよ、って人はキャンペーンを利用したほうが得だろう。
ただ個人的に、電話会社のプランは日々変化しつづけていて、それが消費者にとっては改悪の場合もあるわけで、新規で契約する場合にはそちらしか選べないけど、既存の契約者が旧プランを維持できるんであればそれを利用しつづけるのも手かな、と。
一度プラン変えちゃったら、もう元には戻れないと思うし。


p.s
今回アップルストアで機種変更したのだけど、対応してくれた店員さんはとても親切でボクの過去3ヶ月の通話記録からもっと安くなるようなプランを提案してくれた。
具体的には全然通話してなかったから、Wホワイトよりホワイトの方がお得ですよ、と。
ありがたくその提案に従ったけれども、さすがに上記キャンペーンについての細かい話はなかった。
(ボクが2年縛りのかかってない状態かなんて知らないだろうしね)
こちらから質問することで丁寧に教えてくれた。
なんでも直接聞いてみるのが一番だね。