需求

uniapp前端项目需要使用背景模式播放音乐,此模式的特点是:当手机熄屏之后、或者App在后台时,音乐还会继续播放!所以非常适合播放音乐及朗读、朗诵文章、古诗之类长时间音频需求。

html5里面有个audio可以播放音乐,但现在小程序里面已经弃用了。应该还是平台差异造成的,毕竟电脑和手机不同。用还是能用,但开发者工具会不断的警告:

'<audio/>' 组件不再维护,建议使用能力更强的 'wx.createInnerAudioContext' 接口

这种情况下,在uniapp中就需要使用uni.getBackgroundAudioManager()来获取背景播放对象。

如果不需要在App切后台时继续播放,应该使用普通音频APIuni.createInnerAudioContext

getBackgroundAudioManager文档

https://uniapp.dcloud.io/api/media/background-audio-manager?id=getbackgroundaudiomanager

如何使用

与普通播放不同的是,背景播放需要更多的配置。

  • 在manifest.json中对应的小程序位置添加代码,我只是开发微信小程序,所以就只需要在mp-weixin节点下添加。
"requiredBackgroundModes" : ["audio"],

注:要点击源码视图才可以添加代码!

uniapp android 使用视频播放组件 uniapp播放音乐_播放音乐

本着偷懒的原则,直接修改了一个uniapp插件市场中的luch-audio,把innerAudioContext直接改成getBackgroundAudioManager。

let innerAudioContext = uni.getBackgroundAudioManager();

一跑就出问题了,说src无法赋值,添加判断代码后不出错了,但没有声音播放,看官方的文档,是需要个title的,果然添加之后能够播放了,但:

切换src的时候需要等大概20秒后才会出声音,怎么调整都不成,另外的两个属性值:coverImageUrl, singer如果添加了会出更多错误。

最后直接上真机调试,一切正常了。思考了下为什么要添加title呢?大概率背景播放的时候是会显示在手机下拉列表中的,有标题的话会更清晰。(欢迎指正)

官方示例:

const bgAudioManager = uni.getBackgroundAudioManager();
bgAudioManager.title = '致爱丽丝';
bgAudioManager.singer = '暂无';
bgAudioManager.coverImgUrl = 'https://bjetxgzv.cdn.bspapp.com/VKCEYUGU-uni-app-doc/7fbf26a0-4f4a-11eb-b680-7980c8a877b8.png';
bgAudioManager.src = 'https://bjetxgzv.cdn.bspapp.com/VKCEYUGU-hello-uniapp/2cc220e0-c27a-11ea-9dfb-6da8e309e0d8.mp3';

解决办法总结

  • 使用手机调试

基本上能够解决一切神奇、诡异的bug。毕竟手机端的内核使用人更多,也会更成熟。以前也遇到过多次类似的开发者工具表现与真机不同的现象。

所以,尽量使用手机调试。

uniapp android 使用视频播放组件 uniapp播放音乐_开发者工具_02

  • 升级微信开发者工具,这开发者工具调试有问题也是挺烦,所以试了下升级,版本升级到1.05.2109101之后,背景播放问题已然消失,不会再出现播放缓慢的问题。

uniapp android 使用视频播放组件 uniapp播放音乐_播放音乐_03

后来想了下,自己的微信开发者工具也确实是很久没更新了,因为一直正常,不想折腾,结果因为个背景音乐播放问题折腾很久。

原因

小程度开发工具与真机还是有差异的,尤其是有关音视频方面,如果涉及到录音就更复杂了,可以看我前面的文章,录音的时候开发者工具中使用的编码器是chrome, 而真实的手机里面用的是其手机自带的编码器。