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

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