将数字流转换为音频

时间:2018-06-05 14:08:08

标签: html5 audio web-audio

我试图弄清楚如何将(近实时)数字流转换为音频。似乎答案在于使用createOscillator函数创建自定义波形的某处,但我无法弄清楚如何将新数据添加到wave并且无需延迟或稍微延迟播放。我的设置 -

让我们假设一个基于Web套接字的系统正在向我的网页发送新数据。 (目前,我只是使用一个简单的setInterval()来模拟数据的流媒体特性。)现在,让我们假设数据是minmax之间的整数字符串。

帮助和指示赞赏,赞成。

2 个答案:

答案 0 :(得分:0)

如果整数流实际上是PCM数据,则可以通过某种方式将它们转换为float(基于minmax值)。然后创建AudioBuffer并使用AudioBuffergetChannelData()将您的数据复制到copyToChannel()。这可以使用AudioBufferSourceNode播放。

答案 1 :(得分:0)

你可以用这个

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);

一个棘手的问题是确保你向Web Audio API事件循环表示敬意,该事件循环必须永远不会变得饥饿或者被忽略太久,否则你会听到流行音乐和其他声音指示你忽略了它的进给时间...我建议如上所述的缓冲区大小......太大了,你在它提供它和渲染它之间引入一个显着的时间延迟......太短,你可能在音频数据生成和它的消耗之间创建了太热的循环。作为一个学习练习,我写了https://github.com/scottstensland/websockets-streaming-audio,它使用websockets将音频从nodejs服务器传输到浏览器,然后使用Web Audio API将其呈现为音频...它可能会给你一些提示

看起来当前的咒语是使用audioworker,它是在Web Audio API事件循环想要获取时执行的回调... https://developer.mozilla.org/en-US/docs/Web/API/Web_Audio_API#Audio_Workers  ...但是,直到完全融入所有浏览器,我建议你仍然使用https://developer.mozilla.org/en-US/docs/Web/API/ScriptProcessorNode ...特别注意回调onaudioprocess