鸿蒙开发-音频录制和音频播放

147 阅读1分钟

录制音频

配置文件

在调用手机麦克风时,需要在module.json5文件中进行声明权限

{
      "name":"ohos.permission.MICROPHONE",
      "usedScene": {},
      //申请原因描述,在string.json中进行配置
      "reason":"$string:EntryAbility_desc"
    }

完成声明权限后,还需向用户申请使用权限,若用户禁止使用麦克风,引导用户进行二次授权

import { abilityAccessCtrl, common, Want } from '@kit.AbilityKit'

const atManager = abilityAccessCtrl.createAtManager()
const result = await atManager.requestPermissionsFromUser(
  getContext(),
  ['ohos.permission.MICROPHONE']
)
if(result.authResults[0] == -1){
      const want: Want = {
        bundleName: 'com.huawei.hmos.settings',
        abilityName: 'com.huawei.hmos.settings.MainAbility',
        uri: 'application_info_entry',
        parameters: {
          // 修改成你的应用包名,跳转到该应用的设置页面
          pushParams: 'com.example.test'
        }
      }

      const uiContext = getContext() as common.UIAbilityContext
      // 调起手机设置中的当前应用设置面板
      uiContext.startAbility(want)
    }

录制流程及实现

  1. 开始录制
    1. 获取到文件保存的地址,并设置文件打开模式,若没有改文件则创建文件,然后以读写模式打开
    2. 配置录音文件配置对象,将url属性设置为文件保存地址
    3. 使用media.createAVRecorder()创建录音对象,并设置录音参数,使用start()方法开始录音
  2. 结束录制
    1. 使用stop()方法停止音频录制
    2. 使用release()方法销毁录音对象,释放空间

当成功录制后可在应用目录中查看到所保存的文件名称和文件大小

具体代码实现如下:

import fs from '@ohos.file.fs';
import { media } from '@kit.MediaKit'

export class recordAudioManager{
  //存储录音对象
  static avRecorder: media.AVRecorder
  
  //开始录音
  static async startRecord(){
    //获取文件保存地址
    recordAudioManager.filePath = getContext().filesDir + '/' + Date.now() + '.m4a'
    //打开文件保存地址并设置文件打开模式
    const file = fs.openSync(recordAudioManager.filePath, fs.OpenMode.CREATE | fs.OpenMode.READ_WRITE)
    //准备录音文件配置对象
    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}`  //文件地址
    }
    //创建录音对象
    recordAudioManager.avRecorder = await media.createAVRecorder()
    //设置录制参数
    await recordAudioManager.avRecorder.prepare(config)
    //开始录制
    await recordAudioManager.avRecorder.start()

  }
  //停止录音
  static async stopRecord(){
  //判断是否存在录制对象
    if (recordAudioManager.avRecorder){
      //停止录制
      recordAudioManager.avRecorder.stop()
      //销毁录制对象,释放空间
      recordAudioManager.avRecorder.release()
    }
  }
}

播放音频

  1. 开始播放
    1. 调用后传入所要播放的文件地址
    2. 首先定义播放对象
    3. 将参数中的播放地址传入播放对象
    4. 使用on()方法监听播放对象的状态变化,当状态发生变化时,触发回调函数进行播放
  2. 停止播放
    1. 使用stop()方法停止播放

具体代码实现如下:

import { media } from '@kit.MediaKit'

play: media.AVPlayer = Object()

async playAudio(url: string){
    //定义播放对象
    this.play = await media.createAVPlayer()
    //判断播放对象状态,当状态改变时触发回调函数
    this.play.on( "stateChange",(state)=>{
      //播放对象初始化完成后,进入准备播放状态
      if(state == 'initialized') this.play.prepare()
      //播放对象准备完成后,开始播放
      if(state == 'prepared'){
        //开启循环播放
        this.play.loop = true
        //开始播放
        this.play.play()
      }
    })
    //设置播放文件地址
    this.play.url = url

  }

  stopAudio(){
      //停止播放
      this.play.stop()
  }