boo*_*ans 5 html javascript audio websocket web-audio-api
我有一个来自桌面应用程序的传入实时流,通过 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 ++;
}
Run Code Online (Sandbox Code Playgroud)
该方法处理音频块
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;
}
Run Code Online (Sandbox Code Playgroud)
我读到了有关 的内容scriptProcessorNode,但不知道如何处理它。现在我几乎陷入困境,因为我对 Web Audio API 不太熟悉。
不要尝试继续编辑相同的缓冲区 - 您将无法修改播放缓冲区(现在有时在 Chrome 中可以工作,但这是一个错误)。您应该将第一组块缓冲到一个缓冲区中,就像您现在所做的那样以获得一些延迟空间,然后当其他块进入时,您应该将它们安排为单独的 AudioBuffer/BufferSourceNode 组合。(即跟踪您开始播放第一个节点的时间和运行计数,并安排每个连续节点在最后一个节点结束时播放。)