我有一首歌被切成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);
}
答案 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成为任何声音相关应用的过时技术。