@beta-it

Как воспроизвести аудиофайлы из массива последовательно?

Алгоритм работы такой:
1. на стороне сервера генерирую mp3 файлы,
2. на клиент через ajax возвращаю массив ссылку на файл и его длину в секундах,
3. записываю их в массив js.

После этого в том же интервале что и вывожу массив пытаюсь проигрывать файлы из массива js последовательно, и удалить проигравший файл из массива, но вот здесь ни чего не получается, а может я вообще не в нужном направлении иду?

Вопрос в том как можно воспроизвести файлы последовательно без одновременного запуска?

var mp3List = [];

function show() {
    $.ajax({
        url: "/monitor/index",
        dataType: 'json',
        timeout: 2000,
        error: function () {
            console.log('error')
        },
        success: function (data) {
            if (data.data.audio.length != 0)
                mp3List.push(data.data.audio[0]);
        }
    });
}

function voise(list){
    if (list.length != 0) {
        var audio = new Audio(list[0]['name']);
        audio.play();
        setTimeout(function () {
            list.slice(0,1);
        }, list[0]['time']*1000);
    } else {
        console.log('Пустой лист с аудио');
    }
}

$(document).ready(function () {

    setInterval(function () {
        show();
        //console.log(mp3List);
        voise(mp3List);
    }, 4000);

});
  • Вопрос задан
  • 773 просмотра
Решения вопроса 1
Вопрос в том как можно воспроизвести файлы последовательно без одновременного запуска?

У аудио-элемента есть событие «onended»

function play(list) {
    let audioElements = []
    
    for (let i = 0; i < list.length; i++) {
        var audio = new Audio(list[i]['name'])
        audioElements.push(audio)

        if (i === 0) {
            // Первое аудио запускаем
            audioElements[i].play()
        } else {
            // Остальные — после окончания предыдущего
            audioElements[i - 1].addEventListener('ended', function() {
                audioElements[i].play()

                list = list.slice(1)
            })
        }
    }
}


С асинхронными функциями в es7 можно как-нибудь так реализовать
async function voise(list) {
    for (let i = 0; i < list.length; i++) {
        const audio = new Audio(list[i]['name'])
        // Запускаем аудио и ждём, когда закончится
        await playAudio(audio)
    }
}

async function playAudio(audio) {
    audio.play()

    await new Promise((reject, resolve) => {
        audio.addEventListener('ended', () => {
            resolve()
        })

        audio.addEventListener('error', () => {
            reject()
        })
    })
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы