鸿蒙中使用 AvRecorder-完成录音功能

135 阅读3分钟

 应用场景

在一些应用中,我们可能需要用到录音功能,记录用户的对话,阅读,或者唱歌。不过录音需要用到麦克风权限。在上一篇文章中,我们已经通过封装的通用权限工具,获取到了麦克风的权限,如果不清除可以点击跳转

鸿蒙中封装一个通用的权限工具-弹窗请求授权和二次授权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 实现音频录制存储到应用沙箱。

下面是一个简单的录制流程,不考虑暂停或重录。

  1. 创建AVRecorder实例,实例创建完成进入idle状态。
  2. 设置业务需要的监听事件,监听状态变化及错误上报。
  3. 配置音频录制参数,调用prepare()接口,此时进入prepared状态。
  4. 开始录制,调用start()接口,此时进入started状态。
  5. 停止录制,调用stop()接口,此时进入stopped状态。
  6. 销毁实例,调用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%')

}

录制方法步骤

  1. 首先准备上下文对象,用来创建一个文件路径filePath
  2. 再使用 fileIo 创建或打开这个文件,并记录文件的 fd 用于后续关闭文件
  3. 准备录音配置对象,基本属于固定写法
  4. 创建 avRecorder 实例对象,等待实例根据录音配置对象准备完成
  5. 开始录音,并记录下avRecorder实例用于后续停止录音
  6. 点击停止录音,判断是否存在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)

}

}

 然后就可以点击开始录制,录制一段时间和点击停止,会产出一个文件,找到该文件的具体方法是如下。将该文件保存在桌面,可以使用播放器播放。

​编辑

包名就是你创建项目的时候定义的。

​编辑

保存到电脑上

​编辑

可以暂时保存到桌面,当然这是随意的。 

​编辑

点击即可播放

​编辑

好的,下一篇文章我们再给录音组件做一个可视化的振幅,可以根据声音的大小来实时变化。

​编辑