【鸿蒙实战开发】HarmonyOS音频播放

音频播放开发概述

如何选择音频播放开发方式

系统提供了多样化的API,来帮助开发者完成音频播放的开发,不同的API适用于不同音频数据格式、音频资源来源、音频使用场景,甚至是不同开发语言。因此,选择合适的音频播放API,有助于降低开发工作量,实现更佳的音频播放效果。

  • AudioRenderer:用于音频输出的ArkTS/JS API,仅支持PCM格式,需要应用持续写入音频数据进行工作。应用可以在输入前添加数据预处理,如设定音频文件的采样率、位宽等,要求开发者具备音频处理的基础知识,适用于更专业、更多样化的媒体播放应用开发。

  • AudioHaptic:用于音振协同播放的ArkTS/JS API,适用于需要在播放音频时同步发起振动的场景,如来电铃声随振、键盘按键反馈、消息通知反馈等。

  • OpenSL ES:一套跨平台标准化的音频Native API,同样提供音频输出能力,仅支持PCM格式,适用于从其他嵌入式平台移植,或依赖在Native层实现音频输出功能的播放应用使用。

  • OHAudio:用于音频输出的Native API,此API在设计上实现归一,同时支持普通音频通路和低时延通路。仅支持PCM格式,适用于依赖Native层实现音频输出功能的场景。

除上述方式外,也可以通过Media Kit实现音频播放。

  • AVPlayer:用于音频播放的ArkTS/JS API,集成了流媒体和本地资源解析、媒体资源解封装、音频解码和音频输出功能。可用于直接播放mp3、m4a等格式的音频文件,不支持直接播放PCM格式文件。

  • SoundPool:低时延的短音播放ArkTS/JS API,适用于播放急促简短的音效,如相机快门音效、按键音效、游戏射击音效等。

开发音频播放应用须知

应用如果要实现后台播放或熄屏播放,需要同时满足:

  1. 使用媒体会话功能注册到系统内统一管理,否则在应用进入后台时,播放将被强制停止。具体参考AVSession Kit开发指导。

  2. 申请长时任务避免进入挂起(Suspend)状态。具体参考长时任务开发指导。

当应用进入后台,播放被中断,如果被媒体会话管控,将打印日志“pause id”;如果没有该日志,则说明被长时任务管控。

使用AudioRenderer开发音频播放功能

AudioRenderer是音频渲染器,用于播放PCM(Pulse Code Modulation)音频数据,相比AVPlayer而言,可以在输入前添加数据预处理,更适合有音频开发经验的开发者,以实现更灵活的播放功能。

开发指导

使用AudioRenderer播放音频涉及到AudioRenderer实例的创建、音频渲染参数的配置、渲染的开始与停止、资源的释放等。本开发指导将以一次渲染音频数据的过程为例,向开发者讲解如何使用AudioRenderer进行音频渲染,建议搭配AudioRenderer的API说明阅读。

下图展示了AudioRenderer的状态变化,在创建实例后,调用对应的方法可以进入指定的状态实现对应的行为。需要注意的是在确定的状态执行不合适的方法可能导致AudioRenderer发生错误,建议开发者在调用状态转换的方法前进行状态检查,避免程序运行产生预期以外的结果。

为保证UI线程不被阻塞,大部分AudioRenderer调用都是异步的。对于每个API均提供了callback函数和Promise函数,以下示例均采用callback函数。

图1 AudioRenderer状态变化示意图

image.png

在进行应用开发的过程中,建议开发者通过on(‘stateChange’)方法订阅AudioRenderer的状态变更。因为针对AudioRenderer的某些操作,仅在音频播放器在固定状态时才能执行。如果应用在音频播放器处于错误状态时执行操作,系统可能会抛出异常或生成其他未定义的行为。

  • prepared状态: 通过调用createAudioRenderer()方法进入到该状态。

  • running状态: 正在进行音频数据播放,可以在prepared状态通过调用start()方法进入此状态,也可以在paused状态和stopped状态通过调用start()方法进入此状态。

  • paused状态: 在running状态可以通过调用pause()方法暂停音频数据的播放并进入paused状态,暂停播放之后可以通过调用start()方法继续音频数据播放。

  • stopped状态: 在paused/running状态可以通过stop()方法停止音频数据的播放。

  • released状态: 在prepared、paused、stopped等状态,用户均可通过release()方法释放掉所有占用的硬件和软件资源,并且不会再进入到其他的任何一种状态了。

