当前位置:   article > 正文

AudioCapturer和AudioRender操作音频,鸿蒙星河版API(11)

audiocapturer

AudioCapturer是音频采集器,用于录制PCM(Pulse Code Modulation)音频数据,适合有音频开发经验的开发者实现更灵活的录制功能。

使用AudioCapturer录制音频涉及到AudioCapturer实例的创建、音频采集参数的配置、采集的开始与停止、资源的释放等。该篇文章将以一次录制音频数据的过程为例,讲解如何使用AudioCapturer进行音频录制,建议搭配AudioCapturer的API说明阅读。

1、音频渲染器的配置

  1. private audioRendererInfo: audio.AudioRendererInfo = {
  2. usage: audio.StreamUsage.STREAM_USAGE_MOVIE, // 播放类型,MUSIC 表示用喇叭播放,MOVIE 也是喇叭播放,但是不容易卡顿
  3. rendererFlags: 0
  4. };
2、创建音频渲染器实例、配置录音权限
  1. // 音频渲染器实例
  2. private audioRenderer: audio.AudioRenderer | null = null
  3. // 录音权限
  4. private permissions: Permissions[] = ["ohos.permission.MICROPHONE"]

3、音频流配置

  1. private audioStreamInfo: audio.AudioStreamInfo = {
  2. samplingRate: audio.AudioSamplingRate.SAMPLE_RATE_48000, // 采样率
  3. channels: audio.AudioChannel.CHANNEL_2, // 通道
  4. sampleFormat: audio.AudioSampleFormat.SAMPLE_FORMAT_S16LE, // 采样格式
  5. encodingType: audio.AudioEncodingType.ENCODING_TYPE_RAW // 编码格式
  6. };

4、音频采集器配置

  1. private audioCapturerInfo: audio.AudioCapturerInfo = {
  2. source: audio.SourceType.SOURCE_TYPE_MIC,
  3. capturerFlags: 0
  4. };

5、音频采集器实例化、定义文件路径、创建时间

  1. // 音频采集器实例
  2. private audioCapturer: audio.AudioCapturer | null = null
  3. // 录音文件路径
  4. private filePath: string = ''
  5. // 录音创建时间
  6. private date_added: number = 0

6、录音权限获取

  1. // 初始化权限
  2. async requestPermissions() {
  3. // 申请权限
  4. const isAuth = await permissionManager.requestPermissions(this.permissions)
  5. // 如果未授权引导去设置页开启授权
  6. if (isAuth === false) {
  7. // 未开启弹窗提示
  8. const dialogRes = await promptAction.showDialog({
  9. alignment: DialogAlignment.Center,
  10. title: '温馨提示',
  11. message: '录音功能需要获取权限,请在系统设置中打开麦克风开关',
  12. buttons: [
  13. { text: '取消', color: $r('app.color.font_sub') },
  14. { text: '立即开启', color: $r('app.color.brand') }
  15. ]
  16. })
  17. // 打开设置页
  18. if (dialogRes.index === 1) {
  19. permissionManager.openPermissionSettingsPage()
  20. }
  21. }
  22. }

7、获取录音采集器实例

  1. // 获取音频采集器实例
  2. async getAudioCapturer() {
  3. // 如果已经存在,直接返回
  4. if (this.audioCapturer) {
  5. return this.audioCapturer
  6. }
  7. // 创建音频采集器
  8. const audioCapturer = await audio.createAudioCapturer({
  9. streamInfo: this.audioStreamInfo,
  10. capturerInfo: this.audioCapturerInfo
  11. })
  12. // 保存方便下次直接获取
  13. this.audioCapturer = audioCapturer
  14. // 返回音频采集器
  15. return audioCapturer
  16. }

