FLVPlayback(AS3)のハマりメモ ~flvの亡霊と戦うの巻~

10月 19th, 2008 by ipuheke

Flashコンテンツからflvファイルを呼び出して再生する方法としては、Videoクラスを用意して、そこにnetstreamをアタッチしてなんちゃらかんちゃら・・・と、FLVPlaybackクラスのインスタンスのsourceプロパティにflvファイルのURLを設定して再生させる方法の二通りあると思うのですが、前者が圧倒的にややこしくて、後者が圧倒的にお手軽というのが僕の感覚です。で、その後者のFLVPlaybackでハマったのでメモ。

ハマった時のシナリオは以下の通り。

  1. 親swfが子swfをloadしてaddChild(子swf)。
  2. 子swfが外部flvを呼び出してFLVPlaybackに再生。
  3. 親swfが子swfをremoveChildしたときにFLVPlaybackを止める。

でもって、間違えたやり方が、

ActionScript
< view plain text >
  1. //flvplaybackはFLVPlayBackクラスのインスタンスとして
  2.  
  3. //flvファイルの呼び出し&再生開始時
  4. flvplayback.source="******.flv";
  5. flvplayback.play();
  6.  
  7. //子swfがremoveChildされるとき。
  8. addEventListener(Event.REMOVED, function() {
  9.     flvplayback.stop();
  10. });

これで「わーいわーい止まったー」と喜んでいましたが、たまに、子swfをとっくにremoveChildし終わった後で、Flashからflvの音が・・・(汗)。で、小一時間~二時間ほどググっては試し、失敗してはググるを繰り返した結果、わかった回答。

closeVideoPlayer()メソッドを使って、NetStream を閉じる!

これをやらんと、stop()して、さらにremoveされたはずのFLVPlayback(のflv)がどこかで生きていて、音が鳴り続けたりする。これ、Soundクラスのclose()と一緒で、この処理をしないとお化けFlashになってしまいます。
ででで、closeVideoPlayer(index:uint):void を調べると

NetStream を閉じ、index パラメータで指定されたビデオプレーヤーを削除します。閉じたビデオプレーヤーがアクティブまたは可視のビデオプレーヤーである場合は、 FLVPlayback インスタンスでアクティブまたは可視のビデオプレーヤーをインデックス 0 のデフォルトプレーヤーに設定します。デフォルトプレーヤーを閉じることはできません。閉じようとすると、エラーがスローされます。

とのこと。はて?
おお?ということはなんだい?このFLVPlayback インスタンスのactiveVideoPlayerIndexプロパティか visibleVideoPlayerIndexプロパティをとってきて、それをcloseVideoPlayer()の引数にすればいいってかい?という感じで二つのプロパティをtraceすると「0」。で、安直に

flvplayback.closeVideoPlayer(0);

と、やると怒られる。どうも上記引用にある「デフォルトプレーヤーを閉じることはできません」的なエラーが出る。んで、また小一時間調べた結果、ははーん、なるほど。FLVPlaybackっちゅーのは、一つのFLVPlaybackインスタンスに、テレビみたいにいくつもチャンネルみたいなの(正しくはVideoPlayer)を持てるのね。1チャンは”nhk.flv”を、4チャンは”ntv.flv”を・・・みたいな感じで。それがactiveVideoPlayerIndexプロパティと、visibleVideoPlayerIndexプロパティだと。それをsourceの指定時に設定して、必要なくなったら、そのチャンネルをcloseVideoPlayer(番号)しなさいよと。ただしデフォルトの「0番」はcloseできませんよ、最初に指定されてないと「0番」のままよ、ということらしい。

で、結局、

ActionScript
< view plain text >
  1. //flvplaybackはFLVPlayBackクラスのインスタンスとして
  2.  
  3. //flvファイルの呼び出し&再生開始時
  4. flvplayback.activeVideoPlayerIndex=1;
  5. flvplayback.visibleVideoPlayerIndex=1;
  6. flvplayback.source="******.flv";
  7. flvplayback.play();
  8.  
  9. //子swfがremoveChildされるとき。
  10. addEventListener(Event.REMOVED, function() {
  11.     flvplayback.stop();
  12.     flvplayback.closeVideoPlayer(1);
  13. });

としてあげると、flvの亡霊たちは完全にいなくなりました。はひぃー。

Tags: , ,

Comments are closed.