【发布时间】:2016-06-18 09:06:06
【问题描述】:
我之前问过一个类似的问题,但它并没有解决我的问题,而且解释得很糟糕。 这次我做了插图,希望能更好地解释。
我的音频播放器有一个简单的频谱分析仪。频率存储在一个数组中,每个requestAnimationFrame 都会更新,数组如下所示:
fbc_array = new Uint8Array(analyser.frequencyBinCount);
analyser.getByteFrequencyData(fbc_array);
Read more about getByteFrequencyData here.
所以这很好用,但是我希望频率在整个频谱中均匀分布。现在它显示的是线性频率:
如您所见,这里的主导频率范围是高音(高端),而最主要的频率范围是低音范围(低端)。我希望我的分析仪呈现均匀分布的频率范围,如下所示:
在这里,您可以看到频率均匀分布在分析仪上。这可能吗?
我用来生成分析器的代码如下所示:
// These variables are dynamically changed, ignore them.
var canbars = 737
var canmultiplier = 8
var canspace = 1
// The analyser
var canvas, ctx, source, context, analyser, fbc_array, bars, bar_x,
bar_width, bar_height;
function audioAnalyserFrame() {
'use strict';
var i;
canvas.width = $('analyser-').width();
canvas.height = $('analyser-').height();
ctx.imageSmoothingEnabled = false;
fbc_array = new Uint8Array(analyser.frequencyBinCount);
analyser.getByteFrequencyData(fbc_array);
ctx.clearRect(0, 0, canvas.width, canvas.height); // Clear the canvas
ctx.fillStyle = "white"; // Color of the bars
bars = canbars;
for (i = 0; i < bars; i += canmultiplier) {
bar_x = i * canspace;
bar_width = 2;
bar_height = -3 - (fbc_array[i] / 2);
ctx.fillRect(bar_x, canvas.height, bar_width, bar_height);
}
window.requestAnimationFrame(audioAnalyserFrame);
}
function audioAnalyserInitialize() {
'use strict';
var analyserElement = document.getElementById('analyzer');
if (analyserElement !== null && audioViewIsCurrent() === true) {
if (analyserInitialized === false) {
context = new AudioContext();
source = context.createMediaElementSource(audioSource);
} else {
analyser.disconnect();
}
analyser = context.createAnalyser();
canvas = analyserElement;
ctx = canvas.getContext('2d');
source.connect(analyser);
analyser.connect(context.destination);
if (analyserInitialized === false) {
audioAnalyserFrame();
}
analyserInitialized = true;
analyser.smoothingTimeConstant = 0.7;
}
}
请注意,我在 for 循环中跳过了 8 个小节(请参阅顶部的 canmultiplier)(如果我不这样做,分析器的另一半会渲染到画布之外,因为它太大了。)我不'不知道这是否也是导致频率范围不一致的原因。
【问题讨论】: