【发布时间】:2020-05-29 23:01:07
【问题描述】:
我正在尝试使用 AnalyserNode.getFloatFrequencyData() 使用 Web 音频 API 获取麦克风输入的音量。
规范声明“数组中的每个项目代表特定频率的分贝值”,但它只返回负值,尽管它们看起来确实对声音级别做出反应 - 哨声将返回大约-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;
}
【问题讨论】:
-
我也遇到了同样的问题,我想知道这些值是否由于某种原因全部向下移动,也许你可以将它们全部向上移动最低值,对我来说,沉默似乎已经解决了-891.048828125 处的值。