
#我的鸿蒙开发手记#自学 音频播放 (AVPlayer) 实现与封装 原创
前言
在移动应用开发中,音频播放功能是许多应用的核心需求之一。HarmonyOS Next 提供了多种音频播放解决方案,开发者可以根据不同场景选择最适合的API。本文将详细介绍HarmonyOS Next中的音频播放方案,并重点分析AVPlayer的实现方式。
背景
HarmonyOS Next为开发者提供了多层次的音频播放API:
Video组件:最简单的媒体播放方式,适合快速实现基础播放功能
AVPlayer:功能全面的媒体播放服务,支持音频和视频
AudioRenderer:低延迟音频播放接口,适合对延迟敏感的场景
OpenSL ES:标准化的高性能音频API
本文将重点介绍AVPlayer的实现方案,因为它提供了最全面的功能集,同时保持了良好的易用性。
AVPlayer实现完整音频播放器
下面我们通过一个完整的音乐播放器实现来展示AVPlayer的使用方法。这个播放器包含以下功能:
- 播放/暂停控制
- 进度条拖动
- 上一曲/下一曲切换
- 播放模式切换(顺序、随机、单曲循环)
- 播放列表管理
播放器的封装
首先我们创建一个工具类AvPlayerUtils来封装AVPlayer的核心功能
关键功能实现解析
1. 播放器初始化
播放器初始化是音频播放的第一步,需要创建AVPlayer实例并设置必要的回调:
static async initPlayer() {
if (!this.player) {
this.player = await media.createAVPlayer();
this.setPlayerCallbacks();
}
}
private static setPlayerCallbacks() {
if (!this.player) return;
// 播放完成回调
this.player.on('ended', () => {
this.handlePlayEnd();
});
// 时间更新回调
this.player.on('timeUpdate', (time: number) => {
this.playState.time = time;
this.updateState();
});
// 错误回调
this.player.on('error', (err: BusinessError) => {
console.error(`AVPlayer error: ${err.code}, ${err.message}`);
});
}
2. 单曲播放实现
单曲播放需要重置播放器状态,设置新的音频URL,并开始播放:
static singlePlay(song: SongItemType) {
if (!this.player) return;
const index = songs.findIndex(item => item.id === song.id);
this.playState = {
...this.playState,
currentSong: song,
playIndex: index,
isPlay: true,
name: song.name,
author: song.author,
img: song.img
};
this.player.reset();
this.player.url = song.url;
this.player.prepare();
this.player.play();
this.updateState();
}
3. 播放控制
播放控制包括暂停、恢复、上一曲和下一曲等功能:
// 暂停播放
static pause() {
if (!this.player || !this.playState.isPlay) return;
this.player.pause();
this.playState.isPlay = false;
this.updateState();
}
// 恢复播放
static resume() {
if (!this.player || this.playState.isPlay) return;
this.player.play();
this.playState.isPlay = true;
this.updateState();
}
// 上一曲
static pre() {
let newIndex = this.playState.playIndex - 1;
if (newIndex < 0) {
newIndex = songs.length - 1;
}
this.singlePlay(songs[newIndex]);
}
// 下一曲
static next() {
let newIndex = this.playState.playIndex + 1;
if (newIndex >= songs.length) {
newIndex = 0;
}
this.singlePlay(songs[newIndex]);
}
4. 播放模式切换
播放模式决定了歌曲播放完成后的行为:
static changeMode(mode: 'auto' | 'repeat' | 'random') {
this.playState.playMode = mode;
this.updateState();
}
private static handlePlayEnd() {
switch (this.playState.playMode) {
case 'auto': // 顺序播放
this.next();
break;
case 'repeat': // 单曲循环
this.singlePlay(this.playState.currentSong);
break;
case 'random': // 随机播放
const randomIndex = Math.floor(Math.random() * songs.length);
this.singlePlay(songs[randomIndex]);
break;
}
}
播放器的使用
1、初始化调用
2、权限设置
3、播放显示
总结
本文详细介绍了HarmonyOS Next中基于AVPlayer的音频播放解决方案。通过封装AVPlayerUtils工具类,我们实现了完整的音乐播放功能,包括:
播放器初始化和状态管理
单曲播放和播放列表支持
播放控制(播放/暂停/上一曲/下一曲)
播放模式切换(顺序/随机/单曲循环)
进度条控制和状态更新
这种实现方式既保持了代码的模块化和可维护性,又充分利用了HarmonyOS Next提供的媒体能力。开发者可以根据实际需求,在此基础上进一步扩展功能,如歌词显示、音效设置等。
