本文同步发表于微信公众号,微信搜索 程语新视界 即可关注,每个工作日都有文章更新

一、音频播放方式

   开发中,音频播放是一个常见需求。但鸿蒙系统提供了多种音频播放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);

详细的适配指南可参考:后台播放

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