一、播放器架构设计思路
1. 静态单例模式
arkts
static player: media.AVPlayer | null = null // 全局唯一播放器实例
- 采用静态类管理播放器核心资源
- 优势:避免多实例资源冲突,统一管理播放状态
- 典型应用场景:音乐播放器等需要全局控制的场景
2. 状态与逻辑分离
- 状态层 :通过
duration/time/isPlay等属性记录播放进度 - 控制层 :通过
play()/pause()/next()等方法实现交互逻辑 - 数据层 :
playList/playIndex管理播放列表与索引
二、播放器生命周期全流程
- 初始化阶段
arkts
init() {
media.createAVPlayer((err, player) => {
if (!err) {
AVPlayerClass.player = player
this.bindEvents()
}
})
}
- 创建AVPlayer实例并绑定事件监听
- 核心事件绑定逻辑:
arkts
bindEvents() {
player.on('timeUpdate', (currentTime) => {
AVPlayerClass.time = currentTime
})
player.on('stateChange', (state) => {
this.updateState(state)
})
}
- 播放控制流程 单曲播放实现逻辑:
arkts
singlePlay(song: songItemType) {
if (AVPlayerClass.player) {
AVPlayerClass.player.url = song.url
AVPlayerClass.player.prepare(() => {
AVPlayerClass.playIndex = this.findIndex(song)
AVPlayerClass.player.play()
})
}
}
- 执行链路:设置URL → 预加载 → 更新索引 → 开始播放
- 关键状态切换:IDLE → PREPARED → PLAYING
- 播放状态管理
arkts
updateState(playState: PlayStateType) {
switch(playState) {
case 'PLAYING':
this.startTimer()
break
case 'PAUSED':
clearInterval(AVPlayerClass.timer)
break
case 'ERROR':
this.resetPlayer()
break
}
}
- 通过定时器实现进度同步:
arkts
startTimer() {
AVPlayerClass.timer = setInterval(() => {
AVPlayerClass.time = AVPlayerClass.player?.currentTime || 0
}, 1000)
}
三、高级功能实现剖析
1. 多模式播放控制
arkts
changeMode(mode: "auto" | "repeat" | "random") {
switch(mode) {
case 'random':
AVPlayerClass.playIndex = Math.floor(Math.random() * playList.length)
break
case 'repeat':
// 保持当前索引不变
break
}
}
- 模式切换触发索引重置逻辑
- 随机模式采用洗牌算法避免重复播放
2. 列表管理核心算法 索引自动修正逻辑:
arkts
next() {
let newIndex = AVPlayerClass.playIndex + 1
if (newIndex >= AVPlayerClass.playList.length) {
newIndex = (AVPlayerClass.playMode === 'repeat') ? 0 : -1
}
if (newIndex !== -1) {
this.singlePlay(AVPlayerClass.playList[newIndex])
}
}
- 边界处理策略:
- 自动模式:列表结束时停止播放
- 循环模式:回到列表首项
- 随机模式:生成有效范围内新索引
四、设计模式最佳实践
1. 事件驱动架构
- 通过
stateChange/timeUpdate事件解耦UI与播放逻辑 - 典型应用:进度条同步、播放按钮状态切换
2. 资源管理策略
arkts
static remove(index: number) {
if (index === AVPlayerClass.playIndex) {
this.pausePlay()
AVPlayerClass.playIndex = -1
}
AVPlayerClass.playList.splice(index, 1)
}
- 移除当前播放项时执行暂停操作
- 列表索引动态修正机制
3. 扩展性设计
- 通过
playMode字段支持未来新增播放模式 songItemType抽象数据结构实现业务解耦
通过静态类实现全局资源管控,结合鸿蒙媒体Kit的异步特性,构建出高可用、易扩展的音频解决方案。