目标是编写一个函数(根据用户请求触发),该函数返回一个表示麦克风音量(噪声)级别的特定数字,可以是分贝值,也可以是 1-100 范围内的值。
我做了研究,但没有找到我需要的东西。我发现最接近的是下面的代码,但问题是它因为“onaudioprocess”而不断运行。
由于它不会立即开始提供准确的数字,因此我考虑延迟几秒钟,然后将音量作为承诺返回并设置条件以停止该功能。由于某种原因不起作用,它在延迟时间过去之前仍然返回了一个不准确的值(来自前几个值)。
navigator.mediaDevices.getUserMedia({ audio: true, video: false })
.then(function (stream) {
let audioContext = new AudioContext();
let analyser = audioContext.createAnalyser();
let microphone = audioContext.createMediaStreamSource(stream);
let javascriptNode = audioContext.createScriptProcessor(2048, 1, 1);
analyser.smoothingTimeConstant = 0.8;
analyser.fftSize = 1024;
microphone.connect(analyser);
analyser.connect(javascriptNode);
javascriptNode.connect(audioContext.destination);
javascriptNode.onaudioprocess = function () {
var array = new Uint8Array(analyser.frequencyBinCount);
analyser.getByteFrequencyData(array);
var values = 0;
var length = array.length;
for (var i = 0; i < length; i++) {
values += (array[i]);
}
var average = values / length;
console.log(Math.round(average));
return;
}
})
.catch(function (err) {
console.log(err);
});
如果您推荐一个可以将以前的代码转换为我特别需要的代码或任何其他建议的修改(例如使用 AudioWorklet?),我们将不胜感激。