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

 应用场景

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


核心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)
    }
    }

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

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

    保存到电脑上

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

    点击即可播放

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

    最后编辑于
    ©著作权归作者所有,转载或内容合作请联系作者
    【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
    平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

    相关阅读更多精彩内容

    友情链接更多精彩内容