鸿蒙系统为开发者提供了多套音效播放方案,选对方案能省下不少力气。下面这几种方式各有侧重,你可以根据具体场景来选择:
SoundPool:低延迟短音效播放 。适合游戏射击、相机快门、按键反馈这类需要急促响应的场景,也是音效文档里的默认方案 。
AVPlayer:长音频全能播放 。适合播放背景音乐、较长音效或歌曲,支持MP3、M4A等多种主流格式,集成了解码和播放能力 。
AudioRenderer:专业PCM音频输出 。适合需要处理原始音频数据(PCM格式)的专业应用,比如播放前对音频做特效处理,但需要具备音频处理基础知识 。
OHAudio:Native层低延迟播放 。这是C/C++接口,适合对延迟和性能有极致要求、且依赖Native层开发的场景 。
系统音效:播放系统预置音效 。如调用系统的拍照、录制的提示音,适合需要与系统风格一致的场景,从API version 23开始支持 。
💡 SoundPool:专为短音效而生 (ArkTS)
如果你是开发游戏或需要频繁触发短音效的应用,SoundPool是官方推荐的首选方案,它简单高效且延迟低。
核心接口与状态监听:使用
GameMediaEngine.playLocalAudioClip方法触发播放。最重要的是,你需要通过EventHandler接口的onAudioClipStateChangedNotify回调来监听播放状态(如开始、结束、出错),以便在UI上做出响应或进行错误处理 。关键参数配置:在
LocalAudioInfo对象中,可以精确控制音效行为 。soundId:为每个音效分配唯一ID,便于后续单独控制。volume:设置音量系数(0-100)。loop:设置循环次数(0为无限循环)。
播放控制:通过
soundId可以单独暂停/恢复/停止某个音效,也可以调用pauseAllLocalAudioClips等方法进行全局控制。音量调节:支持调节单个音效或所有音效的音量,非常灵活 。
🧩 AVPlayer:处理背景音乐与长音效 (ArkTS)
AVPlayer功能更强大,适合管理背景音乐等长时间播放的音频。
它的核心是状态机管理。你需要先创建实例,设置好URL资源,然后通过prepare()->play()的顺序执行。同样,你需要设置OH_AVPlayerOnInfoCallback来监听播放进度、缓冲等信息,以及OH_AVPlayerOnErrorCallback来捕获错误 。
⚡️ 后台播放须知
无论是哪种方案,如果希望应用在后台或熄屏时继续播放音效,都需要同时满足两个条件:
注册媒体会话(AVSession):让系统知道你的应用正在播放音频,进行统一管理。
申请长时任务:避免应用进入挂起状态,被系统强制停止。
如果不满足,应用切到后台后音频就会被强制静音或停止。
🎯 总结与建议
对于绝大多数游戏UI音效、操作反馈、短促提示音,直接采用SoundPool方案即可。
如果需要播放背景音乐、较长的人声或歌曲,应该选择AVPlayer。
如果对音频数据处理有极专业的需求,才需要考虑AudioRenderer或OHAudio等方案。