Web Audio API: How to play a stream of MP3 chunks

Jonathan Byrne picture Jonathan Byrne · Nov 22, 2013 · Viewed 12.8k times · Source

So I'm trying to use Web Audio API to decode & play MP3 file chunks streamed to the browser using Node.js & Socket.IO.

Is my only option, in this context, to create a new AudioBufferSourceNode for each audio data chunk received or is it possible to create a single AudioBufferSourceNode for all chunks and simply append the new audio data to the end of source node's buffer attribute?

Currently this is how I'm receiving my MP3 chunks, decoding them and scheduling them for playback. I have already verified that each chunk being received is a 'valid MP3 chunk' and is being successfully decoded by the 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;
    });
});

Any advice or insight into how best to 'update' Web Audio API playback with new audio data would be greatly appreciated.

Answer

AnthumChris picture AnthumChris · Mar 20, 2018

Currently, decodeAudioData() requires complete files and cannot provide chunk-based decoding on incomplete files. The next version of the Web Audio API should provide this feature: https://github.com/WebAudio/web-audio-api/issues/337

Meanwhile, I've began writing examples for decoding audio in chunks until the new API version is available.

https://github.com/AnthumChris/fetch-stream-audio