Javascript 网络音频API频道不是';混音

Javascript 网络音频API频道不是';混音,javascript,audio,web-audio-api,channels,Javascript,Audio,Web Audio Api,Channels,我有一个6频道的AAC文件。如果我直接在浏览器中打开它,我会听到所有6个频道在立体声扬声器上混合播放。如果我通过网络音频API播放,我只能听到左右声道 我正在加载缓冲区,创建AudioBufferSourceNode,将缓冲区分配给它,然后连接到AudioContext的目标 从我的控制台: > buffer.numberOfChannels 6 > source.channelCount 2 > source.channelCountMode "max" > sourc

我有一个6频道的AAC文件。如果我直接在浏览器中打开它,我会听到所有6个频道在立体声扬声器上混合播放。如果我通过网络音频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使用它


我已经创建了一个显示设置的。如果你直接下载文件,你会听到6个频道混合成2个,但如果你在网络音频环境中运行它,你就不会听到了。

你注意到你的JSFIDLE在Firefox中工作正常吗?另一方面,Chrome没有“预期”的效果。我之所以说“预期”,是因为Web音频仍然是一个草案,并非所有支持它的浏览器都可以实现所有功能(仅供参考,请参阅浏览器支持)

我举了一个例子,这个例子应该能满足你的需要。 正如您所怀疑的,您需要按照您提到的W3C规范实现向下混合逻辑。这是通过结合audioprocess事件的方法完成的

代码如下(它本身还没有准备好生产,但您可以从这里获取:):


window.onload=init;
var语境;
var缓冲加载程序;
函数init(){
window.AudioContext=window.AudioContext | | window.webkitadiocontext;
上下文=新的AudioContext();
bufferLoader=新的bufferLoader(
上下文
[
'http://labs.bubblefoundry.com/internet-of-cars/corsproxy.php?url=http://labs.bubblefoundry.com/internet-汽车/声音/51凹痕。m4a'
],
完成装载
);
load();
函数完成加载(bufferList){
var javascriptNode=null;
var source1=context.createBufferSource();
source1.buffer=bufferList[0];
javascriptNode=context.createScriptProcessor(2048,6,2);//audioContext.createScriptProcessor([bufferSize][,NumberOfInputChannel][,NumberOfOutputChannel]);
source1.connect(javascriptNode);
连接(context.destination);
log(javascriptNode);
函数onProcess(e){
var in1=e.inputBuffer.getChannelData(0);//左输入
var in2=e.inputBuffer.getChannelData(1);//右输入
var in3=e.inputBuffer.getChannelData(2);//中心输入
var in4=e.inputBuffer.getChannelData(3);/(?)
var in5=e.inputBuffer.getChannelData(4);//左环绕输入
var in6=e.inputBuffer.getChannelData(5);//右环绕输入
var leftOut=e.outputBuffer.getChannelData(0);//左输出
var rightOut=e.outputBuffer.getChannelData(1);//右输出
for(var i=0;i

我注意到你的第四频道(在我的评论中标记?)似乎很安静。但在这里,我对环绕声的了解可能不够

Web音频API应该满足您的需要。您能在示例中提供JSFIDLE代码吗?+1。发一份文件来,我去看看。谢谢。我添加了一个JSFIDLE。@Florestan06让我知道这是否足够工作。哈,当然我甚至没有想到Chrome还没有向下混合。谢谢你的例子!PS第4频道可能是低音炮。网络音频API确实非常有前途-仍然需要一些工作。玩得开心:)
<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>