【问题标题】:How to play music tracks in AS3?如何在 AS3 中播放音乐曲目?
【发布时间】:2018-03-25 20:19:06
【问题描述】:

我需要依次播放三首音乐曲目。有必要不要再次加载它并且在缓存中。 我使用这个代码。在 localhost 上一切正常,但只有在服务器上重新启动应用程序后才能正常工作。而且每次都重新下载曲目是错误的。

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 - 当应用程序启动或调用函数更改设置时,它是具有参数的对象。

【问题讨论】:

    标签: flash actionscript-3


    【解决方案1】:

    我不确定我是否理解你写的所有内容,但是这个怎么样:

    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 位于浏览器缓存中。)

    【讨论】:

    • 谢谢weltraumpirat 但同样的问题。如果我在刷新后调用函数musicOn(),音乐第一次不播放,而只播放第二次。
    • 那么你一定有其他问题,在你的程序的其他地方 - 我刚刚在我的服务器上尝试了完全相同的脚本,它工作正常。也许是调用该方法的按钮?或者您是否从上面的脚本中输入了 if (sndStart == 'true') ?也许您忘记在程序启动时设置 sndStart = 'true'?
    • 是的,问题出在其他地方。我使用单独的窗口设置,将参数传递给主应用程序。不知何故,它并不总是通过正确的选择。现在我来处理。再次感谢。
    猜你喜欢
    • 1970-01-01
    • 2016-01-13
    • 1970-01-01
    • 1970-01-01
    • 2012-10-20
    • 2012-05-17
    • 1970-01-01
    • 2017-02-05
    • 1970-01-01
    相关资源
    最近更新 更多