Как указать время окончания звука

С помощью функции Sound.play вы можете указать время начала в миллисекундах в качестве одного из аргументов, а также количество циклов воспроизведения звука. Я что-то упустил, или нет способа указать время окончания? Например, если мне нужен цикл в миллисекундах 5-105 из 4-секундного звука, есть ли способ указать его, чтобы следующий цикл начинался через 105 миллисекунд?

Если я ничего не упускаю, есть ли другой способ сделать это?


person Joshua Zollinger    schedule 01.03.2014    source источник


Ответы (2)


Класс Sound не позволяет вам выполнять эту операцию, лучший способ сделать это — использовать таймер:

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
}
person António Almeida    schedule 01.03.2014

Вы можете создать еще один объект 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, чтобы вам не приходилось копировать все время, если вы планируете зацикливать один и тот же сегмент более нескольких раз.

person Vesper    schedule 01.03.2014