应用场景
在一些应用中,我们可能需要用到录音功能,记录用户的对话,阅读,或者唱歌。不过录音需要用到麦克风权限。在上一篇文章中,我们已经通过封装的通用权限工具,获取到了麦克风的权限,如果不清除可以点击跳转
鸿蒙中封装一个通用的权限工具-弹窗请求授权和二次授权
https://blog.csdn.net/weixin_50513060/article/details/146428205?fromshare=blogdetail&sharetype=blogdetail&sharerId=146428205&sharerefer=PC&sharesource=weixin_50513060&sharefrom=from_link
核心API
使用 AvRecorder 实现音频录制存储到应用沙箱。
下面是一个简单的录制流程,不考虑暂停或重录。
创建AVRecorder实例,实例创建完成进入idle状态。
设置业务需要的监听事件,监听状态变化及错误上报。
配置音频录制参数,调用prepare()接口,此时进入prepared状态。
开始录制,调用start()接口,此时进入started状态。
停止录制,调用stop()接口,此时进入stopped状态。
销毁实例,调用release()进入released状态,退出录制。
准备页面结构
这里准备两个按钮,一个用来开始录制,一个用来结束录制,用轻提示提醒录制开始或结束。
// 开始录制方法
startRecord() {
}
// 停止录制方法
stopRecord() {
}
build() {
Column({ space: 10 }) {
Button('开始录制')
.onClick(() => {
this.startRecord()
promptAction.showToast({ message: '开始录制' })
})
Button('停止录制')
.onClick(() => {
this.stopRecord()
promptAction.showToast({ message: '停止录制' })
})
}
.justifyContent(FlexAlign.Center)
.height('100%')
.width('100%')
}
录制方法步骤
首先准备上下文对象,用来创建一个文件路径filePath
再使用 fileIo 创建或打开这个文件,并记录文件的 fd 用于后续关闭文件
准备录音配置对象,基本属于固定写法
创建 avRecorder 实例对象,等待实例根据录音配置对象准备完成
开始录音,并记录下avRecorder实例用于后续停止录音
点击停止录音,判断是否存在avRecorder实例,存在再关闭并释放资源。
现在我们实现这两个方法
avRecorder?: media.AVRecorder
fd?: number
filePath?: string
// 开始录制方法
async startRecord() {
// 1. 准备一个文件接收录音
const ctx = getContext(this)
// 创建一个唯一的文件路径
const filePath = ctx.filesDir + '/' + Date.now() + '.m4a'
this.filePath = filePath
// 借助 fileIo 创建或打开这个文件
const file = fileIo.openSync(filePath, fileIo.OpenMode.CREATE | fileIo.OpenMode.READ_WRITE)
// 记录文件的 fd,用来关闭文件
this.fd = file.fd
// 2. 准备录音配置对象 基本固定写法
const config: media.AVRecorderConfig = {
audioSourceType: media.AudioSourceType.AUDIO_SOURCE_TYPE_MIC,
profile: {
audioBitrate: 100000, // 音频比特率
audioChannels: 1, // 音频声道数
audioCodec: media.CodecMimeType.AUDIO_AAC, // 音频编码格式,当前只支持aac
audioSampleRate: 48000, // 音频采样率
fileFormat: media.ContainerFormatType.CFT_MPEG_4A, // 封装格式,当前只支持m4a
},
url: fd://${file.fd}
}
// 3. 开始录制
const avRecorder = await media.createAVRecorder()
// 等待 prepare 完成
await avRecorder.prepare(config)
// 开始录制
await avRecorder.start()
// 记录 avRecorder,用来停止录制和释放
this.avRecorder = avRecorder
}
// 停止录制方法
async stopRecord() {
// 判断是否有 正在录制
if (this.avRecorder) {
// 停止录制
await this.avRecorder.stop()
// 释放 avRecorder 和 关闭文件
await this.avRecorder.release()
fileIo.closeSync(this.fd)
}
}
然后就可以点击开始录制,录制一段时间和点击停止,会产出一个文件,找到该文件的具体方法是如下。将该文件保存在桌面,可以使用播放器播放。
包名就是你创建项目的时候定义的。
保存到电脑上
可以暂时保存到桌面,当然这是随意的。
点击即可播放
好的,下一篇文章我们再给录音组件做一个可视化的振幅,可以根据声音的大小来实时变化。