我有一个来自桌面应用程序的传入实时流,通过websocket连接到我的网页。 我将PCM流转换为float 32数组。当我开始跟踪时,我听到了毛刺,所以我创建了一个bufferArray来存储流的一部分,然后再播放它。 我得到的问题是,在创建缓冲区后,我无法将任何块添加到数组中。
这里我从套接字连接接收数据并将其存储在数组中。在开始播放之前,我等待100块。
sock.onmessage = function(e) {
var samples = e.data;
obj = JSON.parse(samples);
stream = stream.concat(obj);
if(j == 1000){
console.log(stream);
playPcm(stream);
}
console.log(j);
j ++;
}
此方法处理音频块
function playPcm(data){
var audio = new Float32Array(data);
var source = context.createBufferSource();
var audioBuffer = context.createBuffer(1, audio.length, 44100);
audioBuffer.getChannelData(0).set(audio);
// console.log(audioBuffer);
source.buffer = audioBuffer;
source.connect(context.destination);
source.start(AudioStart);
AudioStart += audioBuffer.duration;
}
我读到了scriptProcessorNode
,但无法弄清楚如何处理它。现在我几乎陷入困境,因为我对Web Audio API不是很熟悉。
答案 0 :(得分:3)
请勿尝试继续编辑相同的缓冲区 - 您将无法修改播放缓冲区(它有时会在Chrome中运行,但这是一个错误)。您应该将第一组块缓冲到一个缓冲区中,就像现在一样,以获得一些延迟空间,然后当有额外的块进入时,您应该将它们安排为单独的AudioBuffer / BufferSourceNode组合。 (即跟踪您开始播放第一个节目的时间和运行计数,并安排每个连续节点在最后一个节点结束时播放。)