NetStreamの停止の仕方にまつわる物語。

悪夢の始まりの巻

以下の文章はあくまで試行錯誤の結果見つけたものであり、正式に追試をしたわけではありません。なので他の部分の要因が現象を招いているだけで、事実と違うことを言っているかもしれませんので、あしからず。

僕は今テレビ会議システムを作っています。こっちの画面(mc_a)からあっちの画面(mc_b)へ、あっちの画面(b)からそっちの画面(mc_c)へと、その人の映像がピョンピョン動き回ります。
そのための処理は簡単です。

(MCにnetstreamを突っ込んでます。)
  1. mc_aのストリームを止める
  2. mc_bのストリームを一応止める(前の人がいたから一応ね)
  3. mc_bのストリームを再生する

そのためのコーディングとしても簡単です。

  1. mc_a netstream.play(false);
  2. mc_b netstrema.play(false);
  3. 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にしてもコーディングが簡単です。

  1. mc_a netstream.close();
  2. mc_b netstream.close();
  3. mc_b netstream.play(画像ID番号);

OK、ちゃんと映像が停止します。しかし、ココからが悪夢の始まり。動作が少しのろくなりました。映像の切替がもたつく。しかもplayしても再生されない事象が発生し始めました。
複数端末で同時に上記処理が流れるのですが、他の端末はplayで正常に映像が流れても、別の端末では音声のみ流れる。しばらく待つと、詰まりが解消されたかのように早送りで再生された後、正常なスピードで映像が流れ始めます。

悲しみの試行錯誤の巻

わけわかんねー。で、ココからは理由とか一切なし。こうやったらこうなりました。の連続なのであしからず。

とりあえず1の処理をコメントアウトしました。そしたら、正常に動く。?????。
mc_bからmc_aののnetstreamを閉じるようにしてみました。様は「これってタイミングのバグじゃね?」っていうのを回避するため。わかりにくいですよねー

  1. mc_b mc_a.netstream.close(); ← ここが変わった。
  2. mc_b netstream.close();
  3. mc_b netstream.play(画像ID番号);

結果はおんなじ。ダメ。映像がもたつきます。

終章 ハッピーエンド

じゃあ!ということでもうnetstream自体の生成・削除をしよう!ということになりました。

  1. mc_a netstream = null;
  2. mc_b netstream = null;
  3. mc_b netstream = new netstream(nc); video.attachVideo(netStream); netstream.play(画像ID番号);

オッッッッッッッッッッッッッッケイ!

あとがき

これはまったくの勘なのですが、多分close処理は遅いのだと思います。playも。netstreamに限らず、FMS周辺のオブジェクト(NetConection, SharedObject)は共有している皆にイベントを等しく発行させます。重そうですよね。ですので連続して発行しまくると今回のような不具合が出るのかもしれません。

ばかばか透過

flashのwmode=tranceparentを指定すると色々不具合がでます。

  • activeが拾えない(らしい)
  • disactiveが拾えない(らしい)
  • 日本語の変換が奇妙な場所に出る
  • firefoxだと変換すらでずに、日本語入力できない
  • ほかにもあるみたい

チャット機能がついたページを透過させ手失敗しましたとさ

追記

ボタンの動きも全般的に早くなった。flashをプログラム的に扱おうとしたら、wmodeは鬼門みたいです。

linuxにて外部のperlプログラムをバックグランドで実行する時の注意

コマンドにバックグランド処理の「&」を最後につけるのは勿論ですが、もう一つ注意すべきポイントがあります。
それはプログラムの出力を何かの形でリダイレクトしてあげる必要があるということです。

たとえば

`./test.pl hoge hoge2 > /dev/null &`;

みたいに。

勿論/dev/null以外、例えばログファイルへの出力でもいいです。何かしら出力を持たせないといけないよ、というお話。

アホ。

Centosのsetup中のお話
Network Configuration for eth0という設定画面で、

