按音量规范化getByteFrequencyData中的音频数据
Normalize audio data from getByteFrequencyData by volume
我已经在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规范引用了用于计算给定maxDecibels和minDecibels的返回值的公式。根据我的初步理解,我试图对数学进行逆运算,这样我就得到了一个归一化的值,但我无法使它完全正确。我很难用从0到1的音量值来实现这一点。
任何煽动都将不胜感激!以下是该问题的一个工作示例。更改音量滑块可以说明问题。
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
结束。有人看到我缺了什么吗?
getByteFrequencyData
返回以dB为单位的值。你不想用audioE1.volume除以这些值。你想(以某种方式!)将audioE1.volume转换为dB值,并将其从getByteFrequencyData
的值中相加(或相减)
如果您先使用getFloatFrequencyData
来了解发生了什么,可能会更容易理解。
显然我是在做傻事。正如@raymond toy所指出的,Spectrum值隐含地相对于体积。规范化将意味着丢失"光谱底部"的一部分数据,这不是我的目标。
如果有人好奇的话,我最终只是将audioDataValue
除以255,得到了从0到1的浮点值。
- 如何通过给定的url获取youtube音频数据
- 是否可以将音频存储为javascript/jQuery中的blob数据
- 使用Cordova和JavaScript(无需getUserMedia)从android麦克风获取音频数据
- speex拆分音频数据-WebAudio-VOIP
- 使用$resource发送音频数据(base64)
- 当音频元素暂停时,AnalyserNode会继续发送数据
- 如何将 base64 音频数据解码为 WAV 格式
- 为解码音频数据(WebAudio API)定义“有效的mp3块”
- 如何将音频数据数组转换为wav文件
- 在HTML页面中显示音频数据
- 如何在HTML5-音频/Mozilla音频数据API中进行平移
- 如何使用AudioContext HTML5从麦克风获取音频数据
- JavaScript Web音频:无法正确解码音频数据
- 从麦克风获取音频数据作为数组
- 将音频数据uri字符串转换为文件
- 将音频数据从JS发送到Python
- Javascript mp3音频数据
- Flash -将音频数据ByteArray传递给javascript
- 按音量规范化getByteFrequencyData中的音频数据
- 如何在 Web 中播放来自 Android 的原始样本PCM_16音频数据记录(使用网络音频或其他)