使用AnalyserNode和ChannelSplitter获取L / R数据

时间:2015-07-29 10:10:03

标签: javascript html5 web-audio

我整天都被困在这一天。尝试从getUserMedia中分离源并分别显示左右声道。无论我做什么,每个可视化器都卡在单声道中。我正在使用的源是立体声(如果我在windows中听它,它显然是立体声)。复制所需的最低要求。

        navigator.getUserMedia({audio: true}, analyse, function(e) {
                    alert('Error getting audio');
                    console.log(e);
                });
        }

        function analyse(stream){
            window.stream = stream;

            var input = audioContext.createMediaStreamSource(stream);
                splitter = audioContext.createChannelSplitter(2),
                lAnalyser = audioContext.createAnalyser(),
                rAnalyser = audioContext.createAnalyser();
            input.connect(splitter);
            splitter.connect(lAnalyser, 0, 0);
            splitter.connect(rAnalyser, 1, 0);
            var lArray = new Uint8Array(lAnalyser.frequencyBinCount),
                rArray = new Uint8Array(rAnalyser.frequencyBinCount);
            updateAnalyser()
            function updateAnalyser(){
                requestAnimationFrame(updateAnalyser);
                lAnalyser.getByteFrequencyData(lArray);
                rAnalyser.getByteFrequencyData(rArray);
            }
       }

lArray和rArray将是相同的,即使我将左声道或右声道静音。难道我做错了什么?我也尝试过输入> splitter-> leftmerger / rightmerger-> leftanalyser / rightanalyser。

http://www.smartjava.org/content/exploring-html5-web-audio-visualizing-sound 是我能找到的最接近的东西,它是相似的,但它没有使用用户输入并处理音频缓冲区。

1 个答案:

答案 0 :(得分:1)

根据https://code.google.com/p/chromium/issues/detail?id=387737

  

预期会有这种行为。在M37中,我们将音频处理从对等连接移动到getUserMedia,如果没有指定" echoCancellation:false"则默认打开音频处理。在getUserMedia约束中,由于音频处理仅支持单声道,我们必须在传递数据进行处理之前将音频采样到单声道。

     

如果要避免向下采样,请将约束传递给getUserMedia,例如:   var constraints = {audio:{mandatory:{echoCancellation:false,googAudioMirroring:true}}};   getUserMedia(constraints,gotStream,gotStreamFailed);

将约束设置为{audio: { mandatory: { echoCancellation: false}}会停止输入缩混。