简体中文
主题
简体中文
主题
相关参考:Scene API / 音频
Web 高级 API 当前提供的是对场景中已有音频对象的控制能力。
也就是说,音频通常是在场景编辑器中预先配置好的,宿主页面再通过高级 API 去:
当前没有 createAudio() 这类运行时新增音频的 API。宿主页面可自己实例化Audio对象进行音频播放控制。
最常见的方式是通过对象名称获取:
const audio = await api.getObject('scene-bgm');如果返回 null,通常说明:
因此更稳妥的时机通常是 loadSceneEnd 或 sceneStart 之后再获取:
iframe.addEventListener('loadSceneEnd', async () => {
const audio = await api.getObject('scene-bgm');
console.log(audio);
});await api.playAudio(audio, {
loop: false,
});如果需要,也可以通过 options.loop 直接指定是否循环播放。
await api.pauseAudio(audio);
await api.stopAudio(audio);
await api.playbackAudio(audio, { loop: false });这几个方法的区别通常是:
pauseAudio():暂停在当前位置stopAudio():停止并回到开头playbackAudio():从头重新开始播放const duration = await api.getAudioDuration(audio);
const paused = await api.getAudioPaused(audio);
const currentTime = await api.getAudioCurrentTime(audio);
const loop = await api.getAudioLoop(audio);常见用途:
paused 切换宿主层播放按钮图标currentTime 和 duration 做简单进度显示loop 判断当前是否处于循环模式await api.setAudioCurrentTime(audio, 12.5);
await api.setAudioLoop(audio, true);适合的场景包括:
音频对象支持和视频类似的媒体事件:
play - 开始播放时触发pause - 暂停时触发ended - 自然播放完毕时触发示例:
function onPlay(event) {
// https://developer.mozilla.org/en-US/docs/Web/API/Event
}
function onPause(event) {
// https://developer.mozilla.org/en-US/docs/Web/API/Event
}
function onEnded(event) {
// https://developer.mozilla.org/en-US/docs/Web/API/Event
}
await api.on('play', onPlay, audio);
await api.on('pause', onPause, audio);
await api.on('ended', onEnded, audio);常见做法是:
getObject() 拿到它playAudio()pauseAudio() / playbackAudio()适合:
当前音频能力主要面向控制已有音频对象,不是在宿主层动态创建新音频。
音频不属于普通的 3D 对象,因此不能像模型、图片、视频那样去做 addChild() 这类层级挂接。
即便插件内部有一些兼容处理,音频播放仍然会受浏览器自动播放策略影响。尤其要注意:
因此如果你的项目依赖背景音乐或重要提示音,最好:
如果你打算在宿主页面里控制音频,建议在场景编辑器里为音频对象设置稳定、可读的名称,例如:
scene-bgmbutton-click-sfxresult-voiceover这样后续通过 getObject() 获取会更稳定。