#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. Таким образом, вы можете сохранить текущую воспроизводимую песню в памяти в виде кэша, и если пользователь снова воспроизведет ту же песню, вы сможете воспроизвести ее непосредственно из памяти, вместо того, чтобы снова создавать буфер, я надеюсь, что тогда не будет задержки для той же песни в очереди.