音频
相关参考:Scene API / 音频
Web 高级 API 当前提供的是对场景中已有音频对象的控制能力。
也就是说,音频通常是在场景编辑器中预先配置好的,宿主页面再通过高级 API 去:
- 获取音频对象
- 播放、暂停、停止、重播
- 读取时长、播放位置、循环状态
- 跳转播放时间
- 监听播放相关事件
获取音频对象
当前没有 createAudio() 这类运行时新增音频的 API。宿主页面可自己实例化Audio对象进行音频播放控制。
最常见的方式是通过对象名称获取:
js
const audio = await api.getObject('scene-bgm');如果返回 null,通常说明:
- 场景里没有这个名称的音频对象
- 对象还未进入可读取状态
- 名称写错了
因此更稳妥的时机通常是 loadSceneEnd 或 sceneStart 之后再获取:
js
iframe.addEventListener('loadSceneEnd', async () => {
const audio = await api.getObject('scene-bgm');
console.log(audio);
});播放控制
播放
js
await api.playAudio(audio, {
loop: false,
});如果需要,也可以通过 options.loop 直接指定是否循环播放。
暂停、停止、重播
js
await api.pauseAudio(audio);
await api.stopAudio(audio);
await api.playbackAudio(audio, { loop: false });这几个方法的区别通常是:
pauseAudio():暂停在当前位置stopAudio():停止并回到开头playbackAudio():从头重新开始播放
读取状态
js
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判断当前是否处于循环模式
跳转时间与循环设置
js
await api.setAudioCurrentTime(audio, 12.5);
await api.setAudioLoop(audio, true);适合的场景包括:
- 从宿主层自定义进度条跳转到指定位置
- 切换背景音乐是否循环
- 做“试听片段”或“重新播放指定段落”的交互
播放事件
音频对象支持和视频类似的媒体事件:
play- 开始播放时触发pause- 暂停时触发ended- 自然播放完毕时触发
示例:
js
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()
场景音效
适合:
- 某个关键交互发生后播放提示音
- 配合对象点击、动画完成、识别成功等流程做反馈
- 在宿主层控制是否静音或重新播放
注意
没有运行时创建 API
当前音频能力主要面向控制已有音频对象,不是在宿主层动态创建新音频。
音频不是 3D 对象
音频不属于普通的 3D 对象,因此不能像模型、图片、视频那样去做 addChild() 这类层级挂接。
自动播放仍受浏览器限制
即便插件内部有一些兼容处理,音频播放仍然会受浏览器自动播放策略影响。尤其要注意:
- 强制隐藏“立即体验”按钮后,更容易被浏览器拦截
- iOS 和部分 App 内 WebView 的限制更严格
- 如果播放不是由用户手势触发,成功率会下降
因此如果你的项目依赖背景音乐或重要提示音,最好:
- 保留默认开始流程,或
- 在宿主层提供一个明确的用户点击入口,再开始播放音频
对象名最好提前规划
如果你打算在宿主页面里控制音频,建议在场景编辑器里为音频对象设置稳定、可读的名称,例如:
scene-bgmbutton-click-sfxresult-voiceover
这样后续通过 getObject() 获取会更稳定。