开发步骤及注意事项

  1. 配置音频渲染参数并创建AudioRenderer实例,音频渲染参数的详细信息可以查看AudioRendererOptions。
import { audio } from '@kit.AudioKit';

let audioStreamInfo: audio.AudioStreamInfo = {
  samplingRate: audio.AudioSamplingRate.SAMPLE_RATE_48000, // 采样率
  channels: audio.AudioChannel.CHANNEL_2, // 通道
  sampleFormat: audio.AudioSampleFormat.SAMPLE_FORMAT_S16LE, // 采样格式
  encodingType: audio.AudioEncodingType.ENCODING_TYPE_RAW // 编码格式
};

let audioRendererInfo: audio.AudioRendererInfo = {
  usage: audio.StreamUsage.STREAM_USAGE_VOICE_COMMUNICATION,
  rendererFlags: 0
};

let audioRendererOptions: audio.AudioRendererOptions = {
  streamInfo: audioStreamInfo,
  rendererInfo: audioRendererInfo
};

audio.createAudioRenderer(audioRendererOptions, (err, data) => {
  if (err) {
    console.error(`Invoke createAudioRenderer failed, code is ${err.code}, message is ${err.message}`);
    return;
  } else {
    console.info('Invoke createAudioRenderer succeeded.');
    let audioRenderer = data;
  }
});
  1. 调用on(‘writeData’)方法,订阅监听音频数据写入回调。
import { BusinessError } from '@kit.BasicServicesKit';
import { fileIo } from '@kit.CoreFileKit';
### HarmonyOS音频解码开发教程 #### 1. 准备工作 为了在 HarmonyOS 上进行音频解码开发开发者需先安装并配置好 Deveco Studio 开发环境[^1]。该集成开发环境中提供了创建、编译以及调试应用程序所需的各种工具。 #### 2. 使用 SystemCapability 进行音频处理 根据 OpenHarmony 的官方文档,在实现音频解码功能时会涉及到 `SystemCapability.Multimedia.Audio` 模块中的多个 API 接口调用[^2]。这些接口允许访问底层硬件资源来完成音轨读取、格式转换等任务。 #### 3. 创建 AudioRenderer 对象实例化渲染器 通过如下代码片段可初始化一个用于播放经过解码后的 PCM 数据流的对象: ```typescript import audio from '@ohos.multimedia.audio'; let rendererOptions = { sampleRate: 44100, channels: 2, format: 'PCM_16B' }; const myAudioRenderer = await audio.createAudioRenderer(rendererOptions); ``` 此处设置采样率为 44.1kHz 双声道 16bit 编码方式作为例子参数传递给构造函数。 #### 4. 解码音频文件并发送至 Renderer 当获取到目标媒体源之后(比如本地存储路径),可以通过内置或第三方库解析其编码格式,并将其转化为适合上述 Render 器接收的数据形式。下面是一个简单的伪代码表示法说明这一过程: ```typescript // 加载音频文件并准备解码... for (chunk of decodedDataChunks) { try { let writtenBytesCount = await myAudioRenderer.write(chunk.buffer); console.log(`Wrote ${writtenBytesCount} bytes`); } catch (error) { console.error('Failed to write data:', error.message); } } ``` 此部分逻辑依赖具体使用的解码方案而定;如果是 MP3 或 AAC 类型,则建议采用成熟的开源项目如 FFmpeg 来辅助完成这项工作。 #### 5. 控制与管理 最后还需要考虑一些额外的功能需求,像暂停/恢复、调整音量大小等功能都可以基于已有的 API 实现。同时也要注意监听可能出现的状态变化事件以便及时响应异常情况的发生。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值