HarmonyOS音频开发实战:使用AvRecorder实现录音功能

注:适用版本(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.注意事项与常见问题

  1. 确保正确配置麦克风权限

  2. 文件存储路径需要应用有写入权限

  3. 不同设备支持的编码格式可能不同,需做好兼容处理

5.总结

通过本文可以掌握HarmonyOS中音频录制的基本实现方法。实际开发中需要注意:

  1. 合理的异常处理机制

  2. 不同设备的兼容性适配

  3. 及时释放资源防止内存泄漏

建议结合官方文档进行参数调优,以达到更好的录音效果。

测试建议:录制完成后可通过系统文件管理器查看/data/storage/el2/base/cache/目录下的.aac文件,使用媒体播放器验证录音效果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值