我正在试图找出一种方法来停止web音频脚本处理器节点的运行,而不断开它的连接。
我最初的想法是将"onaudioprocess“设置为"null”来停止它,但当我这样做时,我听到了一个非常短的音频播放循环。我的猜测是,音频缓冲区没有被清除或其他什么,它重复播放相同的缓冲区。
我尝试了一些额外的技术,比如首先将缓冲通道数组的值全部设置为0,然后将"onaudioprocess“设置为"null",这仍然会产生一个循环的音频片段,而不是静默。
我有一些类似下面的代码(coffeescript)
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我还尝试将缓冲区通道数组设置为0,然后将回调设置为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这两种技术都会产生一个循环非常快的音频片段,而不是没有音频。
有没有一种方法可以正确地做到这一点,或者我只是想错了?
非常感谢您的帮助。
发布于 2013-07-16 01:38:13
也许我误解了..。
但是如果你清空了onaudioprocess,它不会立即停止播放,除非你碰巧在当前缓冲区的末尾找到了它。
假设您的bufferSize是2048年,并且您碰巧在当前46ms的缓冲区持续时间( 2048 / 44100 * 1000)中途将onaudioprocess置为空。你仍然会有另外23ms的音频,这些音频在你清除之前已经被你的ScriptProcessor处理过了。
最好的办法可能是在路径中抛出一个增益节点,并按需将其静音。
https://stackoverflow.com/questions/17648819
复制相似问题