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