[*] Enable IPv4 support
[ ] Enable IPv6 support
[*] Activate on boot

という設定があり、迂闊にも、Activate on bootのチェックをはずしてしまいました。ったらネットにつながらねー。
今にしてみれば「起動時にネットワークを活性にする」という意味ですよね。
馬鹿です。はぁ疲れた。てーか前にもこの失敗したことある、、、、

こ・れ・は・す・ご・い

http://tech.kayac.com/archive/easy-flash-remoting-with-catalyst.html
昔serverからのプッシュ機能が使いたいが為にWowzaを使おうとしてた遊びプロジェクトがあった。
こんなにも簡単に使えるなんて。Open化ってすばらしい。早くRTMPもオープンにならないかな。

嗚呼、、ハマりました。javacでのjar指定。

linuxにも慣れてきた最近、詳しい方の協力を借りつつ、classpathの指定なんて、お手の物です。

cd /root
vi .bash_profile
編集
source .bash_profile

実はsourceというコマンド初めて知りましたけどね。

http://x68000.q-e-d.net/~68user/unix/pickup?source

source hoge とするのは、ファイル hoge に書かれた文字列を一つずつ自分の手でタイプしたのと同じことである。

だって。ふーん。まぁココまではいいのですが、これから鬼嵌りりました。


mail.jarだのlog4j.jar等を格納しているディレクトリにclasspathで指定しているにもかかわらず、mail.jarの中身を参照しているオブジェクトが無いと言い腐る。違うよ!ちゃんと指定しているよ!で、社長に聞いてみるとあっさり解決。俺の1日間くらいは無駄に終わりました。

クラスパスの設定は、JDK ツールに -classpath オプションを付ける方法 (この方法が望ましい) か、CLASSPATH 環境変数を設定する方法により行います。
    % jdkTool -classpath path1:path2... 
    % setenv CLASSPATH path1:path2...
各 path の末尾は、ファイル名かディレクトリのどちらかで、これはクラスパスを設定する対象によって異なります。

・.class ファイルを含む .zip または .jar ファイルの場合、パスは .zip または .jar ファイルの名前で終わります。
・名前のないパッケージ内の .class ファイルの場合、パスは .class ファイルを含むディレクトリ名で終わります。
・名前付きのパッケージ内の .class ファイルの場合、パスはルートパッケージ (絶対パスで指定されたパッケージ名の先頭パッケージ) を含むディレクトリ名で終わります。

複数のエントリがある場合は、コロンで区切ります。jdkTool には、java、javac、javadoc などを指定できます。JDK ツールの一覧は、「JDK ツール」 を参照してください。

、、、、、.jar ファイルの場合、パスは .zip または .jar ファイルの名前で終わります。 orz

VistaのUACとの戦いの果て。

とあるプロジェクトでインストーラーでのupdateはあきらめて、バッチでexeをコピーすることになりました。xpではすぐ簡単。ほいさっさ。

しかし。

Vistaではアクセスが拒否されます。色々と調べた結果、Windowsフォルダや、ProgramFilesフォルダは権限の昇格が必要なようです。しかし、PCが使えないユーザを想定しているので、

  1. UACのOFF
  2. 管理者権限での実行

は期待できません。


ネットで調べてみると、マニフェストファイルを作ってやると権限の設定ができるそう。とやってみたのですが、、、あれ?よくよく考えると、権限の昇格はインストーラーに対して行わなければならない。batに対してマニフェストを適応できないみたい。ちなみに書いたマニフェストさらしておきます。

update.bat.manifest



  
   
     
       
         
       
     
   

もうだめだ、、、、、、、、、と思っていたら。

IExpressで簡易インストーラをつくってやれば問題なし!
「この実行プロセスはインストールか?」が分かって、インストールの処理ならば権限がどうやら昇格するようです。IExpressでの実行は見事インストールプロセスと認識してくれたようです。良かった!!!