ArkTS音频采集,音频采集的主要工作是通过输入设备将声音采集并转码为音频数据

ArkTS音频采集

HarmonyOS
2024-05-20 21:35:44
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
dickhome

音频采集的主要工作是通过输入设备将声音采集并转码为音频数据,同时对采集任务进行管理。audioRecorder 是音频录制管理类,用于管理和播放音频媒体。音频采集创建步骤如下:

1. 在录制前,防止audioRecorder被占用,先释放音频资源。

2. 通过createAudioRecorder 构建一个媒体录制实例,并开始订阅音频录制事件。录制事件回调类型,支持的事件包括:‘prepare’ | ‘start’ | ‘pause’ | ’resume‘ | ‘stop’ | ‘release’ | ‘reset’。

  • 设置’prepare’ 表示完成prepare()调用,音频录制参数设置完成,触发该事件。
  • 设置’start’表示完成start()调用,音频录制开始,触发该事件。
  • 设置’pause’表示完成pause()调用,音频暂停录制,触发该事件。
  • 设置’resume’表示完成resume()调用,音频恢复录制,触发该事件。
  • 设置’stop’表示完成stop()调用,音频停止录制,触发该事件。
  • 设置’release’表示完成release()调用,音频释放录制资源,触发该事件。
  • 设置’reset’表示完成reset()调用,音频重置为初始状态,触发该事件。
export default class RecordModel { 
  private tag: string = 'RecordModel' 
  private audioRecorder: media.AudioRecorder = undefined 
  initAudioRecorder(handleStateChange: () => void) { 
    this.release(); 
    this.audioRecorder = media.createAudioRecorder() 
    Logger.info(this.tag, 'create audioRecorder success') 
    //音频录制参数设置完成 
    this.audioRecorder.on('prepare', () => { 
      Logger.info(this.tag, 'setCallback  prepare case callback is called') 
      this.audioRecorder.start() 
    }) 
    //音频录制开始 
    this.audioRecorder.on('start', () => { 
      Logger.info(this.tag, 'setCallback start case callback is called') 
      handleStateChange() 
    }) 
    //音频停止录制 
    this.audioRecorder.on('stop', () => { 
      Logger.info(this.tag, 'audioRecorder stop called') 
      this.audioRecorder.release() 
    }) 
    //音频暂停录制 
    this.audioRecorder.on('pause', () => { 
      Logger.info(this.tag, 'audioRecorder pause finish') 
      handleStateChange() 
    }) 
    //音频恢复录制 
    this.audioRecorder.on('resume', () => { 
      Logger.info(this.tag, 'audioRecorder resume finish') 
      handleStateChange() 
    }) 
  } 
  //do something 
}

在调用audioRecorder方法前,先构造音频采集的参数audioConfig。

  • 设置audioEncodeBitRate支持音频编码比特率,默认值为48000。
  • 设置audioSampleRate支持音频采集采样率,默认值为48000。
  • 设置numberOfChannels支持音频采集声道数,默认值为2。
  • 设置location支持音频采集的地理位置。
  • 设置audioEncoderMime支持八种音频编码格式,media.CodecMimeType.AUDIO_AAC为表示音频/mp4a-latm类型。
  • 设置uri支持音频输出路径fd://xx (fd number),fb://为固定前缀,xx为资源句柄。文件需要由调用者创建,并赋予适当的权限。
let audioRecorderConfig = { 
  audioEncodeBitRate: 22050, 
  audioSampleRate: 22050, 
  numberOfChannels: 2, 
  location: { latitude: 30, longitude: 130 }, 
  audioEncoderMime: media.CodecMimeType.AUDIO_AAC, 
  fileFormat: media.ContainerFormatType.CFT_MPEG_4A, 
  uri: ''                              // fb路径由媒体库生成 
}

获取需要录制文件的fd地址,请参考媒体库之音频查询

设置音频采集的参数audioConfig中的输入路径uri,通过prepare(config: AudioRecorderConfig)做好录音准备。在’prepare’事件成功触发后,调用start方法开始录制音频。

startRecorder(pathName: string) { 
  Logger.info(this.tag, `startRecorder, pathName = ${pathName}`) 
  if (typeof (this.audioRecorder) !== 'undefined') { 
    Logger.info(this.tag, 'start prepare') 
    audioConfig.uri = pathName 
    this.audioRecorder.prepare(audioConfig) 
  } else { 
    Logger.error(this.tag, 'case failed, audioRecorder is null') 
  } 
}

录制过程还可以继续暂停录制,恢复录制,停止录制,释放资源等操作。

  • 通过pause()暂停录制,需要在’start’事件成功触发后,才能调用pause方法。
  • 通过resume()恢复录制,需要在’pause’事件成功触发后,才能调用resume方法。
  • 通过reset()重置录音,进行重置录音之前,需要先调用stop()停止录音。重置录音之后,需要调用prepare()设置录音参数项,才能再次进行录音。
  • 通过stop()停止录制。
pause() { 
  Logger.info(this.tag, 'audioRecorder pause called') 
  if (typeof (this.audioRecorder) !== `undefined`) { 
    this.audioRecorder.pause() 
  } 
} 
 
resume() { 
  Logger.info(this.tag, 'audioRecorder resume called') 
  if (typeof (this.audioRecorder) !== `undefined`) { 
    this.audioRecorder.resume() 
  } 
} 
 
release() { 
  if (typeof (this.audioRecorder) !== `undefined`) { 
    Logger.info(this.tag, 'audioRecorder  release') 
    this.audioRecorder.release() 
    this.audioRecorder = undefined 
  } 
} 
 
finish() { 
  if (typeof (this.audioRecorder) !== `undefined`) { 
    this.audioRecorder.stop() 
  } 
}
分享
微博
QQ
微信
回复
2024-05-21 17:33:56
相关问题
js采集声音出现问题怎么处理?
2116浏览 • 1回复 待解决
音频音频焦点请求和释放
440浏览 • 1回复 待解决
音频发声设备切换与查询
444浏览 • 1回复 待解决
是否有采集内存泄露工具
669浏览 • 1回复 待解决
相机有没有HDR模式采集
521浏览 • 1回复 待解决
相机是否支持HDR模式采集
499浏览 • 1回复 待解决
鸿蒙如何音频文件转成文本
3127浏览 • 1回复 待解决
AudioCapturer录音+AudioRenderer播放音频
593浏览 • 1回复 待解决
鸿蒙 如何使用 player 播放网络音频
5869浏览 • 1回复 已解决
使用AudioCapturer开发音频录制功能
534浏览 • 1回复 待解决
使用AudioRenderer开发音频播放功能
424浏览 • 1回复 待解决
音频播放长时任务不生效
441浏览 • 1回复 待解决
音频录制开发相关问题
4299浏览 • 1回复 待解决
SoundPool实现音频播放功能
544浏览 • 1回复 待解决