我用WebAudioAPI和Dancer.js可视化了一个音频文件。所有功能都很好,但可视化效果看起来非常不同。有人能帮我找出为什么它看起来如此不同吗?
Web-Audio-API代码(fft.php,fft.js)
dancer代码(plugins/dancer.ft.js,js/playerFFT.js,fft.php)
WebAudioAPI的可视化功能位于:http://multimediatechnology.at/~fhs2640/sem6/WebAudio/fft.html
因为《舞者》正在上映http://multimediatechnology.at/~fhs2640/sem6/Dancer/fft.php
不同之处在于如何"找到"频率下的体积。您的代码使用分析器,该分析器获取值并进行一些平滑处理,因此您的图形看起来不错。Dancer使用脚本处理器。每次经过某个样本长度时,脚本处理器都会触发一个回调,并将该样本传递给e.inputBuffer。然后,它只绘制"原始"数据,不应用平滑处理。
var
buffers = [],
channels = e.inputBuffer.numberOfChannels,
resolution = SAMPLE_SIZE / channels,
sum = function (prev, curr) {
return prev[i] + curr[i];
}, i;
for (i = channels; i--;) {
buffers.push(e.inputBuffer.getChannelData(i));
}
for (i = 0; i < resolution; i++) {
this.signal[i] = channels > 1 ? buffers.reduce(sum) / channels : buffers[0][i];
}
this.fft.forward(this.signal);
this.dancer.trigger('update');
这是Dancer用来获取频率下声音强度的代码。
(这可以在adapterWebAudio.js中找到).
因为我们只是使用Web Audio API使用analyser.getByteFrequencyData()
提供的本地频率数据。
另一个通过使用ScriptProcessorNode进行自己的计算,然后当该节点的onaudioprocess
事件触发时,他们从输入缓冲器中获取通道数据,并通过对其执行前向变换将其转换为频域频谱,然后使用快速傅立叶变换算法计算信号的离散傅立叶变换。
idshore的答案部分正确(正在应用平滑),但更大的问题是Web音频代码使用的是getByteFrequencyData而不是getFloatFrequencyData。"字节"版本进行处理以最大化字节的范围-它在0-255字节范围内从minDb扩展到maxDb。