

前言
AVPlayer 是 HarmonyOS 的多媒体播放器,支持音频和视频播放。在「猫猫大作战」中,AVPlayer 用于播放背景音乐和音效。
一、AVPlayer 基础
typescript
import { media } from '@kit.MediaKit';
class BGMManager {
private player: media.AVPlayer | null = null;
async playBGM(src: string): Promise<void> {
// 创建播放器
this.player = await media.createAVPlayer();
this.player.on('stateChange', (state) => {
console.info(`播放状态: ${state}`);
});
// 设置数据源
await this.player.setSrc(src);
// 循环播放
await this.player.setLoop(true);
// 设置音量 50%
await this.player.setVolume(0.5);
// 开始播放
await this.player.play();
}
pause(): void {
this.player?.pause();
}
resume(): void {
this.player?.play();
}
stop(): void {
this.player?.stop();
this.player?.release();
this.player = null;
}
}
二、播放控制
| 方法 | 功能 | 说明 |
|---|---|---|
play() |
开始/恢复播放 | 异步方法 |
pause() |
暂停 | 保留位置 |
stop() |
停止 | 重置位置 |
seek(time) |
跳转到指定时间 | time 单位 ms |
setVolume(v) |
设置音量 | 0.0~1.0 |
setLoop(b) |
是否循环 | boolean |
release() |
释放资源 | 用完必须调用 |
三、游戏音效
typescript
class SFXManager {
private cache: Map<string, media.AVPlayer> = new Map();
async playSFX(name: string): Promise<void> {
let sfx = this.cache.get(name);
if (!sfx) {
sfx = await media.createAVPlayer();
await sfx.setSrc(`/resources/sfx/${name}.mp3`);
this.cache.set(name, sfx);
}
// 每次从开始播放
await sfx.seek(0);
await sfx.play();
}
// 游戏中的音效
playMerge() { this.playSFX('merge'); }
playLevelUp() { this.playSFX('level_up'); }
playGameOver() { this.playSFX('game_over'); }
playButton() { this.playSFX('button_click'); }
}
四、常见问题
| 问题 | 原因 | 解决 |
|---|---|---|
| 播放无声 | 音量 0 / 静音模式 | 检查 setVolume 和系统音量 |
| 文件格式不支持 | 只支持 mp3/aac/wav | 转换音频文件 |
| 切换 BGM 时卡顿 | 播放器未释放 | 先 release 再重建 |
| 后台无法播放 | 未申请后台任务 | backgroundTaskManager 后台运行 |
五、最佳实践
- BGM 循环播放 :
setLoop(true) - 音效缓存:短音频缓存到 Map 避免重复创建
- 切后台暂停 :
onBackground中暂停,回前台恢复 - 用完释放 :
release()避免内存泄漏
总结
AVPlayer 用于播放游戏背景音乐和音效。核心要点:createAVPlayer() 创建、 setSrc 设置音频源、 play/pause/stop 控制、 release() 释放。
如果这篇文章对你有帮助,欢迎点赞👍、收藏⭐、关注🔔,你的支持是我持续创作的动力!
相关资源: