Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/412.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Web音频-动态写入的链接缓冲区_Javascript_Audio_Web Audio Api_Low Latency - Fatal编程技术网

Javascript Web音频-动态写入的链接缓冲区

Javascript Web音频-动态写入的链接缓冲区,javascript,audio,web-audio-api,low-latency,Javascript,Audio,Web Audio Api,Low Latency,这在某种程度上是对我之前的问题的扩展,但我觉得这是一个单独的问题,足以保证有一个新的思路 我基本上是在尝试使用web音频API进行双缓冲,以便以低延迟播放音频。基本思想是我们有两个缓冲区。当另一个播放时,每一个都被写入,它们不断地来回播放以形成连续的音频 前一个线程中的解决方案只要缓冲区大小足够大,就可以很好地工作,但延迟需要一点时间,因为我最终能够使用的最小缓冲区大约有4000个样本长,在我选择的采样率44.1k下,延迟大约为90ms 我从前面的回答中了解到,问题在于使用onended事件,有

这在某种程度上是对我之前的问题的扩展,但我觉得这是一个单独的问题,足以保证有一个新的思路

我基本上是在尝试使用web音频API进行双缓冲,以便以低延迟播放音频。基本思想是我们有两个缓冲区。当另一个播放时,每一个都被写入,它们不断地来回播放以形成连续的音频

前一个线程中的解决方案只要缓冲区大小足够大,就可以很好地工作,但延迟需要一点时间,因为我最终能够使用的最小缓冲区大约有4000个样本长,在我选择的采样率44.1k下,延迟大约为90ms

我从前面的回答中了解到,问题在于使用onended事件,有人建议使用ScriptProcessorNode可能会更好。但是,据我所知,ScriptProcessorNode有自己的特定大小的缓冲区,该缓冲区是内置的,每当节点接收音频时,您都可以访问该缓冲区,并且您可以在构造函数中确定该缓冲区:

var scriptNode=context.createScriptProcessor(4096,2,2);//缓冲区大小、通道输入和通道输出


最初我使用了两个交替源缓冲区。有没有办法从ScriptProcessorNode访问这些缓冲区,或者我需要改变我的方法?

没有,没有办法在scriptprocessor中使用其他缓冲区。今天,您最好的方法是使用脚本处理器并将示例直接写入其中

请注意,按照AudioBuffers的工作方式,您不能保证在以前的方法中不会复制和创建新的缓冲区—您不能同时从audio线程和主线程访问缓冲区


在未来,使用音频工作者会更好一些-这将避免一些线程跳转-但是如果你(例如)从网络源下载缓冲区,你将无法避免复制。(事实上,这并不贵。)如果要生成音频缓冲区,应该在onaudioprocess中生成它。

不过,scriptprocessor不需要一个源作为输入吗?我想我意识到我并不完全清楚它实际上是如何工作的——它是否从源代码接收所有东西,然后按指定的缓冲区大小缓冲并发送出去?如果需要使用buffersourcenode,如何将音频直接写入其中?您可以使用
ScriptProcessorNode
作为源,只需忽略输入缓冲区,只需在输出缓冲区中写入内容即可。这正是@padenot所说的。