该函数用于获取用于可视化的音频频谱数据,它是three.js
的核心API之一。
AudioAnalyser.getFrequencyData();
该函数会返回一个数组,其中包含了当前音频输入的频域数据(DFT),其长度为FFTSize
属性值的一半。
通过实例化音频分析器AudioAnalyser
,我们可以轻松地读取当前输入音频数据的频率信息。
const audioAnalyser = new THREE.AudioAnalyser(audioListener, FFTSize);
// 用于显示频谱数据的mesh对象
const frequencyDataBox = new THREE.Mesh(
new THREE.BoxGeometry(1, 1, 1),
new THREE.MeshBasicMaterial({ color: 'red' })
);
scene.add(frequencyDataBox);
function render() {
requestAnimationFrame(render);
// 获取音频分析器的频域数据
const frequencyData = audioAnalyser.getFrequencyData();
// 更新mesh对象的缩放值
for (let i = 0; i< frequencyData.length; i++) {
// 将频域数据映射到[0,1]区间内
const scaleValue = frequencyData[i]/255;
frequencyDataBox.scale.set(i, scaleValue ,i);
}
renderer.render(scene, camera);
}
render();
该函数不接受任何参数。
我们可以使用three.js
的canvas
绘制API绘制出一个音频的频谱图。
const canvas = document.createElement('canvas');
document.body.appendChild(canvas);
const ctx = canvas.getContext('2d');
const audioContext = new window.AudioContext();
const audioBufferSourceNode = audioContext.createBufferSource();
const audioAnalyser = audioContext.createAnalyser();
const frequencyDataArray = new Uint8Array(audioAnalyser.frequencyBinCount);
// 音频数据获取
fetch('audio.mp3')
.then(res => res.arrayBuffer())
.then(buffer => audioContext.decodeAudioData(buffer))
.then(decodedAudioData => {
audioBufferSourceNode.buffer = decodedAudioData;
audioAnalyser.fftSize = 512;
audioBufferSourceNode.connect(audioAnalyser);
audioAnalyser.connect(audioContext.destination);
audioBufferSourceNode.start();
function update() {
requestAnimationFrame(update);
audioAnalyser.getByteFrequencyData(frequencyDataArray);
draw(frequencyDataArray);
}
update();
});
function draw(frequencyDataArray) {
const w = canvas.width;
const h = canvas.height;
const barWidth = w / frequencyDataArray.length;
ctx.clearRect(0, 0, w, h);
frequencyDataArray.forEach((value, index) => {
const x = index * barWidth;
const y = h - value * 0.5;
ctx.fillRect(x, y, barWidth, h - y);
});
}
AudioAnalyser
实例的FFTSize
属性值。FFTSize
表示DFT(离散傅里叶变换)所采用的样本数量,其默认值为2048
。