API веб-аудио: как воспроизвести поток фрагментов MP3

Итак, я пытаюсь использовать Web Audio API для декодирования и воспроизведения фрагментов файлов MP3, передаваемых в браузер, с помощью Node.js и Socket.IO.

Мой вопрос - это мой единственный способ создать новый AudioBufferSourceNode для каждого фрагмента, полученного из полученных аудиоданных, или можно создать один AudioBufferSourceNode для всех фрагментов и просто добавить новые аудиоданные в конец источника node buffer?

В настоящее время я получаю мои фрагменты MP3, декодирование и планирование их для воспроизведения. Я уже подтвердил, что каждый полученный бит является "допустимым фрагментом MP3" и успешно декодируется Web Audio API.

audioContext = new AudioContext();
startTime = 0;

socket.on('chunk_received', function(chunk) {
    audioContext.decodeAudioData(toArrayBuffer(data.audio), function(buffer) {
        var source = audioContext.createBufferSource();
        source.buffer = buffer;
        source.connect(audioContext.destination);

        source.start(startTime);
        startTime += buffer.duration;
    });
});

Приветствуются любые советы или понимание того, как лучше всего "обновлять" воспроизведение аудио API Web с помощью новых аудиоданных.

Ответ 1

Нет, вы не можете повторно использовать AudioBufferSourceNode, и вы не можете push на AudioBuffer. Их длины неизменны.

В этой статье (http://www.html5rocks.com/en/tutorials/audio/scheduling/) есть хорошая информация о планировании с помощью API веб-аудио. Но вы на правильном пути.

Ответ 2

Я вижу как минимум 2 возможных подхода.

  • Настройка scriptProcessorNode, которая будет подавать очередь принятых и декодированных данных в поток веб-аудио в реальном времени.

  • Использование свойства audioBufferSource.loop - обновление содержимого audioBuffers в зависимости от времени звучания.

Оба подхода реализованы в https://github.com/audio-lab/web-audio-stream. Вы можете технически использовать это для передачи полученных данных в веб-аудио.