首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何停止Web音频脚本处理器并清除缓冲区?

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

Stack Overflow用户
提问于 2013-07-15 15:26:44
回答 1查看 5.1K关注 0票数 6

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

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

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

我有一些类似下面的代码(coffeescript)

代码语言:javascript
复制
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

然后当我想阻止它的时候

代码语言:javascript
复制
stopFunc1: ->
  scriptProcessor.onaudioprocess = null

我还尝试将缓冲区通道数组设置为0,然后将回调设置为null

代码语言:javascript
复制
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

这两种技术都会产生一个循环非常快的音频片段,而不是没有音频。

有没有一种方法可以正确地做到这一点,或者我只是想错了?

非常感谢您的帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-07-16 01:38:13

也许我误解了..。

但是如果你清空了onaudioprocess,它不会立即停止播放,除非你碰巧在当前缓冲区的末尾找到了它。

假设您的bufferSize是2048年,并且您碰巧在当前46ms的缓冲区持续时间( 2048 / 44100 * 1000)中途将onaudioprocess置为空。你仍然会有另外23ms的音频,这些音频在你清除之前已经被你的ScriptProcessor处理过了。

最好的办法可能是在路径中抛出一个增益节点,并按需将其静音。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17648819

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档