我试图弄清楚如何将(近实时)数字流转换为音频。似乎答案在于使用createOscillator
函数创建自定义波形的某处,但我无法弄清楚如何将新数据添加到wave并且无需延迟或稍微延迟播放。我的设置 -
setInterval()
来模拟数据的流媒体特性。)现在,让我们假设数据是min
和max
之间的整数字符串。
帮助和指示赞赏,赞成。
答案 0 :(得分:0)
如果整数流实际上是PCM数据,则可以通过某种方式将它们转换为float(基于min
和max
值)。然后创建AudioBuffer
并使用AudioBuffer
或getChannelData()
将您的数据复制到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