Воспроизведение звуковых файлов один за другим в коде flex AIR - PullRequest
0 голосов
/ 22 января 2011

У меня есть набор аудиоклипов, которые должны воспроизводиться один за другим в последовательности с несколькими интервалами времени между ними. В моем случае это вопрос - за ним следует набор из четырех вариантов.

Когда я пишу приведенный ниже код, все файлы Audop начинаются вместе. Как у меня может быть задержка во времени между тем, чтобы второй клип воспроизводился только после того, как первый закончился, а третий начинает играть, только когда второй вариант закончен.

Я использую Flex AIR AS 3. См. Код ниже. Заранее спасибо.

    private function playCoundClips(): void
    {
            //set audio clips

            var questionClipSource : String = "assets/quiz_voiceovers/" + questionCode + "Q.mp3";

            var optionAClipSource : String = "assets/quiz_voiceovers/" + questionCode + "a.mp3";
            var optionBClipSource : String = "assets/quiz_voiceovers/" + questionCode + "b.mp3";
            var optionCClipSource : String = "assets/quiz_voiceovers/" + questionCode + "c.mp3";
            var optionDClipSource : String = "assets/quiz_voiceovers/" + questionCode + "d.mp3";

            playThisClip(questionClipSource);

            playThisClip(optionAClipSource);
            playThisClip(optionBClipSource);

            playThisClip(optionCClipSource);
            playThisClip(optionDClipSource);

    } 


    private function playThisClip(clipPath : String) : void
    {
        try
        {
            clipPlayingNow = true;
            var soundReq:URLRequest = new URLRequest(clipPath); 
            var sound:Sound = new Sound(); 
            var soundControl:SoundChannel = new SoundChannel(); 

            sound.load(soundReq); 
            soundControl = sound.play(0, 0);
        }
        catch(err: Error)
        {
            Alert.show(err.getStackTrace());
        }
    }

Спасибо Sumit

Ответы [ 3 ]

0 голосов
/ 22 января 2011

Это помогло мне http://livedocs.adobe.com/flex/3/html/help.html?content=Working_with_Sound_09.html

Нужно написать код для:


sound.addEventListener(Event.ENTER_FRAME, onEnterFrame);
soundControl.addEventListener(Event.SOUND_COMPLETE, onPlaybackComplete);

private function onEnterFrame(event:Event):void
{
var estimatedLength:int =       
    Math.ceil(sound.length / (sound.bytesLoaded / sound.bytesTotal));

var playbackPercent:uint = 
    Math.round(100 * (soundControl.position / estimatedLength));

}

private function onPlaybackComplete(event:Event):void 
{
    Alert.show("Hello!");
}

0 голосов
/ 22 января 2011

Задержка , очень плохая идея (в 99% случаев).Посмотрите на событие SOUND_COMPLETE (см. doc ). Это событие запускается, когда прекращается воспроизведение звука.Таким образом, теперь очень легко воспроизводить звуки в последовательности.Простой пример (не проверенный, но идея здесь):

//declare somewhere a list of sounds to play
var sounds:Array=["sound_a.mp3","sound_a.mp3"];//sounds paths

//this function will play all sounds in the sounds parameter
function playSounds(sounds:Array):void{
  if(!sounds || sounds.length==0){
     //no more sound to play
     //you could dispatch an event here
     return;
  }
  var sound:Sound=new Sound();
  sound.load(new URLRequest(sounds.pop()));
  var soundChannel:SoundChannel = sound.play();
  soundChannel.addEVentListener(Event.SOUND_COMPLETE,function():void{
     soundChannel.removeEventListener(Event.SOUND_COMPLETE,arguments.callee);   
     playSounds(sounds);
  });
}
0 голосов
/ 22 января 2011

Проблема в том, что вы порождаете несколько асинхронных вызовов. Реализуйте полную функцию обратного вызова в Sound, а затем вызовите свою функцию playThisClip внутри функции обратного вызова. (Вы можете спать в течение определенного времени перед звонком)

...