【发布时间】:2016-07-25 02:11:15
【问题描述】:
我在 Web Audio API 的分析器节点上使用 getByteFrequencyData 方法创建了一个 getSpectrum 方法。返回的音频数据数组与音频源的(el 或 Audio() 实例)volume 相关,值介于 0 到 1 之间。
使用音频源的音量,我试图规范化从 getByteFrequencyData 接收的每个值,以便 getSpectrum 的用户在可视化音频数据时不必担心音量。
这是 getSpectrum 的精简版
var audioData = new Uint8Array(analyser.binCount);
var spectrum = [];
analyser.getByteFrequencyData(audioData);
for (var i = 0; i < audioData.length; i++) {
var value = audioData[i];
//Where I'm trying to calculate the value independent of volume
value = ((value / audioEl.volume) / 255);
spectrum.push(value);
}
return spectrum;
W3C spec 引用了用于计算给定 maxDecibels 和 minDecibels 的返回值的公式。根据我的基本理解,我试图对数学进行逆运算,以便得到一个归一化的值,但我无法让它完全正确地工作。我无法使用从 0 到 1 的音量值来完成此操作。
任何煽动将不胜感激!这是该问题的working example。更改音量滑块将说明问题。
2016 年 7 月 22 日更新:感谢 @raymond-toy 的回答,我知道如何将 0 到 1 的音量值转换为分贝。
volumeDB = Math.abs((Math.log(volume)/Math.LN10)*20);
拿到DB后,我把W3C规范中的等式倒过来,
value = ((audioDataValue * volumeDB) / 255) - volumeDB
不幸的是,value 在某种程度上仍然相对于volume 而告终。有人看到我错过了什么吗?
【问题讨论】:
-
您可以通过在
analyser和context.destination之间放置一个GainNode 来解决这个问题。然后你会有一个音量滑块来调整 GainNode 而不是音频的音量。这样,只有在通过您的analyser后才会调整音量。 -
就我的工作而言,我无法控制音量的设置,因此我无法将 GainNode 放在任何设置的前面。这是个好主意。会考虑用于其他项目