AS3 Play & Pause Current (загружен) MP3 (Flash CC)

У меня есть 8 внешних mp3-файлов, которые загружены и будут воспроизводиться последовательно. Я не могу понять, как приостановить воспроизведение mp3 и начать воспроизведение с того места, где оно было приостановлено. У меня был код, который приостанавливал его, но при нажатии кнопки воспроизведения он воспроизводил первый mp3 с самого начала.

var s1:Sound = new Sound(new URLRequest("Audio Files/1.mp3"));
var s2:Sound = new Sound(new URLRequest("Audio Files/2.mp3"));
var s3:Sound = new Sound(new URLRequest("Audio Files/3.mp3"));
var s4:Sound = new Sound(new URLRequest("Audio Files/4.mp3"));
var s5:Sound = new Sound(new URLRequest("Audio Files/5.mp3"));
var s6:Sound = new Sound(new URLRequest("Audio Files/6.mp3"));
var s7:Sound = new Sound(new URLRequest("Audio Files/7.mp3"));
var s8:Sound = new Sound(new URLRequest("Audio Files/8.mp3"));
s1.addEventListener(Event.COMPLETE, doLoadComplete);
s2.addEventListener(Event.COMPLETE, doLoadComplete);
s3.addEventListener(Event.COMPLETE, doLoadComplete);
s4.addEventListener(Event.COMPLETE, doLoadComplete);
s5.addEventListener(Event.COMPLETE, doLoadComplete);
s6.addEventListener(Event.COMPLETE, doLoadComplete);
s7.addEventListener(Event.COMPLETE, doLoadComplete);
s8.addEventListener(Event.COMPLETE, doLoadComplete);

var channel:SoundChannel = new SoundChannel();

channel = s1.play();
channel.addEventListener(Event.SOUND_COMPLETE, doSoundComplete);


function doLoadComplete($evt:Event):void
    {
    trace("Song loaded.");
    }

function doSoundComplete($evt:Event):void
    {
    trace("1 done.");
    channel = s2.play();
    channel.addEventListener(Event.SOUND_COMPLETE, doSoundComplete2)
    }

function doSoundComplete2($evt:Event):void
    {
    trace("2 done.");
    channel = s3.play();
    channel.addEventListener(Event.SOUND_COMPLETE, doSoundComplete3);
    }`

Вот что у меня есть: загружает mp3-файлы и воспроизводит их. Пауза btn работает, но кнопка воспроизведения для возобновления звука выдает ошибку: ReferenceError: Ошибка #1069: свойство 0 не найдено на flash.media.Sound, и значение по умолчанию отсутствует. at mp3sequence_fla:: MainTimeline / playSound () Я предполагаю, что значение текущей или последней позиции неверно.

var myArray:Array=[0,1,2,3,4,5,6,7];
var i:uint=1;
var req:URLRequest = new URLRequest("mp3/"+myArray[i]+".mp3");
var VSound:Sound = new Sound();
var channel:SoundChannel = new SoundChannel();
var lastPosition:Number = 0; //last position of the sound
var curSoundIndex:int = 0;  //var to store the current sound that is playing

VSound.load(req);
channel = VSound.play();

function playSound(e:Event = null) {
    //if no sound channel, load the current sound into it
        channel = VSound[curSoundIndex].play(lastPosition);
        channel.addEventListener(Event.SOUND_COMPLETE, doSoundComplete, false, 0, true);
        lastPosition = channel.position;
    }
    function pauseSound(e:Event = null) {
    if (channel) {
        lastPosition = channel.position;
        channel.stop();
    }
}

function doSoundComplete($evt:Event):void {
    curSoundIndex++;
    if (curSoundIndex >= VSound.length) curSoundIndex = 0;
}

play_btn.addEventListener(MouseEvent.CLICK, playSound);
pause_btn.addEventListener(MouseEvent.CLICK, pauseSound);

2 ответа

Чтобы приостановить звук, вы можете сохранить его положение при его приостановке и использовать эту переменную для воспроизведения из этой позиции.

var s:Sound = new Sound(new URLRequest("Audio Files/1.mp3"));
var channel:SoundChannel = new SoundChannel();
channel = s.play();

var pausePosition:int;
function pause():void {
    soundPosition = channel.position;
    channel.stop();
}
function resume():void {
    channel = s.play(soundPosition);
}

Вы можете хранить position свойство соответствующего SoundChannel, Я добавил немного кода, чтобы сделать все это менее излишним

var curSoundIndex:int = 0;  //var to store the current sound that is playing
var lastPosition:Number = 0; //last position of the sound
var soundChannel:SoundChannel; 
var sounds:Vector.<Sound> = new Vector.<Sound>(); //array of all sounds

loadNextSound();

function loadNextSound(e:Event = null):void {
    //check if all sounds are loaded
    if (sounds.length >= 8) {
        curSoundIndex = 0; //select first sound
        resume(); //start playing
        return;
    }

    //if not, load the next sound and add it to the array/vector
    var sound:Sound = new Sound(new URLRequest("Audio Files/" + (sounds.length + 1) + ".mp3"));
    sounds.push(sound);
    if(sound.bytesLoaded < sound.bytesTotal){ //check if already loaded
        sound.addEventListener(Event.COMPLETE, loadNextSound);
    }else{
        loadNextSound();
    }

}

function pause(e:Event = null) {
    if (soundChannel) {
        lastPosition = soundChannel.position;
        soundChannel.stop();
    }
}

function resume(e:Event = null) {
    //if no sound channel, load the current sound into it
        soundChannel = sounds[curSoundIndex].play(lastPosition);
        soundChannel.addEventListener(Event.SOUND_COMPLETE, doSoundComplete, false, 0, true); //use weak listener to avoid memory leaks
        lastPosition = 0;
    }
}

function doSoundComplete($evt:Event):void {
    curSoundIndex++;
    if (curSoundIndex >= sounds.length) curSoundIndex = 0;
}
Другие вопросы по тегам