与 THREE.AudioListener 共享 HTML DOM 音频元素
Share HTML DOM audio element with THREE.AudioListener
我有一个 WebGL 体验,它有一个组件可以对正在播放的音频做出反应。我们还有需要收听音频的标准 HTML DOM 元素,以便我们可以渲染字幕。
在 THREE
中,我们可以像这样创建一个 THREE.AudioListener
:
// create an AudioListener and add it to the camera
const listener = new THREE.AudioListener();
camera.add( listener );
// create a global audio source
const sound = new THREE.Audio( listener );
// load a sound and set it as the Audio object's buffer
const audioLoader = new THREE.AudioLoader();
audioLoader.load( 'sounds/ambient.ogg', function( buffer ) {
sound.setBuffer( buffer );
sound.setLoop(true);
sound.setVolume(0.5);
sound.play();
});
有没有办法从 DOM 获取音频源而不是用 THREE.AudioLoader
加载它?或者告诉 THREE.AudioListener
改为收听来自 DOM 元素的音频?
Three.js Audio
对象(及其所有相关 类)使用 WebAudio API. I believe you can get the WebAudio context via the Audio.context
property,它使您可以访问任何本机 WebAudio 命令。
其次,根据“加载声音”部分 from this demo,您似乎可以 select 一个 <audio>
标签并将其传递给 WebAudio API 通过createMediaElementSource()
:
// create a global audio source
const listener = new THREE.AudioListener();
camera.add( listener );
const audio = new THREE.Audio( listener );
// Get WebAudio context
const audioContext = audio.context;
// get the <audio> element
const audioElement = document.querySelector('audio');
// pass it into the audio context
const track = audioContext.createMediaElementSource(audioElement);
编辑:
我刚刚意识到 Three.js 已经为您完成了此操作,而无需通过 the Audio.setMediaElementSource
method 手动访问上下文,因此您可以跳过一个步骤:
// create a global audio source
const listener = new THREE.AudioListener();
camera.add( listener );
const audio = new THREE.Audio( listener );
// get the <audio> element
const audioElement = document.querySelector('audio');
const track = audio.setMediaElementSource(audioElement);
我有一个 WebGL 体验,它有一个组件可以对正在播放的音频做出反应。我们还有需要收听音频的标准 HTML DOM 元素,以便我们可以渲染字幕。
在 THREE
中,我们可以像这样创建一个 THREE.AudioListener
:
// create an AudioListener and add it to the camera
const listener = new THREE.AudioListener();
camera.add( listener );
// create a global audio source
const sound = new THREE.Audio( listener );
// load a sound and set it as the Audio object's buffer
const audioLoader = new THREE.AudioLoader();
audioLoader.load( 'sounds/ambient.ogg', function( buffer ) {
sound.setBuffer( buffer );
sound.setLoop(true);
sound.setVolume(0.5);
sound.play();
});
有没有办法从 DOM 获取音频源而不是用 THREE.AudioLoader
加载它?或者告诉 THREE.AudioListener
改为收听来自 DOM 元素的音频?
Three.js Audio
对象(及其所有相关 类)使用 WebAudio API. I believe you can get the WebAudio context via the Audio.context
property,它使您可以访问任何本机 WebAudio 命令。
其次,根据“加载声音”部分 from this demo,您似乎可以 select 一个 <audio>
标签并将其传递给 WebAudio API 通过createMediaElementSource()
:
// create a global audio source
const listener = new THREE.AudioListener();
camera.add( listener );
const audio = new THREE.Audio( listener );
// Get WebAudio context
const audioContext = audio.context;
// get the <audio> element
const audioElement = document.querySelector('audio');
// pass it into the audio context
const track = audioContext.createMediaElementSource(audioElement);
编辑:
我刚刚意识到 Three.js 已经为您完成了此操作,而无需通过 the Audio.setMediaElementSource
method 手动访问上下文,因此您可以跳过一个步骤:
// create a global audio source
const listener = new THREE.AudioListener();
camera.add( listener );
const audio = new THREE.Audio( listener );
// get the <audio> element
const audioElement = document.querySelector('audio');
const track = audio.setMediaElementSource(audioElement);