我使用WebAudioAPI和Dancer.js可视化音频文件。一切运作良好,但可视化看起来非常不同。任何人都可以帮我找出它看起来如此不同的原因吗?
The Web-Audio-API code (fft.php, fft.js)
The dancer code (plugins/dancer.fft.js, js/playerFFT.js, fft.php)
WebAudioAPI的可视化已启用: http://multimediatechnology.at/~fhs32640/sem6/WebAudio/fft.html
舞者正在上演 http://multimediatechnology.at/~fhs32640/sem6/Dancer/fft.php
答案 0 :(得分:1)
不同之处在于如何“找到”频率的音量。您的代码使用分析器,该分析器获取值并进行一些平滑处理,因此您的图表看起来不错。 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)中找到。
答案 1 :(得分:1)
因为一个人只是使用{4}}来使用Web Audio API提供的本机频率数据。
另一个人使用analyser.getByteFrequencyData()
进行自己的计算,然后当该节点的onaudioprocess
事件触发时,ScriptProcessorNode执行they take the channel data from the input buffer and convert that to a frequency domain spectra然后forward transform on it
答案 2 :(得分:0)
idbehold的答案部分正确(平滑正在应用),但更大的问题是Web Audio代码使用的是getByteFrequencyData而不是getFloatFrequencyData。 “byte”版本进行处理以最大化字节的范围 - 它在0-255字节范围内将minDb扩展到maxDb。