Воспроизведение аудио без тишины между буферами Аудиоконтекст JS

#javascript #audio #streaming #buffer #web-audio-api

Вопрос:

 let socket = new WebSocket("WebSocket Address");

let AudioContext = window.AudioContext || window.webkitAudioContext;
let audioCtx;

let buffers = [];
let channels = 1;

function init() {
    audioCtx = new AudioContext();
}

function playAudio(buffer) {
    if(!audioCtx) {
        init();
    }

    let frameCount = buffer.length;

    let myArrayBuffer = audioCtx.createBuffer(channels, frameCount, 44100);

    for (let channel = 0; channel < channels; channel  ) {
        let nowBuffering = myArrayBuffer.getChannelData(channel);
        for (let i = 0; i < frameCount; i  ) {
            nowBuffering[i] = buffer[i];
        }
    }

    source = audioCtx.createBufferSource();
    source.buffer = myArrayBuffer;
    source.connect(audioCtx.destination);
    source.start();

    source.onended = () => {
        buffers.shift();
        playAudio(buffers[0]);
    }
}

socket.onmessage = function (event) {
    var arr = event.data.split(" ");
    buffers.push(arr);
    
}
document.querySelector('#start').onclick = () => {
    playAudio(buffers[0]);
}
 

Я написал программу, которая декодирует аудиофайл и отправляет строку аудиобуфера с номером 44100 (от -1 до 1) через сокеты.

В JavaScript я написал этот код, чтобы получить строку, превратить ее в массив и воспроизвести ее. Но когда функция PlaySound вызывается снова, звук исчезает на пару миллисекунд.

Есть ли какой-нибудь способ или идеи, как я могу сделать воспроизведение плавным и без задержек?

Комментарии:

1. Есть ли это отставание и при первом воспроизведении песни ?

2. @PawanBishnoi Да, он отстает при воспроизведении разных файлов и с разных устройств

3. Таким образом, вы можете сохранить текущую воспроизводимую песню в памяти в виде кэша, и если пользователь снова воспроизведет ту же песню, вы сможете воспроизвести ее непосредственно из памяти, вместо того, чтобы снова создавать буфер, я надеюсь, что тогда не будет задержки для той же песни в очереди.