Я пытаюсь получить громкость микрофонного входа с помощью API веб-аудио, используя AnalyserNode.getFloatFrequencyData()
.
spe c утверждает, что «каждый элемент в массиве представляет значение в децибелах для определенной c частоты», но возвращает только отрицательные значения, хотя они выглядят так, как будто они реагируют на уровень звука. - свисток вернет значение около -23 и тишина около -80 (значения в dataArray также все отрицательные, поэтому я не думаю, что это связано с тем, как я их сложил). Тот же код дает значения, которые я ожидал (положительные) с AnalyserNode.getByeFrequencyData()
, но возвращенные значения в децибелах были нормализованы между 0–255, поэтому сложнее сложить для определения общей громкости.
Почему я не получаю ожидаемые значения? И / или это, возможно, не лучший способ получить громкость микрофонного входа в первую очередь?
function getVolume(analyser) {
analyser.fftSize = 32;
let bufferLength = analyser.frequencyBinCount;
let dataArray = new Float32Array(bufferLength);
analyser.getFloatFrequencyData(dataArray);
let totalAntilogAmplitude = 0;
for (let i = 0; i < bufferLength; i++) {
let thisAmp = dataArray[i]; // amplitude of current bin
let thisAmpAntilog = Math.pow(10, (thisAmp / 10)) // antilog amplitude for adding
totalAntilogAmplitude = totalAntilogAmplitude + thisAmpAntilog;
}
let amplitude = 10 * Math.log10(totalAntilogAmplitude);
return amplitude;
}