如何相交两个音频通道?

How to intersect two audio channels?

不是混合或合并,我需要交叉通道,例如: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?我正在寻找更有效的方法。

找到解决方法了!

这是

inputLeft - inputRight

inputLeft + inputRightInvert

其中inputRightInvert是右声道的反转。

  • 要拆分频道,我们可以使用 createChannelSplitter
  • 要反转通道,我们可以使用 createGainvalue -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)

什么优势?

  • 工作速度更快 (~3x)
  • 没有错误(使用 createScriptProcessor 的解决方案会产生一些人工制品)
  • 更好的同步(createScriptProcessor 产生一些延迟)