我有一个 Vue JS 应用程序,在其中播放来自 Websocket 连接的音频流。音频流以块的形式连续传入,因此我实现了一个逻辑来播放队列中传入的块。在 Chrome 浏览器中一切正常,但不幸的是在 Safari 中却崩溃了。我对此做了很多研究,但我无法找到解决这个问题的方法。
这是我的代码
vm.socket = new WebSocket('wss://my_website.com');
//required to receive data in array buffer type. If not mentioned I get Blob's
vm.socket.binaryType = 'arraybuffer'
vm.socket.addEventListener("message", (event) => {
const audioData = new Uint8Array(event.data);
this.audioQueue.push(audioData);
if (!this.isPlaying) {
this.playNextChunk();
}
});
//Main method which is responsible to process incoming audio chunks
async playNextChunk() {
if (this.audioQueue.length === 0) {
this.isPlaying = false;
return;
}
this.isPlaying = true;
const audioData = this.audioQueue.shift();
try {
//decode audio data (This fails randomly in between in Safari browser)
const audioBuffer = this.audioContext.decodeAudioData(audioData.buffer);
const source = this.audioContext.createBufferSource();
source.buffer = audioBuffer;
source.connect(this.audioContext.destination);
source.onended = this.playNextChunk;
source.start();
} catch (error) {
console.error('Error decoding audio data', error);
}
}
自版本 15 起,Safari 不再支持除 WAV 文件之外的任何文件的解码音频数据。