Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/88.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_Html_Web Audio Api - Fatal编程技术网

Javascript 如何停止Web音频脚本处理器并清除缓冲区?

Javascript 如何停止Web音频脚本处理器并清除缓冲区?,javascript,html,web-audio-api,Javascript,Html,Web Audio Api,我正在试图找到一种方法来停止web音频脚本处理器节点的运行,而不必断开它的连接 我最初的想法是将“onaudioprocess”设置为“null”以停止它,但当我这样做时,我听到一个非常短的音频播放循环。我的猜测是音频缓冲区没有被清除或是其他什么,而是重复播放同一个缓冲区 我尝试了一些额外的技术,比如首先将缓冲通道数组值全部设置为0,然后将“onaudioprocess”设置为“null”,这仍然会产生一个循环的音频片段,而不是静音 我有一些代码如下(coffeescript) 我还尝试将缓冲区

我正在试图找到一种方法来停止web音频脚本处理器节点的运行,而不必断开它的连接

我最初的想法是将“onaudioprocess”设置为“null”以停止它,但当我这样做时,我听到一个非常短的音频播放循环。我的猜测是音频缓冲区没有被清除或是其他什么,而是重复播放同一个缓冲区

我尝试了一些额外的技术,比如首先将缓冲通道数组值全部设置为0,然后将“onaudioprocess”设置为“null”,这仍然会产生一个循环的音频片段,而不是静音

我有一些代码如下(coffeescript) 我还尝试将缓冲区通道数组设置为0,然后将回调设置为null
stopFunc2:->
scriptProcessor.onaudioprocess=(e)->
exputfferl=e.outputBuffer.getChannelData(0)
EXBUFFERR=e.outputBuffer.getChannelData(1)
i=0
而我喜欢你的尺寸
exputfferl[i]=0
脉冲频率[i]=0
我++
scriptProcessor.onaudioprocess=null
返回空
返回空
这两种技术都会产生一段循环速度非常快的音频,而不是没有音频。 有没有办法做到这一点,或者我只是想得不对


非常感谢您的帮助。

也许我误解了

但是,如果您将audioprocess中的
设为空,则它不会立即停止播放,除非您恰好在当前缓冲区的最末端点击它

假设您的
bufferSize
为2048,在当前46毫秒的缓冲区持续时间(2048/44100*1000)的一半时间内,您恰好将
onaudioprocess
调零。您仍将拥有另外23毫秒的音频,这些音频已经由
ScriptProcessor
处理,然后再将其置零


最好的办法可能是在路径中放置一个增益节点,然后按需将其静音。

Yah,这似乎是我遇到的问题。我希望在将回调设置为
null
之前有一种简单的方法来清除缓冲区,但我没有找到。您可以在
audioBufferSourceNode
上调用
stop()
scriptProcessor
并不是真正用来作为启动和停止播放的机制。如果出于某种原因,您必须这样使用它,我想您可以减少
缓冲区大小
,以减少在将
onaudioprocess
调零后的悬垂量。
context = new webkitAudioContext()
scriptProcessor = context.createScriptProcessor()

scriptProcessor.onaudioprocess = (e)->
  outBufferL = e.outputBuffer.getChannelData(0)
  outBufferR = e.outputBuffer.getChannelData(1)
  i = 0
  while i < bufferSize
    outBufferL[i] = randomNoiseFunc()
    outBufferR[i] = randomNoiseFunc()
    i++
  return null
return null
stopFunc1: ->
  scriptProcessor.onaudioprocess = null
stopFunc2: ->
  scriptProcessor.onaudioprocess = (e)->
    outBufferL = e.outputBuffer.getChannelData(0)
    outBufferR = e.outputBuffer.getChannelData(1)
    i = 0
    while i < bufferSize
      outBufferL[i] = 0
      outBufferR[i] = 0
      i++
    scriptProcessor.onaudioprocess = null
    return null
  return null