【问题标题】:Web Audio API channels aren't down-mixedWeb 音频 API 通道没有下混
【发布时间】:2014-05-27 03:52:12
【问题描述】:

我有一个包含 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 使用它的down-mixing logic

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

【问题讨论】:

  • Web 音频 API 应该可以满足您的需求。您能否在示例中提供代码的 jsfiddle ?
  • +1。发个文件,我去看看。
  • 谢谢。我添加了一个 jsFiddle。
  • @Florestan06 让我知道这是否足以工作。

标签: javascript audio web-audio-api channels


【解决方案1】:

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

【讨论】:

  • 哈,我当然没想到 Chrome 还没有缩混功能。谢谢你的例子!
  • PS Channel 4 可能是低音炮。
  • Web Audio API 确实很有前途 - 仍然需要一些工作。玩得开心:)
猜你喜欢
  • 2018-07-10
  • 2023-03-30
  • 2023-04-06
  • 2011-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-20
  • 2011-03-28
相关资源
最近更新 更多