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(或其他识别代码)。
我想使用 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(或其他识别代码)。