注:适用版本(HarmonyOS NEXT/5.0/API12+)
1. 概述
在HarmonyOS应用开发中,AvRecorder
是多媒体模块提供的重要组件,可用于实现音频/视频录制功能。本文将详细介绍如何使用AvRecorder实现纯音频录制功能。
图看不懂没关系,接下来让我们一起动起手来!
2. 开发准备
2.1 环境要求
-
DevEco Studio 3.1+
-
HarmonyOS SDK API 9+ (高点也行,不影响功能即可)
-
支持音频功能的真机设备(模拟器有些电脑不支持)
2.2 权限配置
{
"module": {
"requestPermissions": [
{
"name": "ohos.permission.MICROPHONE"
},
{
"name": "ohos.permission.WRITE_MEDIA"
}
]
}
}
3. 实现步骤
- 开始录音 startRecord
- 需要一个文件接收音频数据
- 准备录音配置对象
- 使用 AvRecorder 实现开始录音
- 创建avRecorder对象
- 开始录制
- 准备
- 结束录音 stopRecord
- 结束/释放/关闭文件
// 1. 权限列表
permissions: Permissions[] = ['ohos.permission.MICROPHONE']
confirmConfig: promptAction.ShowDialogOptions = {
title: "温馨提示",
message: "未授权使用麦克风将无法使用该面试录音功能,是否前往设置进行授权?",
buttons: [
{ text: '离开', color: $r('app.color.common_gray_01') },
{ text: '去授权', color: $r('app.color.black') }
]
@State list: InterViewAudioItem[] = []
async aboutToAppear() {
// 1. 获取录音权限
await this.getPermission()
// 2. 初始化数据库
await audioDB.initStore()
// 3. 查询录音列表
this.getRecordList()
}
/**
* 获取麦克风权限
*/
async getPermission(){
try {
// 1. 第一次拉起授权
const isOk1 = await permission.requestPermissions(this.permissions)
if(isOk1) return
// 2. 弹窗再次确认
const res = await promptAction.showDialog(this.confirmConfig)
if(res.index === 1){
// 3. 二次授权
const isOk2 = await permission.openPermissionSetting(this.permissions)
if(isOk2) return
}
router.back()
}catch (e) {
promptAction.showToast({message: '用户授权出现问题'})
router.back()
}
}
开始录音 最终调用
/**
* 开始录音
*/
async startRecord(){
// 1. 创建一个音频接收对象
const avRecorder = await media.createAVRecorder()
// 2. 开始准备
const ctx = getContext(this)
const filePath = ctx.filesDir + '/' + Date.now() + '.m4a'
const file = fileIo.openSync(filePath, fileIo.OpenMode.CREATE | fileIo.OpenMode.READ_WRITE)
this.fd = file.fd
const avConfig: media.AVRecorderConfig = {
audioSourceType: media.AudioSourceType.AUDIO_SOURCE_TYPE_MIC, // 音频输入源,这里设置为麦克风
profile: {
audioBitrate: 100000, // 音频比特率
audioChannels: 2, // 音频声道数
audioCodec: media.CodecMimeType.AUDIO_AAC, // 音频编码格式,当前支持ACC,MP3,G711MU
audioSampleRate: 48000, // 音频采样率
fileFormat: media.ContainerFormatType.CFT_MPEG_4A, // 封装格式,当前支持MP4,M4A,MP3,WAV
},
url: `fd://${file.fd}`, // 参考应用文件访问与管理中的开发示例获取创建的音频文件fd填入此处
};
await avRecorder.prepare(avConfig)
await avRecorder.start()
this.avRecorder = avRecorder
}
/**
* 结束录音
*/
async stopRecord(){
if (this.avRecorder) {
await this.avRecorder.stop()
await this.avRecorder.release()
fileIo.closeSync(this.fd)
}
}
在这里要切记容易出现的bug,本人就曾踩雷!
Button('开始录音')
.onClick(() => {
this.startRecord()
})
Button('结束录音')
.onClick(() => {
//不要误把 stopRecord 写成 startRecord
this.stopRecord()
})
4.注意事项与常见问题
-
确保正确配置麦克风权限
-
文件存储路径需要应用有写入权限
-
不同设备支持的编码格式可能不同,需做好兼容处理
5.总结
通过本文可以掌握HarmonyOS中音频录制的基本实现方法。实际开发中需要注意:
-
合理的异常处理机制
-
不同设备的兼容性适配
-
及时释放资源防止内存泄漏
建议结合官方文档进行参数调优,以达到更好的录音效果。
测试建议:录制完成后可通过系统文件管理器查看/data/storage/el2/base/cache/
目录下的.aac
文件,使用媒体播放器验证录音效果。