uni-app小程序端loop=true无效,需手动处理onended事件实现无缝循环:优先seek(0)后play,失败则重赋src加时间戳;ios需用标准mp3编码且https;复用audio实例并及时destroy防内存泄漏;后台播放须用backgroundaudiomanager并配置对应平台权限。

uni-app小程序端loop=true无效,有明显卡顿间隙
iOS 和部分 Android 小程序真机上,loop = true 不能实现真正无缝循环,播放结束到重新开始之间存在 100–300ms 静音 gap,用户能清晰感知“卡一下”。这不是 bug,而是平台底层限制 —— iOS AVFoundation 和微信小程序音频引擎均不支持硬件级无缝 loop。
必须手动接管 ended 事件,主动 seek 并 play。但要注意:seek(0) 在某些 Android 机型(尤其低版本 WebView 或定制 ROM)会失败,直接静音或报错。
- 监听
onEnded,而非依赖loop属性 - 优先用
audio.seek(0)+audio.play(),但必须包try/catch - catch 到失败时,fallback 为重新赋值
src(哪怕还是同一个 URL,加时间戳参数强制刷新缓存) - 避免在
onEnded中连续调用play()多次,可能触发平台静音策略
const audio = uni.createInnerAudioContext();
audio.src = '/static/bg.mp3';
audio.onEnded(() => {
try {
audio.seek(0);
audio.play();
} catch (e) {
// seek 失败时 fallback
audio.src = '/static/bg.mp3?t=' + Date.now();
audio.play();
}
});
微信小程序 iOS 端 MP3 循环播放失败且无错误提示
现象是:安卓和 H5 正常,iOS 真机点击播放后无声,onError 不触发,控制台也无报错。大概率是音频编码或协议问题,而非代码逻辑。
iOS 对 MP3 的兼容性极敏感:它只稳定支持 MPEG-1 Layer III 编码,而很多转码工具默认输出 MPEG-2 或带 VBR 的变长码率 MP3,iOS 直接静默拒绝加载,连错误都不抛。
- 用
ffprobe检查音频编码:ffprobe -v quiet -show_entries stream=codec_name,codec_tag_string -of default audio.mp3,确认输出含codec_name=mp3且codec_tag_string=mp4a更稳妥 - 重编码推荐命令:
ffmpeg -i input.mp3 -c:a libmp3lame -q:a 2 -ar 44100 -ac 2 output.mp3(固定码率、标准采样) - 务必使用 HTTPS 协议,HTTP 资源在 iOS 小程序中会被拦截,且不报错
- 本地路径必须放在
/static/下,用/static/xxx.mp3格式,不能用@/static/或~static/
循环播放时内存泄漏导致后续播放失败
反复触发循环播放(比如每秒多次调用 play()),又没及时销毁实例,安卓端容易出现卡顿、音效消失、甚至整个 App 崩溃。这不是循环逻辑本身的问题,而是音频上下文堆积。
每个 uni.createInnerAudioContext() 实例都持有原生资源,不 destroy 就不会释放。尤其在扫码、提示音等高频场景下,极易踩坑。
- 不要在循环逻辑里反复 new AudioContext;复用单个实例,只重置
src和 seek - 页面卸载时必须调用
audio.destroy(),建议在onUnload或beforeDestroy中执行 - 如果需要多个音效并发(如 UI 反馈音 + 背景音乐),每个音效应独立管理生命周期,避免混用同一实例
- 避免在
onEnded回调里再创建新实例 —— 这是最常见的泄漏源头
后台持续循环播放需额外配置
如果你的目标是 App 切后台后仍保持音频循环(例如听书、导航语音),uni.createInnerAudioContext() 不适用 —— 它在后台会被系统暂停。必须改用 uni.getBackgroundAudioManager(),且仅限微信小程序和 App 平台。
关键点不是代码写法,而是 manifest 和权限配置漏一环就全失效:
- 微信小程序:无需额外权限,但必须在
manifest.json的mp-weixin节点下配置合法域名,并确保音频 URL 支持 CORS - App 平台(iOS):
manifest.json中"requiredBackgroundModes": ["audio"]必须存在,且 iOS 打包时勾选 Background Modes → Audio, AirPlay and Picture in Picture - App 平台(Android):需在
android.permission.WAKE_LOCK权限外,额外申请android.permission.FOREGROUND_SERVICE(SDK 31+ 强制要求) - 后台循环逻辑仍要手动处理
onEnded,loop = true同样无效
真机测试比模拟器重要得多 —— 微信开发者工具和 HBuilderX 模拟器对后台音频、iOS 静音开关、编码兼容性的模拟都很弱,所有循环逻辑必须在 iOS 真机、安卓真机、微信最新版上逐项验证。











