AS3播放音频之间不必要的延迟

时间:2014-08-04 20:55:19

标签: actionscript-3 flash audio delay

我有一首歌被切成4块:介绍,A,B,结尾。我有一个程序播放前奏,然后A两次然后B两次然后再回到A并继续重复AABB直到我按下结束按钮。如果按下结束按钮,则完成当前播放的歌曲片段,播放结束并停止。它的作用就像一个魅力,除了在歌曲之间的过渡中有一个非常明显的,恼人的延迟。如何摆脱延迟并让它在上一首曲目结束后播放歌曲? (我在flash cs6中使用actionscript 3.0,歌曲片段是mp3格式,导入到库中)。 这是程序: https://dl.dropboxusercontent.com/s/6f9w906x9uja683/Loop%20music%20test.swf 这是我正在使用的代码:

import flash.events.MouseEvent;

stop();
//variables
var track_var: Number = 0;
var music_cnl:SoundChannel = new SoundChannel();
var intro_msc:Sound = new intro_mp3();
var a_msc:Sound = new A_mp3();
var b_msc:Sound = new B_mp3();
var outro_msc:Sound = new ending_mp3();
//stopping the movieclips
a_mc.stop();
b_mc.stop();
ending_btn.stop();

//intro
music_cnl = intro_msc.play();
track_var= 1;
intro_mc.gotoAndStop(2);
music_cnl.addEventListener(Event.SOUND_COMPLETE, playnext_fn);
trace("debug:track value set to",track_var);

//track selector
function playnext_fn(event:Event){
    trace("debug:playnext_fn called");
    switch(track_var){
        case 0:
            //stop
            music_cnl.stop();
            intro_mc.gotoAndStop(1);
            a_mc.gotoAndStop(1);
            b_mc.gotoAndStop(1);
            ending_btn.gotoAndStop(1);
            trace("debug:track value set to",track_var);
            ending_btn.removeEventListener(MouseEvent.MOUSE_UP, ending_fn);
        break;
        case 1:
            //first A track
            track_var=2;
            intro_mc.gotoAndStop(1);
            b_mc.gotoAndStop(1);
            a_mc.gotoAndStop(2);
            music_cnl= a_msc.play();
            music_cnl.addEventListener(Event.SOUND_COMPLETE, playnext_fn)
            trace("debug:track value set to",track_var);
        break;
        case 2:
            //second A track
            track_var=3;
            music_cnl= a_msc.play();
            music_cnl.addEventListener(Event.SOUND_COMPLETE, playnext_fn);
            trace("debug:track value set to",track_var);
        break;
        case 3:
            //first B track
            track_var = 4
            a_mc.gotoAndStop(1);
            b_mc.gotoAndStop(2);
            music_cnl= b_msc.play();
            music_cnl.addEventListener(Event.SOUND_COMPLETE, playnext_fn);
            trace("debug:track value set to",track_var);
        break;
        case 4: 
            //second B track
            track_var=1;
            music_cnl= b_msc.play();
            music_cnl.addEventListener(Event.SOUND_COMPLETE, playnext_fn);
            trace("debug:track value set to",track_var);
        break;
        case 5:
            //ending
            a_mc.gotoAndStop(1);
            b_mc.gotoAndStop(1);
            intro_mc.gotoAndStop(1);
            ending_btn.gotoAndStop(2);
            music_cnl=outro_msc.play();
            track_var=0;
            music_cnl.addEventListener(Event.SOUND_COMPLETE, playnext_fn);
            trace("debug:track value set to",track_var);
        break;

    }
}

//ending button
ending_btn.addEventListener(MouseEvent.MOUSE_UP, ending_fn);
function ending_fn(Event:MouseEvent){
    track_var=5;
    ending_btn.gotoAndStop(2)
    trace("debug: ending button pressed|","track value set to",track_var);
}

2 个答案:

答案 0 :(得分:0)

我没有看到您的代码出现问题(除了冗余和错误的语法之外) MAX_BUFFERSIZE,但我认为这看起来像试图解决问题的残余!)

我认为更有可能导致问题的是您的源音频 - 如果它作为MP3导入,或with a bitrate of 48这会导致同步问题。

答案 1 :(得分:-1)

你无法摆脱使用传统Sound对象的延迟,无论是来自库,外部加载,mp3,wav,任何咬合率。 Flash Sound API设计糟糕,播放声音时延迟是不可避免的。

但是在你的情况下,你可能会通过使用SampleEventData并将所有曲目混合在一起来逃避它。初始延迟可以达到1000毫秒,但在您的情况下可能无关紧要,因为声音之间的同步更重要:

http://help.adobe.com/en_US/as3/dev/WSE523B839-C626-4983-B9C0-07CF1A087ED7.html

当以任何方式播放Flash中的声音时,延迟(声音开始播放所需的时间)可以从60ms到400ms,具体取决于系统。推荐的行业标准是30ms,使Flash成为任何声音相关应用的过时技术。

相关问题