音频处理
约 1824 字大约 6 分钟
2025-04-07
在 Three.js 中允许在场景中添加声音,将声音与 3D 对象关联,实现更丰富的交互体验。
Audio
Three.js 中的Audio
对象用于表示音频源,它是一个THREE.Object3D
的子类,用于控制音频播放、暂停、是否循环等设置的对象,可以添加到场景中,并与其他 3D 对象关联。它依赖于 Web Audio API,因此需要浏览器支持。
const audio = new THREE.Audio(listener);
实例化构造函数,接收一个必选的音频监听器参数,用于接收和处理音频信号。
属性:
isPlaying
:布尔值,表示音频是否正在播放。hasPlaybackControl
:布尔值,表示音频是否具有播放控制权。playbackRate
:浮点数,表示音频播放速度,默认值为 1.0。offset
:浮点数,表示音频播放的起始位置,默认值为 0.0。duration
:浮点数,获取音频的时长,但是不是在 Audio 上,而是使用 buffer 的 duration 属性。autoplay
:布尔值,是否自动播放音频。context
:音频上下文,构造函数中传入 listener 的 AudioContext.。detune
:整数,修改音高,以音分为单位。 +/- 100 为一个半音, +/- 1200 为一个八度。默认值为 0。gain
:AudioGainNode,用于控制音频的音量。source
:Audio 对象的 source,属性属于底层的 Web Audio API。通过 source 可以控制音频的播放、暂停、循环等。
方法:
connect(destination)
:将音频连接到目标节点。disconnect(destination)
:将音频从目标节点断开连接。getVolume()
:获取音量。play()
:播放音频。pause()
:暂停音频。stop()
:停止音频。setLoop(loop)
:设置音频是否循环播放。setVolume(volume)
:设置音量。setBuffer(buffer)
:设置音频缓冲区。onEnded()
:播放完成后自动调用。
// 创建一个AudioListener对象
const listener = new THREE.AudioListener();
// 将AudioListener对象添加到相机上
camera.add(listener);
// 创建一个Audio对象,并将AudioListener对象作为参数传入
const sound = new THREE.Audio(listener);
// 创建一个AudioLoader对象
const audioLoader = new THREE.AudioLoader();
// 加载音频文件
audioLoader.load("./audio/song.ogg", (buffer) => {
// 将加载的音频文件设置为Audio对象的缓冲区
sound.setBuffer(buffer);
// 设置Audio对象循环播放
sound.setLoop(true);
// 设置Audio对象的音量为0.5
sound.setVolume(0.5);
// 播放Audio对象
sound.play();
});
// 在控制台打印Audio对象
console.log(sound);
// 获取按钮元素
const btn = document.querySelector(".btn");
// 为按钮添加点击事件监听器
btn.addEventListener("click", () => {
// 如果Audio对象正在播放,则暂停播放
if (sound.isPlaying) {
sound.pause();
// 否则,播放Audio对象
} else {
sound.play();
}
});
注意
有时候播放会报警告,这个时候就需要手动触发播放。
The AudioContext was not allowed to start. It must be resumed (or created) after a user gesture on the page.
不允许启动音频上下文。用户在页面上做出手势后,必须恢复(或创建)它。
AudioListener
AudioListener
是 Threejs 中用来管理 3D 音频的核心类,创建一个音频监听器。需要将AudioListener
对象添加到相机上,以便在播放音频时能够正确地处理声音的位置和方向。
const listener = new THREE.AudioListener();
camera.add(listener);
属性:
context
:音频上下文,构造函数中传入的 AudioContext 对象。gain
:该属性标时音频系统中的主音量控制器,可以通过它来调节整个场景的音量。filter
:用于处理音频的滤波器。允许对音频信号进行过滤或效果处理。例如:可以用滤波器来创建环绕声效果或调节音质。
方法:
getInput()
:获取音频监听器的输入节点。
const listener = new THREE.AudioListener();
const gainNode = listener.getInput();
gainNode.gain.value = 0.5; //调节整个场景音量到50%
setMasterVolume(volume)
:设置主音量。范围:0.0 到 1.0。
listener.setMasterVolume(0.5); //调节整个场景音量到50%
setFilter()
:设置滤波器。
//创建一个低通滤波器
const lowPassFilter = listener.context.createBiquadFilter();
lowPassFilter.type = "lowpass";
//低于500Hz的频率会通过,高于500Hz的频率会被衰减
lowPassFilter.frequency.value = 500;
sound.setFilter(lowPassFilter);
createBiquadFilter():创建一个滤波器,用于处理音频信号。可以设置滤波器的类型、频率、Q 值等参数。
音频效果是用于处理音频数据的对象,可以对音频进行各种处理,如混响、均衡器等。在 Three.js 中,可以使用ConvolverNode
、GainNode
、BiquadFilterNode
等对象来创建音频效果。
PositionalAudio
PositionalAudio
它继承自Audio
类,用于创建具有空间定位效果的 3D 音频。会根据音源的位置和方向来计算声音的到达方向,从而实现更逼真的声音效果。
const sound = new THREE.PositionalAudio(listener);
方法:
setRefDistance(distance)
:用于设置音源在特定距离内保持最大音量的范围。当音源距离监听器超过这个距离时,音量会逐渐减小。setRolloffFactor(rolloffFactor)
:用于设置音量随距离变化的速率。默认值为 1,表示音量随距离线性减小。如果设置为 0,则音量不会随距离变化。setMaxDistance(maxDistance)
:用于设置音源的最大距离。当音源距离监听器超过这个距离时,音量会变为 0。getDistanceModel()
:获取音量随距离变化的模型。
//创建一个音频监听器
const listener = new THREE.AudioListener();
//将音频监听器添加到相机上
camera.add(listener);
//创建一个位置音频对象
const sound = new THREE.PositionalAudio(listener);
//创建一个音频加载器
const audioLoader = new THREE.AudioLoader();
//加载音频文件
audioLoader.load("./audio/song.ogg", (buffer) => {
//将音频缓冲区设置为音效的缓冲区
sound.setBuffer(buffer);
sound.setRefDistance(1); //设置音效开始衰减的距离
sound.setLoop(true);
sound.setVolume(0.5);
sound.play();
});
//将音效关联到物体上
const sphere = new THREE.Mesh(
new THREE.SphereGeometry(1),
new THREE.MeshBasicMaterial({ color: 0x00ff00 })
);
scene.add(sphere);
sphere.position.set(15, 0, 0);
sphere.add(sound); //将音效关联到物体上
拖动这个球体,可以听到音效的位置发生了变化。
AudioAnalyser
AudioAnalyser
是 Three.js 中用于分析音频数据的类,可以获取音频的频谱数据,从而实现音频可视化效果、分析音频的频率和波形数据、与场景元素结合实现音频驱动的动画。
const listener = new THREE.AudioListener();
camera.add(listener);
const sound = new THREE.PositionalAudio(listener);
const audioLoader = new THREE.AudioLoader();
audioLoader.load("./audio/song.ogg", (buffer) => {
sound.setBuffer(buffer);
sound.setLoop(true);
sound.setVolume(0.5);
sound.play();
//创建AudioAnalyser对象,传入sound和FFT大小
const analyser = new THREE.AudioAnalyser(sound, 32);
//获取频率数据
const data = analyser.getFrequencyData();
console.log(data);
//获取平均频率
const averageFrequency = analyser.getAverageFrequency();
console.log(averageFrequency);
});
参数:
audio
:音频对象,用于获取音频数据。fftSize
:用于设置 FFT 大小,默认值为 2048。FFT 大小决定了频谱数据的分辨率,较大的 FFT 大小可以提供更详细的频谱数据,但会消耗更多的计算资源。
方法:
getFrequencyData()
:获取频率数据,返回一个 Uint8Array 数组,每个值表示一个频率段的强度,范围为 0 到 255。用来创建频谱分析、柱状图等可视化效果。getAverageFrequency()
:获取平均频率。用于判断整体的音量水平。适用于音频驱动的动画或音量监控。
AudioContext
AudioContext
是 Web Audio API 的核心对象,用于创建和管理音频节点,处理音频数据,播放音频等。在 Three.js 中,可以通过AudioListener
对象获取AudioContext
对象,然后使用AudioContext
对象创建音频节点,处理音频数据。
const listener = new THREE.AudioListener();
camera.add(listener);
const audioContext = listener.context;