2010-11-25 12 views
0

このコードは、私のf4vファイルの再生が途中で止まる原因となります。時間は変わりますが、約8-10秒で変化します。機能を使用しているときに奇妙なNetStreamの問題

loadSong(); 

    function loadSong() 
    { 
     if(!songPlaying) 
     { 
      songPlaying = true; 
      var customClient:Object = new Object(); 
      customClient.onCuePoint = cuePointHandler; 
      customClient.onMetaData = metaDataHandler; 

      var nc:NetConnection = new NetConnection(); 
      nc.connect(null); 
      var ns:NetStream = new NetStream(nc); 
      ns.client = customClient; 
      ns.play("song.f4v"); 
     } 

      trace("HERE"); 

    } 


    function cuePointHandler(infoObject:Object):void{ 
    trace(infoObject.name); 
    } 
    function metaDataHandler(infoObject:Object):void { 
    trace("metaData"); 
    } 

このコードはf4vの再生を最後まで行います。 WTF !?それは私が関数を介して呼び出すとき、問題を引き起こすようです。 FYIコードはメインタイムラインの最初のフレームに格納され、F4vはオーディオのみです。どんな助けもありがとう。

何が起こっている
if(!songPlaying) 
{ 
    songPlaying = true; 
    var customClient:Object = new Object(); 
    customClient.onCuePoint = cuePointHandler; 
    customClient.onMetaData = metaDataHandler; 

    var nc:NetConnection = new NetConnection(); 
    nc.connect(null); 
    var ns:NetStream = new NetStream(nc); 
    ns.client = customClient; 
    ns.play("song.f4v"); 
} 

答えて

3

、あなたが関数内であなたのNetConectionNetStreamを宣言し、その変数のスコープは、その関数に対してローカルであるということです。つまり、あなたが作成したNetConnectionを参照している人は誰もいないので、ガベージコレクタは次の実行中にそれを掃引します(そのため、可変時間が表示されます)。

ifステートメントで宣言すると、変数はムービーのスコープ内にあり、変数への参照を保持するため、ガーベジコレクションされません。

残りのコードのアーキテクチャはわかりませんが、コードを保持する関数を使用する場合は、loadSong();ステートメントの直前にvar nc:NetConnection = new NetConnection();の宣言を入れてみてください。

構造的には、フレームからコードをリファクタリングしたいかもしれませんが、コードのほんの数行であれば、実際には価値がないかもしれません。あなたのプロジェクトに依存します。

ガベージコレクションの詳細については、Understanding garbage collection in Flash Player 9をチェックしてください(これはFlash Player 9と書かれていますが、これも10にも当てはまります)。

+0

マーティネーノは本当にありがとうございました、それはそんなに愚かな間違いです! – Chris