2010-12-19 25 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