NetStreamの停止の仕方にまつわる物語。
悪夢の始まりの巻
以下の文章はあくまで試行錯誤の結果見つけたものであり、正式に追試をしたわけではありません。なので他の部分の要因が現象を招いているだけで、事実と違うことを言っているかもしれませんので、あしからず。
僕は今テレビ会議システムを作っています。こっちの画面(mc_a)からあっちの画面(mc_b)へ、あっちの画面(b)からそっちの画面(mc_c)へと、その人の映像がピョンピョン動き回ります。
そのための処理は簡単です。
(MCにnetstreamを突っ込んでます。)
- mc_aのストリームを止める
- mc_bのストリームを一応止める(前の人がいたから一応ね)
- mc_bのストリームを再生する
そのためのコーディングとしても簡単です。
- mc_a netstream.play(false);
- mc_b netstrema.play(false);
- mc_b netstrema.play(画像ID番号);
ちなみになぜ停止がplay(false)かというと、http://livedocs.adobe.com/flash/9.0_jp/ActionScriptLangRefV3/flash/net/NetStream.htmlのplayの項目でも見てみてください。
といいつつも、このplay(false)、止まりやしない。1の処理でaの画面は停止しなければいけません。でも再生されっぱなし。aとbにおなじ映像が流れ続けます。これはまずい。
暗雲のcloseの巻
という事で上記マニュアルにある、closeを利用するようにしました。(最初っからこっちつかえよって話はなしで。他の文献で推奨だったんですもん。)closeにしてもコーディングが簡単です。
- mc_a netstream.close();
- mc_b netstream.close();
- mc_b netstream.play(画像ID番号);
OK、ちゃんと映像が停止します。しかし、ココからが悪夢の始まり。動作が少しのろくなりました。映像の切替がもたつく。しかもplayしても再生されない事象が発生し始めました。
複数端末で同時に上記処理が流れるのですが、他の端末はplayで正常に映像が流れても、別の端末では音声のみ流れる。しばらく待つと、詰まりが解消されたかのように早送りで再生された後、正常なスピードで映像が流れ始めます。
悲しみの試行錯誤の巻
わけわかんねー。で、ココからは理由とか一切なし。こうやったらこうなりました。の連続なのであしからず。
とりあえず1の処理をコメントアウトしました。そしたら、正常に動く。?????。
mc_bからmc_aののnetstreamを閉じるようにしてみました。様は「これってタイミングのバグじゃね?」っていうのを回避するため。わかりにくいですよねー
- mc_b mc_a.netstream.close(); ← ここが変わった。
- mc_b netstream.close();
- mc_b netstream.play(画像ID番号);
結果はおんなじ。ダメ。映像がもたつきます。
終章 ハッピーエンド
じゃあ!ということでもうnetstream自体の生成・削除をしよう!ということになりました。
- mc_a netstream = null;
- mc_b netstream = null;
- mc_b netstream = new netstream(nc); video.attachVideo(netStream); netstream.play(画像ID番号);
オッッッッッッッッッッッッッッケイ!
あとがき
これはまったくの勘なのですが、多分close処理は遅いのだと思います。playも。netstreamに限らず、FMS周辺のオブジェクト(NetConection, SharedObject)は共有している皆にイベントを等しく発行させます。重そうですよね。ですので連続して発行しまくると今回のような不具合が出るのかもしれません。