如何指定声音的结束时间

时间:2014-03-01 00:37:10

标签: actionscript-3 flashdevelop

使用Sound.play函数,您可以指定以毫秒为单位的开始时间作为参数之一,以及循环声音的次数。我错过了什么,或者没有办法指定结束时间?例如,如果我想要4秒声音的循环毫秒5-105,是否有办法指定它以105毫秒开始下一个循环?

如果我没有遗漏某些东西,还有其他方法可以解决这个问题吗?

2 个答案:

答案 0 :(得分:0)

Sound类不允许您执行该操作,最好的方法是使用Timer:

var musicTimer:Timer = new Timer(100, 5); // Loop total time(ms), N Loops (+1)
musicTimer.addEventListener(TimerEvent.TIMER, musicTimer_tick);
musicTimer.addEventListener(TimerEvent.TIMER_COMPLETE, musicTimer_complete);
musicTimer.start();

private function musicTimer_complete(e:TimerEvent):void 
{
    // Last loop stop all sounds
    channel.stop();
}

private function musicTimer_tick(e:TimerEvent):void 
{
    // At each loop, stop and (re)start the sound
    channel.stop();
    channel = sound.play(5); // 5 is the loop start time
}

答案 1 :(得分:0)

您可以根据所需的循环设置创建另一个Sound对象。然后,根据源声音调用Sound:extract(),提取声音需要循环的确切值,然后在您调用loadPCMFromByteArray()的目标声音上,然后循环播放该声音。

function loopASound(sound:Sound,startTime:uint,endTime:uint,loops:int):SoundChannel {
    var ba:ByteArray=new ByteArray();
    var startPos:uint=Math.floor(startTime*44.1);
    var endPos:uint=Math.floor(endTime*44.1); 
    // sound rate is always 44100, and positions are expected in milliseconds,
    // as with all the functions of Sound class
    sound.extract(ba,endPos-startPos,startPos); // get raw data
    var ripped:Sound=new Sound();
    ba.position=0;
    ripped.loadPCMFromByteArray(ba,endPos-startPos); // format, stereo and sample rate at defaults
    return ripped.play(0,loops);
}

警告:代码未经测试,只能通过阅读手册来生成。此外,您可能还希望将ripped声音存储在某处,因此如果您计划多次循环同一段,则不会一直进行翻录。