Web Audio API是否支持多个输入缓冲区的队列?

时间:2014-05-12 16:54:06

标签: message-queue audio-streaming web-audio

我在浏览器(移动/桌面)中通过网络(通过网络套接字)呈现音频,作为可能无穷无尽的连续音频缓冲区(Float32Array类型数组),并尽量减少播放饥饿的可能性我喜欢在开始音频渲染之前排队多个缓冲区。 Web Audio API是否支持将多个缓冲区(如OpenAL)排队以流式方式顺序呈现的概念?我不是说同时渲染多个缓冲区。在我自己推出之前...

4 个答案:

答案 0 :(得分:1)

这是你需要自己处理的事情。据我所知,没有办法排队多个缓冲区让API自行播放。

您可以使用ScriptProcessorNode来实现自己。

答案 1 :(得分:1)

Web Audio API不支持缓冲区队列。相反,您可以自己连接缓冲区(假设您有缓冲区1和缓冲区2):

var tempBuffer = context.createBuffer(buffer1.numberOfChannels, buffer1.length+buffer2.length, buffer1.sampleRate);
//now we need to concatenate the buffers for each channel
for(var i=0;i<buffer1.numberOfChannels;i++){
    var channel = tempBuffer.getChannelData(i);
    channel.set(buffer1.getChannelData(i), 0); //this puts the data of buffer1 in the channel var, starting at offset 0
    channel.set(buffer2.getChannelData(i), buffer1.length); //this starts at the offset of buffer1.length, so it is exactly placed after buffer1
}
//tempBuffer now contains your 2 buffers concatenated

当你在谈论一个流时,如果你只有一个输入流,那就有点难了。如果你使用scriptProcessor来删除空位,你必须在那里放一些东西或者只是删除沉默,但是然后重新调整的样本会变短并且你会得到空隙。解决方案是scriptProcessor之外的缓冲区。每次scriptProcessor触发时你都可以检查是否有静音,将其切断并将其放在缓冲区外的缓冲区末尾,而不是返回任何内容。然后在该缓冲区中有x秒的音频后播放它。唯一的缺点是每次移除某些东西时x秒的偏移量都会变小,而且它会变得很小,缓冲区变得很小,没有音频可以播放,它可能会饿死。除此之外,我不确定在播放时将音频放入缓冲区。你应该先尝试一下。

答案 2 :(得分:1)

这是一个尖叫媒体源扩展的问题:https://dvcs.w3.org/hg/html-media/raw-file/tip/media-source/media-source.html

它可以在Chrome,IE11和Firefox中使用。

如果您想使用网络音频进行操作,请查看this项目和此other代码。

答案 3 :(得分:0)

我推出了自己的实现...浏览器启动到nodejs服务器的websocket连接,通过向浏览器发送类型化数据缓冲区流来响应...浏览器中的web worker管理所有这样的websocket流量和{{3}这是浏览器端可由Web Audio API事件循环访问...因为事件循环使用此循环缓冲区队列它触发webworker从服务器端请求更多... populates a Transferable Object shared buffer使用nodejs 0.10.x但是现代nodejs中断它it worked when I finished it