繁体   English   中英

Flex播放一系列声音文件

[英]Flex play a series of sound files

因此,我正在制作一个基于输入播放一系列声音文件的应用。 例如,输入可以是“ Smile Cry Scream”,然后依次播放三个对应的声音。 现在,我播放声音,然后启动计时器,完成后会触发下一个声音,依此类推。 我不使用Timer的delay参数,因为它有一些小问题。是否有更好的方法来做到这一点,尤其是当声音之间的间隔变小时?

您可以在SoundChannel对象上侦听Event.SOUND_COMPLETE事件,以从声音数组中启动新的声音(如果还有更多要启动的声音)。 像这样:

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;
}

工作原理:您以所需的顺序为每个“微笑哭声”或其他声音序列(每个呼叫一个)调用channelASound 然后checkPlay() ,以检查是否有播放以及是否还有其他要播放的内容。 如果我们刚刚播放了一些内容,将会有更多的回放,但是如果当前正在进行回放,则isPlaying将为true,我们将在此返回。 否则,我们将使用_sounds.pop()作为下一个要播放的声音来开始新的播放,将频道分配给_sc ,添加一个侦听器并将_isPlaying设置为true。 如果函数是由侦听器触发的,则event参数不为null,因此我们不会尽快返回,而是从_sc清除旧数据和侦听器,并检查是否有更多回放。 如果没有播放,我们将标志设置为false并清除_sc变量,如果有更多播放,我们将开始播放下一个声音。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM