# 音频
小游戏中有两种播放音频的 API,InnerAudio 和 WebAudio
- 提示:如果你使用游戏引擎进行开发,游戏引擎可能已经适配了音频处理,你只需要使用游戏引擎中的组件即可,例如在Unity场景下,可以直接使用AudioSource组件进行播放
# InnerAudio
InnerAudio播放音频的方式简便快捷,且支持流式播放,但性能低于使用WebAudio的播放方式,适用于播放较大音频文件,比如背景音乐。
# 相关API
# 示例代码
const innerAudioContext = wx.createInnerAudioContext({
useWebAudioImplement: false // 是否使用 WebAudio 作为底层音频驱动,默认关闭
});
innerAudioContext.src = 'https://wx_test.mp3'; // 需要自行替换链接
innerAudioContext.loop = true; // 设置循环播放
// innerAudioContext.autoplay = true; // 当可以播放时自动开始播放
innerAudioContext.onError(res => {
console.log('异常', res);
});
innerAudioContext.onPlay(() => {
console.log('开始播放')
});
innerAudioContext.onCanplay(() => {
console.log('可以播放了')
innerAudioContext.play(); // 播放
});
innerAudioContext.onStop(() => {
console.log('播放被停止')
})
innerAudioContext.onEnded(() => {
console.log('播放结束')
});
innerAudioContext.pause(); // 暂停
innerAudioContext.stop(); // 停止
innerAudioContext.destroy(); // 释放音频资源
wx.onShow(() => {
innerAudioContext.play(); // 当小游戏退后台回来时,恢复播放
})
wx.onAudioInterruptionEnd(function () {
innerAudioContext.play() // 当被其他事件中断播放结束后(如电话),恢复播放
})
# 支持的格式
不同音频格式在iOS和Android会有差异,参考这里。
# 最佳实践
# 复用已有的音频实例
对于相同的音效,应该复用已有的音频实例,而不是重新创建一个音频实例。
# 及时销毁不需要的音频实例
如果一个音频不再需要使用了,可以调用 InnerAudioContext.destroy() 接口提前销毁这个实例。
# 同时播放的音频数量限制
由于系统限制,在 Android 上最多同时播放 10 个音频,超过的部分会做有损处理,对开发者来说不感知,但开发者应尽量避免同时播放过多音频。
# WebAudio
WebAudio播放性能好,能力丰富,但占用内存较大,建议短音频、播放频繁的音效使用。
WebAudio 有两种使用方式:
使用wx.createInnerAudioContext并同时传入
useWebAudioImplement
参数为true
,示例代码如上文
WebAudio的开发调用方式和其他JavaScript
环境基本是相同的,建议直接查阅Web_Audio_API进行学习
# 示例代码
const audioCtx = wx.createWebAudioContext()
const loadAudio = (url) => {
return new Promise((resolve) => {
wx.request({
url,
responseType: 'arraybuffer',
success: res => {
console.log('res.data', res.data)
audioCtx.decodeAudioData(res.data, buffer => {
resolve(buffer)
}, err => {
console.error('decodeAudioData fail', err)
reject()
})
},
fail: res => {
console.error('request fail', res)
reject()
}
})
})
}
const play = () => {
// 需要自行替换链接
loadAudio('https://wx_test.mp3').then(buffer => {
let source = audioCtx.createBufferSource()
source.buffer = buffer
source.onended = () => {
console.log('播放结束')
};
source.connect(audioCtx.destination)
source.start()
}).catch(() => {
console.log('fail')
})
}
play();
wx.onShow(() => {
audioCtx.resume(); // 当小游戏退后台回来时,恢复播放
})
wx.onAudioInterruptionEnd(function () {
audioCtx.resume() // 当被其他事件中断播放结束后(如电话),恢复播放
})