2011-01-28 8 views
1

が、私はここで少し音流スクリプトを持ってロードを停止し、時にはあなたは次のトラックにプレー押すと、現在は次のトラックをロード行っている前にしないのcomepleteロードサウンドストリームが

package player { 
    import flash.events.Event; 
    import flash.display.Sprite; 
    import flash.external.ExternalInterface; 
    import flash.media.Sound; 
    import flash.media.SoundChannel; 
    import flash.net.URLRequest; 

    import player.Loader_bar; 

    public class Stream extends Sprite { 
     private var _Sound = null; 
     private var _Channel = null; 

     private var isLoading = false; 

     private var _Loader_bar = null; 
     public var loader_color = null; 
     public var loader_width = 0; 
     public var loader_height = 0; 

     private var i = 0; 

     public function Stream(){ 
      this._Loader_bar = new Loader_bar(); 
      addChild(this._Loader_bar); 
     } 

     public function cnstr(){ 
      this._Loader_bar.color = this.loader_color; 
      this._Loader_bar.w = this.loader_width; 
      this._Loader_bar.h = this.loader_height; 
      this._Loader_bar.cnstr(); 
     } 

     public function play(url){ 
      this.stop(); 
      this.close(); 

      this._Sound = new Sound(); 
      this.isLoading = true; 

      this.addEventListener(Event.ENTER_FRAME, listener_bytesLoaded); 
      this._Sound.addEventListener(Event.COMPLETE, listener_loadedComplete); 

      this._Sound.load(new URLRequest(url)); 
      this._Channel = this._Sound.play(); 
     } 

     public function stop(){ 
      if(this._Channel){ 
       this._Channel.stop(); 
      } 
     } 

     private function close(){ 
      if(this.isLoading){ 
       this._Sound.close(); 
      } 
     } 

     private function listener_loadedComplete(event){ 
      this.close(); 

      this.isLoading = false; 

      this.removeEventListener(Event.ENTER_FRAME, listener_bytesLoaded); 
     } 

     private function listener_bytesLoaded(event){ 
      var float = this._Sound.bytesLoaded/this._Sound.bytesTotal; 
      this._Loader_bar.progress(float); 

      var data = { 
       i : this.i, 
       float : float, 
       loaded : this._Sound.bytesLoaded, 
       total : this._Sound.bytesTotal 
       }; 
      ExternalInterface.call('swf2js', 'tst_progress', data); 
      this.i++; 
     } 
    } 
} 

答えて

1

近いです() :void ストリームを閉じて、データのダウンロードを停止します。

はこれを試してください:がfalseに設定し、をhasLoadedよう

はブール値を作成します。サウンドが正常にロードされると、trueに設定されます。

サウンドを再生するとき、あなたはをテストすることができますが、あなたの遊び()機能でをhasLoaded。以前のサウンドがロードされる前にplay()を呼び出した場合、hasLoadedは偽になります。この場合、this._Sound.close()と呼び出して新しいサウンドを作成して読み込みます。 close()を呼び出す代わりにテストする理由は、ストリームを一時停止した場合は、再度再生するためにストリームをリロードする必要はありません。

ADDITION:適切に報告しない負荷に関する

、あなたの進捗ロジックが誤って設定しています。 this.addEventListener(Event.ENTER_FRAME、listener_bytesLoaded)を交換、リスナーのために

1)輸入flash.events.ProgressEvent

2);:これを試してみてくださいthis._Sound.addEventListener(ProgressEvent.PROGRESS、listener_bytesLoaded)を使用してplay()メソッドで

3)以下にごlistener_bytesLoaded()メソッドに変更します。

private function listener_bytesLoaded(event:ProgressEvent) 
{ 
    var percent = event.bytesLoaded/event.bytesTotal; 
    this._Loader_bar.progress(percent); 

    var data = { 
      i : this.i, 
      float : percent, 
      loaded : event.bytesLoaded, 
      total : event.bytesTotal 
      }; 

     ExternalInterface.call('swf2js', 'tst_progress', data); 
     this.i++; 
    } 

4)変更this.removeEventListener(Event.ENTER_FRAME、listener_bytesLoaded);をあなたのlistener_loadedComplete()メソッドの をthis._Sound.removeEventListener(ProgressEvent.PROGRESS、listener_bytesLoaded)に;そのメソッドからそれを移動し、close()メソッドの条件内に配置します。

注 - 私は実際にこれをコンパイルしませんでしたが、私はその良いと思っています。希望が役立ちます。 :)

+0

ありがとう..今、それは全体のトラックを読み込みます:)しかし、あなたはなぜ、既にロードされたトラックがthis._Sound.bytesLoadedで0を返すのかを教えてください。ロードされていてもローダーのステータスは0%です(chached)。私はコードを更新しました:) – clarkk

+0

上記のコメントにあなたの質問に関する私の回答を編集しました。 – Ribs