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



我想使用网络音频检测特定频率上的音频信号(莫尔斯电码(。我使用分析仪节点的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(或其他识别代码(。

最新更新