2010-12-19 62 views
0

我需要連續播放三首音樂曲目。它不需要再次加載並且在緩存中。 我使用這段代碼。一切工作正常localhost,但只適用於重新啓動服務器上的應用程序。每次重新下載曲目都是錯誤的。如何在AS3中播放音樂曲目?

public function musicOn():void{ 
    if (sndStart == 'true'){ 
    req = new URLRequest("media/" + track + ".mp3"); 
    snd.load(req); 
    channel = snd.play(); 
    channel.addEventListener(Event.SOUND_COMPLETE, onPlaybackComplete); 
    sndStart = 'false'; 
    } else { 
     sndStart = 'true'; 
     } 
} 

public function musicOff():void{ 
    if (snd.length>0){ 
     channel.stop(); 
     snd = new Sound(); 
     channel = new SoundChannel(); 
     sndStart = 'true'; 
      } 
} 

public function onPlaybackComplete(event:Event):void 
      { 
    if (track==3){ 
    track = 1; 
    } else { 
     track++; 
     } 
    sndStart = 'true'; 
    snd = new Sound(); 
    musicOn(); 
} 

我運行這些功能:

if (optObj.music == 'true' && sndStart == 'true'){ 
        musicOn(); 

       } else if (optObj.music == 'false'){ 
        musicOff(); 

       } 

optObj.music - 這是當應用程序啓動時,或者當我調用一個函數更改設置時調用的參數的對象。

回答

5

我不知道我理解你寫的一切,但是這個怎麼樣:

package test 
{ 
import flash.display.MovieClip; 
import flash.events.Event; 
import flash.media.Sound; 
import flash.media.SoundChannel; 
import flash.net.URLRequest; 

public class SoundTest extends MovieClip 
{ 
    private var files : Array = [ "file1.mp3", "file2.mp3", "file3.mp3" ]; 
    private var sounds : Array = []; 
    private var count : int = 0; 
    private var channel : SoundChannel; 


    public function musicOff() : void 
    { 
     if (channel != null) 
     { 
      channel.removeEventListener(Event.SOUND_COMPLETE, onSoundComplete); 
      channel.stop(); 
      channel = null; 
     } 
    } 

    public function musicOn() : void 
    { 
     if (sounds[count] == null) loadSound(); 
     else playLoadedSound(); 
    } 

    private function loadSound() : void 
    { 
     var sound : Sound = new Sound(); 
     sound.addEventListener(Event.COMPLETE, onSoundLoaded); 
     sound.load(new URLRequest(files[count])); 
    } 

    private function playLoadedSound() : void 
    { 
     channel = sounds[count].play(); 
     channel.addEventListener(Event.SOUND_COMPLETE, onSoundComplete); 
    } 

    private function onSoundComplete (ev : Event) : void 
    { 
     channel = null; 
     count++; 
     if (count >= files.length) count = 0; 
     musicOn(); 
    } 

    private function onSoundLoaded (ev : Event) : void 
    { 
     var snd : Sound = ev.target as Sound; 
     sounds.push(snd); 
     channel = snd.play(); 
     channel.addEventListener(Event.SOUND_COMPLETE, onSoundComplete); 
    } 

    public function SoundTest() 
    { 
     musicOn(); 
    } 
} 
} 

(順便說一句,直到它被加載,無法播放聲音這就是爲什麼你的腳本只有重新啓動後,工作。 ,當mp3在瀏覽器緩存中。)

+0

謝謝weltraumpirat 但是同樣的問題。如果我在刷新後調用函數musicOn(),則音樂不會第一次播放,而只會第二次播放。 – Astraport 2010-12-19 18:40:08

+0

那麼你必須有一些其他問題,在你的程序中的其他地方 - 我只是嘗試在我的服務器上完全相同的腳本,並且它工作正常。也許這是按鈕調用方法?或者你是否從上面的腳本中輸入了if(sndStart =='true')?也許你忘了在程序啓動時設置sndStart ='true'? – weltraumpirat 2010-12-19 18:51:50

+0

是的,問題在別處。我使用單獨的窗口設置,將參數傳遞給主應用程序。不知何故,它並不總是通過適當的選擇。現在我會處理。再次感謝。 – Astraport 2010-12-19 19:05:13