我有一个包含6个频道的AAC文件。如果我直接在浏览器中打开它,我会听到所有6个频道混音,以便在我的立体声扬声器上播放。如果我通过Web Audio API播放它,我只会听到左右声道。
我正在加载缓冲区,创建一个AudioBufferSourceNode,为其分配缓冲区,然后连接到AudioContext的目的地。
从我的控制台:
> buffer.numberOfChannels
6
> source.channelCount
2
> source.channelCountMode
"max"
> source.channelInterpretation
"speakers"
> context.destination
AudioDestinationNode {maxChannelCount: 2, channelInterpretation: "speakers", channelCountMode: "explicit", channelCount: 2, numberOfOutputs: 0…}
这是我没有听到其他频道的原因,因为destination.channelCountMode
是explicit
吗?
有没有办法改变这个或让AudioContext使用它的down-mixing logic?
我创建了simple jsFiddle example来显示设置。如果您直接下载该文件,您将听到6个频道向下混合为2,但如果您通过网络音频上下文运行则不会。
答案 0 :(得分:3)
您是否注意到您的JSFiddle在Firefox中正常运行?另一方面,Chrome不能像预期的那样工作。我说的是预期,因为Web Audio仍然是草案,并非所有支持它的浏览器都可以实现所有功能(仅供参考浏览器支持here)。
我已经提供了一个应该按照你想要的here工作的例子。 如您所知,您需要按照您提到的W3C规范实施下混合逻辑。这是通过createScriptProcessor方法结合audioprocess事件完成的。
代码如下(它不是生产就绪,但您可以从这里获取:)):
<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(在我的评论中标记为??)似乎是沉默的。但在这里,我对环绕声的了解可能不足。