8、开始录音

  1. // 开始录音
  2. async startCapturer(filePath: string) {
  3. // 根据 filePath 打开文件,可读可写模式,如果文件不存在自动创建
  4. const file = fileIo.openSync(filePath, fileIo.OpenMode.READ_WRITE | fileIo.OpenMode.CREATE)
  5. // 1. 获取音频采集器
  6. const audioCapturer = await this.getAudioCapturer()
  7. // 偏移值
  8. let bufferSize: number = 0
  9. // 2. 调用on('readData')方法,订阅监听音频数据读入回调
  10. audioCapturer.on('readData', (buffer) => {
  11. // 把采集的音频信息写入到打开的文件中
  12. fileIo.writeSync(file.fd, buffer, { offset: bufferSize, length: buffer.byteLength })
  13. // 累加偏移值
  14. bufferSize += buffer.byteLength
  15. // 测试用的,封装完成记得删除
  16. promptAction.showToast({ message: bufferSize.toString() })
  17. })
  18. // 3. 开始录音采集
  19. audioCapturer.start()
  20. // 保存录音文件路径
  21. this.filePath = filePath
  22. // 保存录音创建时间
  23. this.date_added = Date.now()
  24. }

9、结束录音

  1. async stopCapturer(): Promise<AudioInfo> {
  2. // 获取音频采集器
  3. const audioCapturer = await this.getAudioCapturer()
  4. await audioCapturer.stop() // 停止采集
  5. audioCapturer.release() // 释放资源
  6. this.audioCapturer = null // 重置采集器变量
  7. // 返回录音文件关键信息
  8. return {
  9. filePath: this.filePath, // 文件路径
  10. date_added: this.date_added, // 创建时间
  11. duration: Date.now() - this.date_added // 持续时长
  12. }
  13. }

10、定义音频渲染器

  1. // 获取音频渲染器(播放器)
  2. async getAudioRenderer() {
  3. if (this.audioRenderer) {
  4. return this.audioRenderer
  5. }
  6. this.audioRenderer = await audio.createAudioRenderer({
  7. streamInfo: this.audioStreamInfo,
  8. rendererInfo: this.audioRendererInfo
  9. })
  10. return this.audioRenderer
  11. }

11、播放录音

  1. // 播放录音
  2. async startRenderer(filePath: string) {
  3. // 根据路径打开文件
  4. const file = fileIo.openSync(filePath)
  5. // 获取文件信息,如果读取时已经超出文件大小,自动停止
  6. const stat = fileIo.statSync(file.fd)
  7. // 1. 获取音频渲染器(播放器)
  8. const audioRenderer = await this.getAudioRenderer()
  9. // 偏移值
  10. let bufferSize: number = 0
  11. // 2. 调用on('writeData')方法,订阅监听音频数据写入回调
  12. audioRenderer.on('writeData', async (buffer) => {
  13. fileIo.readSync(file.fd, buffer, { offset: bufferSize, length: buffer.byteLength })
  14. bufferSize += buffer.byteLength
  15. // 测试用的,封装完成记得删除
  16. promptAction.showToast({ message: bufferSize.toString() })
  17. if (bufferSize >= stat.size) {
  18. // 停止渲染器(播放器)
  19. await audioRenderer.stop() // 停止
  20. audioRenderer.release() // 释放资源
  21. this.audioRenderer = null // 清理变量
  22. }
  23. })
  24. // 3. 启动音频渲染器(播放器)
  25. audioRenderer.start()
  26. }

12、停止播放录音

  1. // 停止播放录音
  2. async stopRenderer() {
  3. // 获取音频渲染器(播放器)
  4. const audioRenderer = await this.getAudioRenderer()
  5. if (
  6. audioRenderer.state === audio.AudioState.STATE_RUNNING
  7. ||
  8. audioRenderer.state === audio.AudioState.STATE_PAUSED
  9. ) {
  10. await audioRenderer.stop() // 停止
  11. audioRenderer.release() // 释放资源
  12. this.audioRenderer = null // 清理变量
  13. }
  14. }

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号