Flex播放一系列声音文件

时间:2014-04-03 11:35:20

标签: actionscript-3 flex timer audio

所以我正在制作一个根据输入播放系列声音文件的应用程序。例如,inout可以是“Smile Cry Scream”,然后三个相应的声音将按顺序播放。现在我播放一个声音,然后启动一个计时器,完成后触发下一个声音,依此类推。我没有使用Timer的延迟参数,因为它有点小虫。有没有更好的方法来做到这一点,特别是当声音之间的间隔变小时?

1 个答案:

答案 0 :(得分:1)

如果还有更多要发布的内容,您可以在Event.SOUND_COMPLETE对象上收听SoundChannel事件,从声音数组中发出新声音。像这样:

var _sounds:Vector.<Sound>=new Vector.<Sound>();
var _sc:SoundChannel;
var _isPlaying:Boolean=false;
function channelASound(sound:Sound):void {
    _sounds.push(sound);
    checkPlay();
}
function checkPlay(e:Event=null):void {
    if ((_isPlaying)&&(e==null)) return; // we've been called from channelASound
    // with playback still going
    if (_sc) _sc.removeEventListener(Event.SOUND_COMPLETE,checkPlay);
    // otherwise we need to start another playback. Cleaning up first
    if (_sounds.length==0) {
        // nothing more to play. Not the case if called from channelASound
        _sc=null;
        _isPlaying=false;
        return;
    }
    _sc=_sounds.shift().play();
    _sc.addEventListener(Event.SOUND_COMPLETE,checkPlay);
    _isPlaying=true;
}

这是如何工作的:你为每个&#34;微笑惊魂呐喊&#34;呼叫channelASound或其他声音序列,每个呼叫一个,按照所需的顺序播放。然后调用checkPlay(),以检查是否有播放以及是否还有更多内容可播放。如果我们刚刚输入某个内容,将会有更多播放,但如果当前正在播放,isPlaying将成立,我们将立即返回。否则,我们使用_sounds.pop()作为下一个要播放的声音开始新的播放,将频道指定给_sc,添加听众并将_isPlaying设置为true。如果该函数由侦听器触发,则event参数不为null,因此我们不会尽快返回,而是从_sc清除旧数据和侦听器,并检查是否有更多播放。如果没有播放,我们将flag设置为false并清除_sc变量,如果有更多播放,我们将开始下一个声音。