往期知识点整理
- 鸿蒙(HarmonyOS)北向开发知识点记录~
- 【鸿蒙UI实战开发】基于List和Scroller由简单到复杂列表布局开发实践
- 【鸿蒙UI实战开发】基于原生能力的键盘控制
- 【鸿蒙UI实战开发】基于ArkUI现有能力实现自定义弹窗封装方案
- 【鸿蒙ArkUI实战】基于ImageKit对图片进行处理
- 【鸿蒙ArkUI开发】基于ArkUI的验证码实现
- 【鸿蒙ArkUI实战开发】基于原生能力的深色模式适配
- 【鸿蒙实战开发】基于自定义注解和代码生成实现路由框架
- 【鸿蒙实战开发】基于ohpm的.ohpmrc仓库访问配制
- 【鸿蒙实战开发】基于C++能力的资源访问
- 【鸿蒙实战开发】基于Drawing的图形/文字绘制及双缓冲模拟实现刷新
- 【鸿蒙实战开发】基于napi_load_module_with_info实现的napi调用arkts的接口
- 【鸿蒙实战开发】基于AudioRenderer音频播放
- 持续更新中……
方案选择
如何选择音频播放开发方式
- AudioRenderer :用于音频输出的ArkTS/JS API,仅支持PCM格式,需要应用持续写入音频数据进行工作。应用可以在输入前添加数据预处理,如设定音频文件的采样率、位宽等,要求开发者具备音频处理的基础知识,适用于更专业、更多样化的媒体播放应用开发。
- AVPlayer :用于音频播放的ArkTS/JS API,集成了流媒体和本地资源解析、媒体资源解封装、音频解码和音频输出功能。可用于直接播放wav、mp3、m4a等格式的音频文件。
在播放音频方面用的最多的就是系统提供的AudioRenderer和AVPlayer。AudioRenderer是音频渲染器,用于播放PCM(Pulse Code Modulation)音频数据,相比AVPlayer而言,可以在输入前添加数据预处理,更适合有音频开发经验的开发者,以实现更灵活的播放功能。使用AudioRenderer播放音频涉及到AudioRenderer实例的创建、音频渲染参数的配置、渲染的开始与停止、资源的释放等。
方案描述
使用AudioRenderer播放音频
配置音频渲染参数并创建AudioRenderer实例。在创建AudioRenderer实例之前可以先设置音频流信息AudioStreamInfo,音频流信息如下:
名称 | 类型 | 必填 | 说明 |
---|---|---|---|
samplingRate | AudioSamplingRate | 是 | 音频文件的采样率。 |
channels | AudioChannel | 是 | 音频文件的通道数。 |
sampleFormat | AudioSampleFormat | 是 | 音频采样格式。 |
encodingType | AudioEncodingType | 是 | 音频编码类型。 |
其中编码模式只支持PCM编码,所以代码里默认是ENCODING_TYPE_RAW。
然后是设置音频渲染器信息,音频渲染器信息如下:
名称 | 类型 | 必填 | 说明 |
---|---|---|---|
usage | StreamUsage | 是 | 音频流使用类型。 |
rendererFlags | number | 是 | 音频文件的通道数。 |
其中rendererFlags,0代表普通音频渲染器,1代表低时延音频渲染器。ArkTS接口暂不支持低时延音频渲染器,所以默认为0。
let audioStreamInfo: audio.AudioStreamInfo = {
samplingRate: audio.AudioSamplingRate[this.samplingRate], // 采样率
channels: audio.AudioChannel[this.channels], // 通道
sampleFormat: audio.AudioSampleFormat[this.sampleFormat], // 采样格式
encodingType: audio.AudioEncodingType.ENCODING_TYPE_RAW // 编码格式
}
let audioRendererInfo: audio.AudioRendererInfo = {
usage: audio.StreamUsage[this.usage], // 音频流使用类型
rendererFlags: 0 // 音频渲染器标志
}
let audioRendererOptions: audio.AudioRendererOptions = {
streamInfo: audioStreamInfo,
rendererInfo: audioRendererInfo
}
select提供下拉选择菜单,可以让用户在多个选项之间选择,和text组件一起使用就可以实现让用户自由选择配置信息的能力,这里以采样率下拉菜单为例子。
Text('采样率')
.fontSize(16)
.fontWeight(FontWeight.Bold)
.textAlign(TextAlign.End)
.margin({ right: 4 })
Select([{ value: 'SAMPLE_RATE_8000' },
{ value: 'SAMPLE_RATE_11025' },
{ value: 'SAMPLE_RATE_12000' },
{ value: 'SAMPLE_RATE_16000' },
{ value: 'SAMPLE_RATE_22050' },
{ value: 'SAMPLE_RATE_24000' },
{ value: 'SAMPLE_RATE_32000' },
{ value: 'SAMPLE_RATE_44100' },
{ value: 'SAMPLE_RATE_48000' },
{ value: 'SAMPLE_RATE_64000' },
{ value: 'SAMPLE_RATE_88200' },
{ value: 'SAMPLE_RATE_96000' },
{ value: 'SAMPLE_RATE_176400' },
{ value: 'SAMPLE_RATE_192000' },])
.selected(this.index)
.value(this.samplingRate)
.font({ size: 16, weight: 500 })
.fontColor('#182431')
.selectedOptionFont({ size: 16, weight: 400 })
.optionFont({ size: 16, weight: 400 })
.space(this.space)
.arrowPosition(this.arrowPosition)
.menuAlign(MenuAlignType.START, { dx: 0, dy: 0 })
.optionWidth(200)
.optionHeight(300)
.onSelect((index: number, text?: string | undefined) => {
console.info('Select:' + index)
this.index = index;
if (text) {
this.samplingRate = text;
if (samplingRateData.get(this.samplingRate)) {
this.samplingRate1 = samplingRateData.get(this.samplingRate)
}
}
})
- 调用on(‘writeData’)方法,订阅监听音频数据写入回调。
import { BusinessError } from '@ohos.base';
import fs from '@ohos.file.fs';
let bufferSize: number = 0;
class Options {
offset?: number;
length?: number;
}
let path = getContext().cacheDir;
//确保该路径下存在该资源
let filePath = path + '/result_48000_1.pcm';
let file: fs.File = fs.openSync(filePath, fs.OpenMode.READ_ONLY);
let writeDataCallback = (buffer: ArrayBuffer) => {
let options: Options = {
offset: bufferSize,
length: buffer.byteLength
}
fs.readSync(file.fd, buffer, options);
bufferSize += buffer.byteLength;
}
audioRenderer.on('writeData', writeDataCallback);
- 调用start()方法进入running状态,开始渲染音频。
import { BusinessError } from '@ohos.base';
audioRenderer.start((err: BusinessError) => {
if (err) {
console.error(`Renderer start failed, code is ${err.code}, message is ${err.message}`);
} else {
console.info('Renderer start success.');
}
});
- 调用stop()方法停止渲染。
import { BusinessError } from '@ohos.base';
audioRenderer.stop((err: BusinessError) => {
if (err) {
console.error(`Renderer stop failed, code is ${err.code}, message is ${err.message}`);
} else {
console.info('Renderer stopped.');
}
});
- 调用release()方法销毁实例,释放资源。
import { BusinessError } from '@ohos.base';
audioRenderer.release((err: BusinessError) => {
if (err) {
console.error(`Renderer release failed, code is ${err.code}, message is ${err.message}`);
} else {
console.info('Renderer released.');
}
});
select下拉菜单的展示效果图
总是有很多小伙伴反馈说:鸿蒙开发不知道学习哪些技术?不知道需要重点掌握哪些鸿蒙开发知识点? 为了解决大家这些学习烦恼。在这准备了一份很实用的鸿蒙全栈开发学习路线与学习文档给大家用来跟着学习。
针对一些列因素,整理了一套纯血版鸿蒙(HarmonyOS Next)全栈开发技术的学习路线,包含了鸿蒙开发必掌握的核心知识要点,内容有(OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、OpenHarmony驱动开发、系统定制移植……等)技术知识点。
《鸿蒙 (Harmony OS)开发学习手册》(共计892页):https://gitcode.com/HarmonyOS_MN/733GH/overview
如何快速入门?
1.基本概念
2.构建第一个ArkTS应用
3.……
开发基础知识:
1.应用基础知识
2.配置文件
3.应用数据管理
4.应用安全管理
5.应用隐私保护
6.三方应用调用管控机制
7.资源分类与访问
8.学习ArkTS语言
9.……
基于ArkTS 开发
1.Ability开发
2.UI开发
3.公共事件与通知
4.窗口管理
5.媒体
6.安全
7.网络与链接
8.电话服务
9.数据管理
10.后台任务(Background Task)管理
11.设备管理
12.设备使用信息统计
13.DFX
14.国际化开发
15.折叠屏系列
16.……
鸿蒙开发面试真题(含参考答案):https://gitcode.com/HarmonyOS_MN/733GH/overview
OpenHarmony 开发环境搭建
《OpenHarmony源码解析》:https://gitcode.com/HarmonyOS_MN/733GH/overview
- 搭建开发环境
- Windows 开发环境的搭建
- Ubuntu 开发环境搭建
- Linux 与 Windows 之间的文件共享
- ……
- 系统架构分析
- 构建子系统
- 启动流程
- 子系统
- 分布式任务调度子系统
- 分布式通信子系统
- 驱动子系统
- ……