FLVPlayback(AS3)のハマりメモ ~flvの亡霊と戦うの巻~
2008 年 10月 19 日Flashコンテンツからflvファイルを呼び出して再生する方法としては、Videoクラスを用意して、そこにnetstreamをアタッチしてなんちゃらかんちゃら・・・と、FLVPlaybackクラスのインスタンスのsourceプロパティにflvファイルのURLを設定して再生させる方法の二通りあると思うのですが、前者が圧倒的にややこしくて、後者が圧倒的にお手軽というのが僕の感覚です。で、その後者のFLVPlaybackでハマったのでメモ。
ハマった時のシナリオは以下の通り。
- 親swfが子swfをloadしてaddChild(子swf)。
- 子swfが外部flvを呼び出してFLVPlaybackに再生。
- 親swfが子swfをremoveChildしたときにFLVPlaybackを止める。
でもって、間違えたやり方が、
-
//flvplaybackはFLVPlayBackクラスのインスタンスとして
-
-
//flvファイルの呼び出し&再生開始時
-
flvplayback.source="******.flv";
-
flvplayback.play();
-
-
//子swfがremoveChildされるとき。
-
addEventListener(Event.REMOVED, function() {
-
flvplayback.stop();
-
});
これで「わーいわーい止まったー」と喜んでいましたが、たまに、子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番」のままよ、ということらしい。
で、結局、
-
//flvplaybackはFLVPlayBackクラスのインスタンスとして
-
-
//flvファイルの呼び出し&再生開始時
-
flvplayback.activeVideoPlayerIndex=1;
-
flvplayback.visibleVideoPlayerIndex=1;
-
flvplayback.source="******.flv";
-
flvplayback.play();
-
-
//子swfがremoveChildされるとき。
-
addEventListener(Event.REMOVED, function() {
-
flvplayback.stop();
-
flvplayback.closeVideoPlayer(1);
-
});
としてあげると、flvの亡霊たちは完全にいなくなりました。はひぃー。
Tags: flv, FLVPlayback, つまづいた
