
基于AVPlayer音频后台播放
场景描述
音乐播放是媒体最重要的组成之一,以下是AVPlayer将Audio媒体资源(比如mp3等)转码为可听见的音频模拟信号,并通过输出设备进行播放。
场景一:使用avPlayer进行后台播放音乐
想要实现应用后台播放,那么接入AVSession是必须的,否则业务的正常功能会同时受到限制,也必须有BackgroundTasks Kit(后台任务管理)的能力,申请对应的长时任务,避免进入挂起(Suspend)状态。
应用不申请后台任务会被冻结,不注册AVSession会被暂停。
步骤一:创建avPlayer实现音频播放
创建avPlayer并加载音频资源
注册avPlayer回调函数
步骤二:创建AVSession,使音频接入播控中心
AVSession在构造方法中支持不同的类型参数,由 AVSessionType定义,不同的类型代表了不同场景的控制能力,对于播控中心来说,会展示不同的控制模版。
- audio类型,播控中心的控制样式为:收藏,上一首,播放/暂停,下一首,循环模式。
- video类型,播控中心的控制样式为:快退,上一首,播放/暂停,下一首,快进。
- voice_call类型,通话类型。
创建AVSession
注:播控中心的显示必须要配上session.on控制命令的监听
步骤三:创建长时任务
在module.json5申请ohos.permission.KEEP_BACKGROUND_RUNNING权限:
声明后台模式类型
在对应的UIAbility下配置backgroundModes
配置长时任务信息
wantAgentInfo配置信息链接:WantAgentInfo。
申请长时任务
场景二:在播放音乐过程中,有其它音频流(如:导航音、电话)进入,进行相关处理
在多个音频流同时播放场景下,如果系统不加管控,会造成多个音频流混音播放,容易让用户感到嘈杂,造成不好的用户体验。为了解决这个问题,系统预设了音频打断(InterruptEvent)策略,对多音频播放的并发进行管控。为满足应用对多音频并发策略的不同需求,音频打断策略预设了两种焦点模式,针对同一应用创建的多个音频流,应用可通过设置焦点模式,选择由应用自主管控或由系统统一管控。
步骤一:完成上述场景一。
步骤二:设置焦点模式。
- 共享焦点模式(SHARE_MODE):由同一应用创建的多个音频流,共享一个音频焦点。这些音频流之间的并发规则由应用自主决定,音频打断策略不会介入。当其他应用创建的音频流与该应用的音频流并发播放时,才会触发音频打断策略的管控。
- 独立焦点模式(INDEPENDENT_MODE):应用创建的每一个音频流均会独立拥有一个音频焦点,当多个音频流并发播放时,会触发音频打断策略的管控。
注:只允许在prepared/playing/paused/completed状态下设置。
步骤三:设置音频类型。
步骤四:创建监听音频焦点打断。
调用avPlayer的on('audioInterrupt')函数进行监听,当收到音频打断事件(InterruptEvent)时,应用需根据其内容,做出相应的调整。
场景:
新播放的音频流 | ||||||||
voip通话 | voip消息 | 音乐 | 视频 | 游戏 | 听书/听新闻 | 导航 | ||
正在播放的音频流 | voip通话 | 拒绝新的voip通话 | 降低voip消息音量 | 降低音乐音量 | 降低视频音量 | 降低游戏音量 | 降低听书/听新闻音量 | 降低导航音量 |
voip消息 | 停止正在播放的voip消息 | 停止正在播放的voip消息 | 停止voip消息 | 停止voip消息 | 同时播放 | 停止voip消息 | 降低导航音量 | |
音乐 | 暂停音乐 | 音乐 | 暂停音乐 | 停止音乐 | 停止正在播放的音乐 | 停止音乐 | 同时播放 | |
视频 | 暂停视频 | 视频 | 暂停视频 | 停止视频 | 停止视频 | 停止正在播放的视频 | 停止视频 | |
游戏 | 暂停游戏 | 游戏 | 暂停游戏 | 同时播放 | 同时播放 | 暂停游戏 | 停止正在播放的游戏 | |
听书/听新闻 | 暂停听书/听新闻 | 听书/听新闻 | 暂停听书/听新闻 | 停止听书/听新闻 | 停止听书/听新闻 | 停止听书/听新闻 | 停止听书/听新闻 | |
导航 | 降低导航音量 | 导航 | 降低导航音量 | 降低导航音量 | 降低音乐音量 | 降低视频音量 | 降低游戏音量 |
