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

Web audio analyser node - run at regular interval

我想使用 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);

是的,您不能真正使用分析仪。它什么时候会 运行 存在太多不确定性,你不能准确地保证它什么时候会 运行。您最好暂时使用 ScriptProcessor(最终使用 AudioWorklet),然后自己执行 FFT(或其他识别代码)。