6

切断せずに 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

どちらの手法でも、オーディオがない代わりに、非常に高速にループするオーディオのスライスが生成されます。

これを正しく行う方法はありますか、それとも間違っていると考えていますか?

どんな助けでも大歓迎です。

4

1 に答える 1

4

勘違いしてるのかも…

しかし、null アウトしてonaudioprocessも、現在のバッファーの最後でたまたまヒットしない限り、すぐに再生が停止することはありません。

あなたbufferSizeが 2048 でonaudioprocess、現在の 46 ミリ秒 (2048 / 44100 * 1000) のバッファー期間の途中で null になったとしましょう。ScriptProcessor ヌルにする前にすでに処理された別の 23 ミリ秒のオーディオがまだ残っています。

最善の策は、おそらくゲイン ノードをパスに投入し、オンデマンドでミュートすることです。

于 2013-07-15T17:38:12.817 に答える