Html 将数字流转换为音频

Html 将数字流转换为音频,html,audio,web-audio-api,Html,Audio,Web Audio Api,我正试图找出如何将数字流(近实时)转换为音频。答案似乎在于使用create振荡器函数创建一个自定义波形,但我不知道如何既向波形添加新数据,又毫不延迟地播放它。我的设置- 让我们想象一下,一个基于web套接字的系统正在向我的网页发送新数据。(目前,我只是使用一个简单的setInterval()来模拟数据流的性质。)现在,让我们假设数据是一个介于min和max之间的整数字符串 非常感谢您的帮助和指针。如果整数流确实是PCM数据,您可以通过某种方式将其转换为浮点值(基于min和max值)。然后创建一个

我正试图找出如何将数字流(近实时)转换为音频。答案似乎在于使用
create振荡器
函数创建一个自定义波形,但我不知道如何既向波形添加新数据,又毫不延迟地播放它。我的设置-

让我们想象一下,一个基于web套接字的系统正在向我的网页发送新数据。(目前,我只是使用一个简单的
setInterval()
来模拟数据流的性质。)现在,让我们假设数据是一个介于
min
max
之间的整数字符串


非常感谢您的帮助和指针。如果整数流确实是PCM数据,您可以通过某种方式将其转换为浮点值(基于
min
max
值)。然后创建一个
AudioBuffer
,并使用
getChannelData()
copyToChannel()
将数据复制到
AudioBuffer
。可以使用
AudioBufferSourceNode

播放此消息。您可以使用此

mynode = audio_context.createScriptProcessor(BUFF_SIZE, num_channels, num_channels);
或者更直接地使用PCM数据点填充缓冲区,如

var node = context.createBufferSource()
  , buffer = context.createBuffer(1, 4096, context.sampleRate)
  , data = buffer.getChannelData(0);

for (var i = 0; i < 4096; i++) { // you replace this with logic to feed your PCM data
 data[i] = Math.random();
}

node.buffer = buffer;
node.loop = true;
node.connect(context.destination);
node.start(0);
var node=context.createBufferSource()
,buffer=context.createBuffer(14096,context.sampleRate)
,data=buffer.getChannelData(0);
对于(var i=0;i<4096;i++){//您可以将其替换为逻辑以提供PCM数据
data[i]=Math.random();
}
node.buffer=缓冲区;
node.loop=true;
连接(context.destination);
node.start(0);
一个棘手的问题是要确保您对Web Audio API事件循环表示敬意,它决不能被饿死或以某种方式被忽略太久,否则您将听到pops和其他声音指示,您忽略了它的馈送时间。。。我建议缓冲区大小如上所述。。。太大,会在馈送和渲染之间引入明显的时间延迟。。。太短,您可能在音频数据生产和消费之间创建了一个太热的循环。。。作为一个学习练习,我编写了一个使用WebSocket将音频从nodejs服务器流到浏览器的程序,然后使用WebAudioAPI将其渲染成音频。。。它可能会给你一些提示

看起来当前的咒语是使用audioworker,这是一个在Web Audio API事件循环想要获得反馈时执行的回调。。。
... 不过,在所有浏览器都完全使用之前,我建议您仍然使用。。。请特别注意AudioProcess的回调

,但这些数字代表什么?如果数字是音量样本,则它们基本上已经是PCM数据。它们不是音量样本。现在,它们只是我正在生成的合成随机整数。在实际实现中,它们可以是来自传感器的读数,可以缩放到我想要的任何范围。例如,我可以从地震仪或fitbit或任何东西上“听到”读数。有点不相干