Web Audio API分析器节点无法使用麦克风输入。

13

修复了Chrome Canary中通过http://code.google.com/p/chromium/issues/detail?id=112367获取麦克风输入的错误。这部分似乎正在工作。我可以将mic输入分配给音频元素,并通过扬声器听到结果。

但是,我想连接一个分析器节点以执行FFT。如果将音频源设置为本地文件,则分析器节点可以正常工作。问题在于当连接到麦克风音频流时,分析器节点仅返回基值,就好像它根本没有音频流一样。(如果您感兴趣,它一遍又一遍地是-100。)

有人知道怎么回事吗?还没有实现吗?这是Chrome的漏洞吗?我在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处理,但在继续之前我想先确认一下。


你检查了整个FFTData数组吗?我注意到你只是在控制台记录第一个元素。AnalyserNode应该能够使用麦克风输入... - Matt Diamond
进程函数进一步将其传递给画布可视化器,所有值都为-100。我正在检查变量作用域,并很快会在Mac上尝试它。真的不知道发生了什么。 - Newmu
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);
}

如果您想要听取实时音频,您可以按照上述注释将分析仪连接到目标(扬声器)。但请注意,可能会出现一些可爱的反馈!


它一直给我超过-100的值。你还记得你遇到的问题是什么吗?谢谢! - jbartolome
这里的重点是麦克风是通过 aCtx.createMediaStreamSource(stream) 创建的。如果使用音频节点来创建它,例如 audio.src = URL.createObjectURL(stream),则无法在音频分析器中返回值。 - dy_
你好!我正在获取所有负频率,但不包括-100。难道不应该也有正值吗? - monisha
@monisha 我也是这样。我得到了这个: Float32Array(1024) [-99.54899597167969, -96.06796264648438, -78.57231140136719, -70.13429260253906,-142.45037841796875, …] 这正确吗? - arun n a

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接