如何相交两个音频通道?
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。
- 要反转通道,我们可以使用 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)
什么优势?
- 工作速度更快 (~3x)
- 没有错误(使用 createScriptProcessor 的解决方案会产生一些人工制品)
- 更好的同步(createScriptProcessor 产生一些延迟)
不是混合或合并,我需要交叉通道,例如: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。
- 要反转通道,我们可以使用 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)
什么优势?
- 工作速度更快 (~3x)
- 没有错误(使用 createScriptProcessor 的解决方案会产生一些人工制品)
- 更好的同步(createScriptProcessor 产生一些延迟)