鸿蒙中 音频播放:组件选择(一)
鸿蒙系统提供五种音频播放API:AVPlayer(全能播放器,支持常见格式)、SoundPool(低时延短音效)、AudioRenderer(专业PCM输出)、AudioHaptic(音振协同)和OHAudio(Native层接口)。选择依据包括音频格式(MP3用AVPlayer,PCM用AudioRenderer)、资源来源(本地/网络/内存)和使用场景(音乐/游戏/编辑)。后台播放需接入AVS
本文同步发表于微信公众号,微信搜索 程语新视界 即可关注,每个工作日都有文章更新
一、音频播放方式
开发中,音频播放是一个常见需求。但鸿蒙系统提供了多种音频播放API,可分为两大类:
1.1 按API类型分类
| 分类 | API | 语言 | 说明 |
|---|---|---|---|
| 高级播放器 | AVPlayer | ArkTS/JS | 集成解析、解码、输出全流程 |
| 低时延音效 | SoundPool | ArkTS/JS | 适合短促音效 |
| 专业输出 | AudioRenderer | ArkTS/JS | 仅PCM,需应用写入数据 |
| 音振协同 | AudioHaptic | ArkTS/JS | 音频+振动同步 |
| Native层 | OHAudio | Native C/C++ | 低时延,需Native开发 |
1.2 五种方式对比
| 方式 | 支持格式 | 适用场景 | 复杂度 | 特点 |
|---|---|---|---|---|
| AVPlayer | mp3、m4a等 | 音乐播放、流媒体 | 低 | 开箱即用,集成解码 |
| SoundPool | 短音频 | 音效、按键音 | 低 | 低时延,适合短音 |
| AudioRenderer | PCM | 专业音频处理 | 高 | 需写入PCM数据 |
| AudioHaptic | PCM + 振动 | 音振协同场景 | 中 | 音频+振动同步 |
| OHAudio | PCM | Native层开发 | 高 | C/C++接口,低时延 |
二、各播放方式详解
2.1 AVPlayer(推荐首选)
定位:集成了流媒体和本地资源解析、媒体资源解封装、音频解码和音频输出功能的全能播放器。
支持格式:mp3、m4a等常见音频格式(不支持直接播放PCM格式文件)
适用场景:
-
音乐播放器
-
任何需要播放普通音频文件的场景
优势:
-
开箱即用,无需关心解码细节
-
支持本地文件和网络流媒体
-
内置播放控制(播放、暂停、停止、跳转)
// AVPlayer使用示例
import { media } from '@kit.MediaKit';
let avPlayer = await media.createAVPlayer();
avPlayer.url = 'file:///data/storage/el2/base/haps/entry/files/song.mp3';
await avPlayer.prepare();
await avPlayer.play();
2.2 SoundPool(低时延音效)
定位:低时延的短音播放API,适用于播放急促简短的音效。
适用场景:
-
相机快门音效
-
按键音效
-
游戏射击音效
-
消息通知提示音
优势:
-
低延迟,响应快
-
支持同时播放多个音效
-
适合短音频
// SoundPool使用示例
import { media } from '@kit.MediaKit';
let soundPool = await media.createSoundPool(5); // 最多同时播放5个音效
let soundId = await soundPool.load('file:///data/sounds/shoot.mp3');
await soundPool.play(soundId);
2.3 AudioRenderer(专业音频输出)
定位:用于音频输出的ArkTS/JS API,仅支持PCM格式,需要应用持续写入音频数据。
适用场景:
-
需要预处理音频数据的场景
-
自定义音频处理(如变速、变调)
-
音频编辑应用
要求:
-
仅支持PCM格式
-
需要应用持续写入音频数据
-
需具备音频处理基础知识
// AudioRenderer使用示例
import { audio } from '@kit.AudioKit';
let audioRenderer = await audio.createAudioRenderer({
streamInfo: {
samplingRate: audio.AudioSamplingRate.SAMPLE_RATE_44100,
channels: audio.AudioChannel.CHANNEL_2,
sampleFormat: audio.AudioSampleFormat.SAMPLE_FORMAT_S16LE,
encodingType: audio.AudioEncodingType.ENCODING_TYPE_RAW
}
});
await audioRenderer.start();
// 持续写入PCM数据
await audioRenderer.write(buffer);
2.4 AudioHaptic(音振协同)
定位:用于音振协同播放的API,适用于需要在播放音频时同步发起振动的场景。
适用场景:
-
来电铃声随振
-
键盘按键反馈
-
消息通知反馈
-
游戏触感反馈
特点:
-
音频和振动同步播放
-
提供沉浸式体验
2.5 OHAudio(Native层输出)
定位:用于音频输出的Native API,同时支持普通音频通路和低时延通路。
适用场景:
-
依赖Native层实现音频输出功能的场景
-
需要极致性能的音频应用
-
C/C++开发的游戏或应用
优势:
-
Native层实现,性能更优
-
支持低时延通路
三、音频播放方式选择
3.1 按音频格式
| 音频格式 | 推荐方式 | 原因 |
|---|---|---|
| mp3、m4a、wav | AVPlayer | 内置解码,无需手动处理 |
| PCM | AudioRenderer / OHAudio | 直接支持PCM格式 |
| 短音效(任何格式) | SoundPool | 低时延,适合短音频 |
3.2 按资源来源
| 资源来源 | 推荐方式 | 原因 |
|---|---|---|
| 本地文件 | AVPlayer / SoundPool | 直接读取文件 |
| 网络流媒体 | AVPlayer | 内置流媒体解析 |
| 内存数据 | AudioRenderer | 可写入内存中的PCM数据 |
3.3 按使用场景
| 场景 | 推荐方式 | 原因 |
|---|---|---|
| 音乐播放器 | AVPlayer | 功能完善,支持控制 |
| 游戏音效 | SoundPool | 低时延,可多音效并发 |
| 音频编辑 | AudioRenderer | 可精确控制音频数据 |
| 来电振动 | AudioHaptic | 音振协同效果 |
| Native游戏 | OHAudio | C/C++接口,性能优 |
四、后台播放开发
应用如果需要在后台播放音频(包含熄屏播放音频),除了开发音频播放功能外,还需要根据自身业务场景选择接入AVSession或申请长时任务。
如果不满足接入规范,退至后台播放时会被系统静音并冻结,无法在后台正常播放。直到应用重新切回前台时,才会被解除静音并恢复播放。
后台播放规则
| 播放类型 | 流类型 | 要求 |
|---|---|---|
| 媒体类型 | STREAM_USAGE_MUSIC STREAM_USAGE_MOVIE STREAM_USAGE_AUDIOBOOK |
必须接入AVSession + 申请长时任务 |
| 游戏类型 | STREAM_USAGE_GAME | 必须接入AVSession + 申请长时任务 |
| 其他可感知播放任务 | 用户可感知的其他播放 | 必须申请AUDIO_PLAYBACK类型长时任务 |
AVSession接入
AVSession(音视频会话)用于:
-
在系统控制中心显示播放信息
-
支持媒体控制(播放/暂停/上一首/下一首)
-
统一管理媒体焦点
长时任务申请
| 任务类型 | 说明 |
|---|---|
| AUDIO_PLAYBACK | 音频播放类型长时任务 |
// 申请长时任务示例
import { backgroundTaskManager } from '@kit.BackgroundTasksKit';
let wantAgent = {
wants: [
{
bundleName: 'com.example.myapp',
abilityName: 'EntryAbility'
}
],
action: 'ohos.want.action.home'
};
backgroundTaskManager.startBackgroundRunning(this.context,
backgroundTaskManager.BackgroundMode.AUDIO_PLAYBACK, wantAgent);
详细的适配指南可参考:后台播放
更多推荐



所有评论(0)