12

Chrome Canary 的http://code.google.com/p/chromium/issues/detail?id=112367阻止获取麦克风输入的错误现已修复。这部分似乎确实有效。我可以将麦克风输入分配给音频元素并通过扬声器听到结果。

但我想连接一个分析器节点以进行 FFT。如果我将音频源设置为本地文件,分析器节点工作正常。问题是当连接到麦克风音频流时,分析器节点只返回基值,就好像它根本没有音频流一样。(如果你好奇的话,它一遍又一遍地是-100。)

有谁知道怎么回事?还没有实施吗?这是铬错误吗?我在 Windows 7 上运行 26.0.1377.0 并启用了 getUserMedia 标志,并通过 python 的 simpleHTTPServer 通过 localhost 提供服务,因此它可以请求权限。

代码:

var aCtx = new webkitAudioContext();
var analyser = aCtx.createAnalyser();
if (navigator.getUserMedia) {
  navigator.getUserMedia({audio: true}, function(stream) {
    // audio.src = "stupid.wav"
    audio.src = window.URL.createObjectURL(stream);
  }, onFailure);
}
$('#audio').on("loadeddata",function(){
    source = aCtx.createMediaElementSource(audio);
    source.connect(analyser);
    analyser.connect(aCtx.destination);
    process();
});

同样,如果我将 audio.src 设置为注释版本,它可以工作,但使用麦克风则不行。过程包含:

FFTData = new Float32Array(analyser.frequencyBinCount);
analyser.getFloatFrequencyData(FFTData);
console.log(FFTData[0]);

我还尝试使用 createMediaStreamSource 并绕过音频元素 - 示例 4 - https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/webrtc-integration.html。也失败了。:(

    if (navigator.getUserMedia) {
        navigator.getUserMedia({audio: true}, function(stream) {
        var microphone = context.createMediaStreamSource(stream);
        microphone.connect(analyser);
        analyser.connect(aCtx.destination);
        process();
    }

我想有可能将 mediasteam 写入缓冲区,然后使用 dsp.js 或其他东西来做 fft,但我想在走这条路之前先检查一下。

4

1 回答 1

9

这是一个变量范围问题。对于第二个示例,我在本地定义麦克风,然后尝试在另一个函数中使用分析器访问其流。为了安心,我刚刚将所有 Web Audio API 节点设为全局。分析器节点开始报告非 -100 值也需要几秒钟。感兴趣的人的工作代码:

// Globals
var aCtx;
var analyser;
var microphone;
if (navigator.getUserMedia) {
    navigator.getUserMedia({audio: true}, function(stream) {
        aCtx = new webkitAudioContext();
        analyser = aCtx.createAnalyser();
        microphone = aCtx.createMediaStreamSource(stream);
        microphone.connect(analyser);
        // analyser.connect(aCtx.destination);
        process();
    });
};
function process(){
    setInterval(function(){
        FFTData = new Float32Array(analyser.frequencyBinCount);
        analyser.getFloatFrequencyData(FFTData);
        console.log(FFTData[0]);
    },10);
}

如果您想听到现场音频,您可以将分析仪连接到目的地(扬声器),如上文所述。不过请注意一些可爱的反馈!

于 2013-01-09T22:34:33.010 回答