3

我有一个带有 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.channelCountModeexplicit

有什么方法可以改变这一点或让 AudioContext 使用它的下混逻辑

我创建了一个简单的 jsFiddle 示例来显示设置。如果您直接下载该文件,您会听到 6 个通道下混成 2 个,但如果您通过 Web Audio Context 运行它则不会。

4

1 回答 1

3

您是否注意到您的 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 频道(在我的评论中标记为 ??)似乎保持沉默。但是在这里我对环绕声的了解可能不足。

于 2014-04-16T09:31:06.860 回答