您是否注意到您的 JSFiddle 在 Firefox 中运行良好?另一方面,Chrome 不能按“预期”工作。我说的是预期,因为 Web Audio 仍然是一个草案,并非所有功能都可以由所有支持它的浏览器实现(仅供参考,请参阅浏览器支持here)。
我已经举了一个例子,应该可以在这里工作。正如您所怀疑的,您需要按照您提到的 W3C 规范实现下混逻辑。这是通过结合 audioprocess 事件的createScriptProcessor方法完成的。
代码如下(它本身还没有准备好生产,但你可以从这里获取它:)):
<script src="http://www.html5rocks.com/en/tutorials/webaudio/intro/js/buffer-loader.js"></script>
<script type="text/javascript">
window.onload = init;
var context;
var bufferLoader;
function init() {
window.AudioContext = window.AudioContext || window.webkitAudioContext;
context = new AudioContext();
bufferLoader = new BufferLoader(
context,
[
'http://labs.bubblefoundry.com/internet-of-cars/corsproxy.php?url=http://labs.bubblefoundry.com/internet-of-cars/sounds/5_1IDENT.m4a'
],
finishedLoading
);
bufferLoader.load();
function finishedLoading(bufferList) {
var javascriptNode = null;
var source1 = context.createBufferSource();
source1.buffer = bufferList[0];
javascriptNode = context.createScriptProcessor(2048, 6, 2); // audioContext.createScriptProcessor([bufferSize][, numberOfInputChannels][, numberOfOutputChannels]);
source1.connect(javascriptNode);
javascriptNode.connect(context.destination);
console.log(javascriptNode);
function onProcess(e) {
var in1 = e.inputBuffer.getChannelData(0); // Left input
var in2 = e.inputBuffer.getChannelData(1); // Right input
var in3 = e.inputBuffer.getChannelData(2); // Center input
var in4 = e.inputBuffer.getChannelData(3); // (??)
var in5 = e.inputBuffer.getChannelData(4); // Left Surround input
var in6 = e.inputBuffer.getChannelData(5); // Right Surround input
var leftOut = e.outputBuffer.getChannelData(0); // Left output
var rightOut = e.outputBuffer.getChannelData(1); // Right output
for (var i = 0; i < in1.length; i++) {
leftOut[i] = in1[i] + 0.7071 *(in3[i] + in5[i]); // W3C formula for Down Mixing
rightOut[i] = in2[i] + 0.7071 *(in3[i] + in6[i]); // W3C formula for Down Mixing
}
}
source1.start(0);
javascriptNode.onaudioprocess = onProcess;
}
}
</script>
我注意到您的第 4 频道(在我的评论中标记为 ??)似乎保持沉默。但是在这里我对环绕声的了解可能不足。