Web音频分析器节点 - 定期运行

时间:2017-04-03 17:51:45

标签: timer signal-processing fft web-audio

我想使用web audio检测特定频率的音频信号(莫尔斯电码)。我使用分析器节点的getFloatFrequencyData函数检索频率数据。

现在问题是:使用setInterval()定期对频率数据进行采样是不够常规的:回调会比预期提前几毫秒或更晚执行。

如何每隔几毫秒定期检索分析仪的频率数据?我更喜欢使用内置分析仪节点的FFT功能而不是手动处理音频数据通过例如Goertzel算法。

问题setInterval()的代码示例:



// Analyse microphone audio frequencies: 
function onStream(stream) {
  let audioCtx = new(window.AudioContext || window.webkitAudioContext)(),
    source = audioCtx.createMediaStreamSource(stream),
    analyser = audioCtx.createAnalyser(),
    fft = new Float32Array(analyser.frequencyBinCount);

  source.connect(analyser);

  // Doesn't execute exactly every 100ms as needed - what to do?
  setInterval(() => {
    analyser.getFloatFrequencyData(fft);
    console.log(performance.now(), fft[0]);
  }, 100);
}

navigator.mediaDevices.getUserMedia({audio: true}).then(onStream);




1 个答案:

答案 0 :(得分:3)

是的,你真的不能使用分析仪。什么时候运行会有太多的不确定性,你无法准确地确定它何时会运行。你现在最好使用ScriptProcessor(最终是AudioWorklet),并自己做FFT(或其他识别代码)。