HarmonyOS 鸿蒙Next中如何实现AVSession Kit(音视频播控服务)音乐后台任务效果?
HarmonyOS 鸿蒙Next中如何实现AVSession Kit(音视频播控服务)音乐后台任务效果? 如何实现AVSession Kit(音视频播控服务)音乐后台任务效果?
4 回复
效果

实现思路
- 通过 avplayer 实现音乐播放 (缺点 1-没有后台任务、缺点 2-没有播控服务 也就是息屏后还可以控制)
- 通过 avSession 实现播控服务
完整代码
import {media} from '@kit.MediaKit'
import { avSession } from '@kit.AVSessionKit'
@Entry
@Component
struct Index {
private player: media.AVPlayer = Object()
async aboutToAppear() {
// ✅ 1. 创建音乐播放器对象
// const player:media.AVPlayer = await media.createAVPlayer() 切记player放外面 后期要操作
this.player = await media.createAVPlayer()
// ✅ 2. 侦听播放状态
this.player.on('stateChange', (state) => {
switch(state) {
// 初始化状态
case 'initialized':
console.log('11111 initialized')
this.player.prepare() // 准备就绪态
break;
// 准备就绪态
case 'prepared':
console.log('2222 prepared')
this.player.play() // 播放
break;
}
})
// ✅ 3. 设置播放地址
this.player.url = 'http://tmp00002.zhaodashen.cn/mp3/chenyixun_003u2qmP0Mp2pW.m4a'
// ===========================================================================
// ===========================================================================
// ===========================================================================
// ===========================================================================
// 💕 1. 创建【播放控制服务】示例
const session = await avSession.createAVSession(getContext(), 'uuid', 'audio') as avSession.AVSession
// 💕 2. 监控【播放控制服务】用户交互:2.1-改当前播放控制服务台信息、2.2-改AVPlayer控制音乐
session.on('play', () => {
session.setAVPlaybackState({ state: avSession.PlaybackState.PLAYBACK_STATE_PLAY })
this.player.play()
})
session.on('pause', () => {
session.setAVPlaybackState({ state: avSession.PlaybackState.PLAYBACK_STATE_PAUSE })
this.player.pause()
})
session.on('seek', (time) => {
// 1. 更改音视频播控服务状态(特殊不用激活)
// 2. 更改AVPlay状态
this.player.seek(time)
})
// session.on('playNext', () => { }) // 下一首
// session.on('playPrevious', () => {}) // 上一首
// session.on('toggleFavorite', (assetId) => { session.setAVPlaybackState({ isFavorite: 收藏状态布尔 }) }); // 监听收藏
// 💕3. 配置【播放控制服务】默认信息
session.setAVPlaybackState({ // 3.2 跟用户交互相关的
state: true ? avSession.PlaybackState.PLAYBACK_STATE_PLAY : avSession.PlaybackState.PLAYBACK_STATE_PAUSE,
// position: { elapsedTime: 178552, updateTime: (new Date()).getTime() }, // elapsedTime对应的是播放进度
})
session.setAVMetadata({ // 3.1 配置的默认信息
assetId: "歌曲ID必须写",
title: '世界上最牛逼之歌没有第二',
artist: '世界上最牛逼的人',
avQueueImage:'https://bkimg.cdn.bcebos.com/pic/8694a4c27d1ed21b0ef4d12e5d26cac451da80cb91ed',
mediaImage:'https://bkimg.cdn.bcebos.com/pic/8694a4c27d1ed21b0ef4d12e5d26cac451da80cb91ed',
duration: 1000*60*4,
//lyric:song.lrc
})
// 💕4. 激活控制台,允许控制台有交互(激活会话,激活后可正常使用会话)
session.activate()
}
build() {
Column() {
Button('音乐').onClick(() => {
}).margin({bottom:20})
}.padding(50)
}
}
更多关于HarmonyOS 鸿蒙Next中如何实现AVSession Kit(音视频播控服务)音乐后台任务效果?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
效果

