如何相交两个音频通道?

时间:2018-08-07 18:50:54

标签: javascript web-audio-api

不能混合或合并,我需要交叉通道,例如:L-R

我可以使用createScriptProcessor做到这一点:

let processor = context.createScriptProcessor(512, 2, 1)
processor.onaudioprocess = e => {
  let inputL = e.inputBuffer.getChannelData(0),
      inputR = e.inputBuffer.getChannelData(1),
      output = e.outputBuffer.getChannelData(0),
      len = inputL.length,
      i = 0;
  for (; i < len; i++) {
    output[i] = inputL[i] - inputR[i];
  }
}

这是我想要的,但是...没有 createScriptProcessor ,例如通过createChannelMerger / createChannelSplitter,有没有办法做到这一点?我正在寻找一种更有效的方法。

1 个答案:

答案 0 :(得分:2)

找到了解决方案!

这是

inputLeft - inputRight

相同
inputLeft + inputRightInvert

其中 inputRightInvert 是右声道的反相。

  • 要拆分频道,我们可以使用 createChannelSplitter
  • 要反转频道,我们可以将 createGain value -1
  • 一起使用

结果:

splitter = context.createChannelSplitter(2) 
merger   = context.createChannelMerger(1)

invertRightChannel = context.createGain() 
invertRightChannel.gain.value = -1

input.connect(splitter)

// left channel  
splitter.connect(merger, 0, 0) 
// right invert channel 
splitter.connect(invertRightChannel, 1) 
invertRightChannel.connect(merger, 0, 0)

merger.connect(output)

什么优势?

  • 工作速度更快(〜3倍)
  • 没有错误(使用createScriptProcessor的解决方案会产生一些假象)
  • 更好的同步(createScriptProcessor会产生一些延迟)