【问题标题】:Normalize audio data from getByteFrequencyData by volume按音量标准化来自 getByteFrequencyData 的音频数据
【发布时间】: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 而告终。有人看到我错过了什么吗?

【问题讨论】:

  • 您可以通过在analysercontext.destination 之间放置一个GainNode 来解决这个问题。然后你会有一个音量滑块来调整 GainNode 而不是音频的音量。这样,只有在通过您的 analyser 后才会调整音量。
  • 就我的工作而言,我无法控制音量的设置,因此我无法将 GainNode 放在任何设置的前面。这是个好主意。会考虑用于其他项目

标签: javascript web-audio-api


【解决方案1】:

getByteFrequencyData 返回以 dB 为单位的值。您不想将这些值除以 audioE1.volume。您想(不知何故!)将 audioE1.volume 转换为 dB 值,并从 getByteFrequencyData 的值中添加(或减去)该值

如果您先使用getFloatFrequencyData 看看发生了什么,可能会更容易理解。

【讨论】:

  • 这是伟大的第一步。找到了将 0 卷到 1 卷到 DB Math.abs((Math.log(volume)/Math.LN10)*20) 的数学运算。将其插入 w3c 规范的逆方程也不起作用。 value = ((audioDataValue * volumeDB) / 255) - volumeDB; value 仍然以某种方式相对于音量结束。 IDK 我做错了什么。
  • 我认为你最好使用 value = audioDataValue - volumedB。不要除以volumeDB;除以两个 dB 值并没有真正的意义。而且我不明白你为什么要标准化频谱。它不会与 getByteFrequency 一起正常工作,因为随着音量的减少,无论如何你都会失去频谱底部的值。
  • 我明白你在说什么。减法是有道理的,只是不知道它是这样工作的。我假设 audioDataValue 的变化与音量水平成正比。我试试看
【解决方案2】:

显然我是在做傻事。正如@raymond-toy 指出的那样,频谱值隐含地与音量相关。规范化意味着丢失一部分“超出范围”的数据,这不是我的目标。

如果有人好奇,我最后只是将audioDataValue 除以 255,得到一个从 0 到 1 的浮点数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-16
    • 1970-01-01
    • 1970-01-01
    • 2017-07-18
    • 2013-09-19
    • 1970-01-01
    • 2011-02-23
    • 2015-09-12
    相关资源
    最近更新 更多