UniApp 音频播放技术文档
一、基础实现方案
1. 使用 InnerAudioContext(原生 API)
const audioContext = uni.createInnerAudioContext()
audioContext.src = '/static/audio/beep.mp3'
audioContext.volume = 0.8
audioContext.loop = false
audioContext.onPlay(() => console.log('开始播放'))
audioContext.onError((err) => console.error('播放错误', err))
audioContext.play()
audioContext.pause()
audioContext.stop()
audioContext.destroy()
特性说明:
特性 |
说明 |
跨平台支持 |
支持微信小程序、H5、App 等多端 |
音频格式 |
支持 MP3/AAC/WAV 等常见格式 |
内存管理 |
需要手动调用 destroy() 释放资源 |
后台播放 |
App端需配置后台运行权限 |
二、扩展实现方案
1. Web Audio API(高级音频处理)
const audioContext = new (window.AudioContext || window.webkitAudioContext)()
fetch('/static/audio/beep.mp3')
.then(res => res.arrayBuffer())
.then(buffer => audioContext.decodeAudioData(buffer))
.then(decodedData => {
const source = audioContext.createBufferSource()
source.buffer = decodedData
const gainNode = audioContext.createGain()
gainNode.gain.value = 0.5
source.connect(gainNode)
gainNode.connect(audioContext.destination)
source.start(0)
source.stop(audioContext.currentTime + 2)
})
适用场景:
- 需要音频可视化
- 实时音效处理(如变声、混响)
- 精确音频时间控制
2. 第三方音频库(Howler.js)
npm install howler
import { Howl } from 'howler'
const sound = new Howl({
src: ['/static/audio/beep.mp3'],
html5: true,
volume: 0.8,
onend: () => console.log('播放结束')
})
sound.play()
sound.pause()
sound.stop()
优势对比:
特性 |
InnerAudioContext |
Howler.js |
多音频同时播放 |
❌ |
✅ |
3D 音效 |
❌ |
✅ |
淡入淡出效果 |
❌ |
✅ |
包体积 |
0KB |
~30KB (gzipped) |
3. H5+ Audio 模块(App 端增强)
const audio = plus.audio.createPlayer('/static/audio/beep.mp3')
audio.setSessionCategory('playback')
audio.setRoute('speaker')
audio.play(() => console.log('播放成功'), (err) => console.error(err))
特有功能:
- 蓝牙设备控制
- 耳机插拔检测
- 声道平衡调节
- 音频焦点管理
三、最佳实践方案
1. 音频预加载策略
const preloadList = [
{ id: 'beep', src: '/static/audio/beep.mp3' },
{ id: 'success', src: '/static/audio/success.mp3' }
]
const audioMap = new Map()
preloadList.forEach(item => {
const audio = uni.createInnerAudioContext()
audio.src = item.src
audio.autoplay = false
audioMap.set(item.id, audio)
})
2. 自动播放兼容方案
document.addEventListener('click', initAudio, { once: true })
function initAudio() {
const audio = uni.createInnerAudioContext()
audio.src = '/static/audio/beep.mp3'
audio.play()
audio.pause()
}
3. 性能优化方案
const worker = new Worker('/workers/audio-decoder.js')
worker.postMessage({
audioData: arrayBuffer,
format: 'mp3'
})
worker.onmessage = (e) => {
const decodedData = e.data
}
self.onmessage = function(e) {
const { audioData, format } = e.data
const decoded = decodeAudio(audioData, format)
self.postMessage(decoded)
}
四、常见问题处理
1. 微信小程序音频限制
wx.downloadFile({
url: 'https://example.com/audio.mp3',
success(res) {
const audio = wx.createInnerAudioContext()
audio.src = res.tempFilePath
audio.play()
}
})
2. 自动播放策略规避
<audio id="bgm" muted controls>
<source src="bgm.mp3" type="audio/mpeg">
</audio>
<script>
document.addEventListener('click', () => {
const audio = document.getElementById('bgm')
audio.muted = false
audio.play()
})
</script>
3. 内存泄漏预防
const audioPool = []
function getAudio() {
return audioPool.pop() || uni.createInnerAudioContext()
}
function releaseAudio(audio) {
audio.stop()
audio.offPlay()
audio.offError()
audioPool.push(audio)
}