实现思路
- 通过 avplayer 实现音乐播放 (缺点 1-没有后台任务、缺点 2-没有播控服务 也就是息屏后还可以控制)
- 通过 avSession 实现播控服务
完整代码
记得配置网络权限测试
import {media} from '@kit.MediaKit'
import { avSession } from '@kit.AVSessionKit'
@Entry
@Component
struct Index {
private player: media.AVPlayer = Object()
async aboutToAppear() {
// ✅ 1. 创建音乐播放器对象
// const player:media.AVPlayer = await media.createAVPlayer() 切记player放外面 后期要操作
this.player = await media.createAVPlayer()
// ✅ 2. 侦听播放状态
this.player.on('stateChange', (state) => {
switch(state) {
// 初始化状态
case 'initialized':
console.log('11111 initialized')
this.player.prepare() // 准备就绪态
break;
// 准备就绪态
case 'prepared':
console.log('2222 prepared')
this.player.play() // 播放
break;
}
})
// ✅ 3. 设置播放地址
this.player.url = 'http://tmp00002.zhaodashen.cn/mp3/chenyixun_003u2qmP0Mp2pW.m4a'
// ===========================================================================
// ===========================================================================
// ===========================================================================
// ===========================================================================
// 💕 1. 创建【播放控制服务】示例
const session = await avSession.createAVSession(getContext(), 'uuid', 'audio') as avSession.AVSession
// 💕 2. 监控【播放控制服务】用户交互:2.1-改当前播放控制服务台信息、2.2-改AVPlayer控制音乐
session.on('play', () => {
session.setAVPlaybackState({ state: avSession.PlaybackState.PLAYBACK_STATE_PLAY })
this.player.play()
})
session.on('pause', () => {
session.setAVPlaybackState({ state: avSession.PlaybackState.PLAYBACK_STATE_PAUSE })
this.player.pause()
})
session.on('seek', (time) => {
// 1. 更改音视频播控服务状态(特殊不用激活)
// 2. 更改AVPlay状态
this.player.seek(time)
})
// session.on('playNext', () => { }) // 下一首
// session.on('playPrevious', () => {}) // 上一首
// session.on('toggleFavorite', (assetId) => { session.setAVPlaybackState({ isFavorite: 收藏状态布尔 }) }); // 监听收藏
// 💕3. 配置【播放控制服务】默认信息
session.setAVPlaybackState({ // 3.2 跟用户交互相关的
state: true ? avSession.PlaybackState.PLAYBACK_STATE_PLAY : avSession.PlaybackState.PLAYBACK_STATE_PAUSE,
// position: { elapsedTime: 178552, updateTime: (new Date()).getTime() }, // elapsedTime对应的是播放进度
})
session.setAVMetadata({ // 3.1 配置的默认信息
assetId: "歌曲ID必须写",
title: '世界上最牛逼之歌没有第二',
artist: '世界上最牛逼的人',
avQueueImage:'https://bkimg.cdn.bcebos.com/pic/8694a4c27d1ed21b0ef4d12e5d26cac451da80cb91ed',
mediaImage:'https://bkimg.cdn.bcebos.com/pic/8694a4c27d1ed21b0ef4d12e5d26cac451da80cb91ed',
duration: 1000*60*4,
//lyric:song.lrc
})
// 💕4. 激活控制台,允许控制台有交互(激活会话,激活后可正常使用会话)
session.activate()
}
build() {
Column() {
Button('音乐').onClick(() => {
}).margin({bottom:20})
}.padding(50)
}
}
在鸿蒙Next中实现AVSession Kit音乐后台任务效果,需使用AVSession框架。首先创建AVSession实例并设置媒体信息。通过AVSessionController控制播放状态。在ServiceAbility中实现后台播放逻辑,使用AVPlayer进行音频解码与渲染。配置后台任务权限,确保应用在后台可继续运行。AVSession会与系统播控中心同步状态,实现跨应用控制。
在HarmonyOS Next中,使用AVSession Kit实现音乐后台播放效果,核心是创建并管理一个AVSession会话,使其在应用退到后台后仍能保持活动状态,并与系统播控中心交互。以下是关键实现步骤:
- 创建AVSession:在Ability或Service中,使用
avSession.createAVSession()创建会话,指定类型为media,并设置播控能力(如播放、暂停、切歌等)。 - 发布会话:通过
session.activate()激活并发布会话,系统播控中心将自动识别并显示控件。 - 后台保活:在应用退到后台前,确保持有后台任务权限(需在配置文件中声明
ohos.permission.KEEP_BACKGROUND_RUNNING),并通过avSession持续更新播放状态(如播放进度、元数据),会话将保持活跃。 - 响应控制命令:监听AVSession的
'controlCommand'事件,处理来自系统控件或硬件的播放、暂停等指令,并同步更新应用内状态。 - 释放资源:在播放结束或应用退出时,调用
session.deactivate()和session.destroy()释放会话。
注意事项:
- 后台播放需在
module.json5中配置backgroundModes为audioPlayback。 - 使用AVSession的
setAVMetadata()和setAVPlaybackState()同步播放信息,确保系统控件显示正确。 - 避免后台长时间占用资源,需遵循系统后台任务管理策略。
通过以上步骤,即可实现音乐在后台持续播放,并与系统播控无缝协作。

