【问题标题】:How can I stop a Web Audio Script Processor and clear the buffer?如何停止 Web 音频脚本处理器并清除缓冲区?
【发布时间】:2013-07-16 01:38:12
【问题描述】:

我正在尝试找出一种方法来阻止网络音频脚本处理器节点运行,而无需断开它。

我最初的想法是将“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

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

有没有办法正确地做到这一点,还是我只是想错了?

非常感谢任何帮助。

【问题讨论】:

    标签: javascript html web-audio-api


    【解决方案1】:

    也许我误会了……

    但是,如果您将onaudioprocess 设为空,它不会立即停止播放,除非您碰巧在当前缓冲区的末尾点击它。

    假设您的 bufferSize 是 2048,而您恰好在当前缓冲区持续时间 46 毫秒 (2048 / 44100 * 1000) 的中途将 onaudioprocess 置空。您仍将拥有另外 23 毫秒的音频,该音频已由您的 ScriptProcessor您将其取消之前处理过。

    最好的选择可能是在路径中添加一个增益节点,然后按需静音。

    【讨论】:

    • 是的,这似乎是我遇到的问题。在将调用设置回null 之前,我希望有一种简单的方法可以清除缓冲区,但我还没有找到。
    • 好吧,您可以在您的audioBufferSourceNode 上致电stop()scriptProcessor 并不是真正打算用作开始和停止播放的机制。如果由于某种原因必须以这种方式使用它,我想您可以减少 bufferSize 以减少在取消 onaudioprocess 后的悬垂量。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-26
    • 2021-06-23
    • 1970-01-01
    • 2012-06-30
    • 2018-01-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多