鸿蒙5.0开发【录音与音频渲染】

打印 上一主题 下一主题

主题 577|帖子 577|积分 1731

一、录音实现

利用AudioCapturer录制音频涉及到AudioCapturer实例的创建、音频采集参数的设置、采集的开始与停止、资源的开释等。建议搭配[AudioCapturer的API说明]阅读。
实现步调



  • 在module.json5中设置权限
  1. {
  2.   "module": {
  3.   ...
  4.     "requestPermissions": [
  5.     ...
  6.         // 麦克风
  7.         {
  8.           "name": "ohos.permission.MICROPHONE",
  9.           "reason": '$string:permission_reason_microphone',
  10.           "usedScene": {}
  11.         },
  12.     ]
  13.   }
  14. }
复制代码


  • 向用户申请调用麦克风权限
  1. /**
  2. * 动态申请授权(首次弹窗申请)
  3. * @param permissions 权限列表
  4. * @returns 返回授权结果,授权成功为 Promise.resolve(), 拒绝授权为 Promise.reject()
  5. */
  6. async requestPermissions(permissions: Permissions[]) {
  7.   // 1. 创建应用权限管理器
  8.   const atManager = abilityAccessCtrl.createAtManager()
  9.   // 2. 向用户申请 user_grant 权限(温馨提示:首次申请时会弹窗,后续申请则不会再出现弹窗)
  10.   const requestResult = await atManager.requestPermissionsFromUser(
  11.     getContext(), // 应用上下文
  12.     permissions   // 参数:权限列表(数组)
  13.   )
  14.   // 通过 every 检查权限是否都成功授权
  15.   const isAuth = requestResult.authResults.every(item => item === abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED)
  16.   // Promise.resolve()   返回 Promise 成功,await 后续代码,正常执行
  17.   // Promise.reject()    返回 Promise 错误,await 后续代码,不被执行,Promise.reject() 的结果可被 catch 捕获
  18.   return isAuth === true ? Promise.resolve(true) : Promise.reject(false)
  19. }
  20. /**
  21. * 打开系统设置的权限管理页(处理授权结果)
  22. */
  23. openPermissionSettingsPage() {
  24.   // 1. 获取应用上下文,并通过 as 断言收窄类型为 UIAbilityContext,否则 context 默认类型无法调用 startAbility 方法
  25.   const context = getContext() as common.UIAbilityContext
  26.   // 2. 获取 bundle 包信息
  27.   const bundleInfo = bundleManager.getBundleInfoForSelfSync(bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION)
  28.   // 3. 通过 startAbility 打开 系统设置 页
  29.   context.startAbility({
  30.     bundleName: 'com.huawei.hmos.settings', // 固定写法CV:设置页的包名
  31.     abilityName: 'com.huawei.hmos.settings.MainAbility', // 固定写法CV:设置页的 ability 名
  32.     uri: 'application_info_entry', // 固定写法CV:打开 设置->应用和元服务
  33.     parameters: {
  34.       // 打开指定应用(包)的详情页面
  35.       // pushParams: 'com.itheima.hm_guardian'
  36.       // 应用包名可通过 bundleManager 动态获取
  37.       pushParams: bundleInfo.name
  38.     }
  39.   })
  40. }
  41. // 初始化权限
  42. async requestPermissions() {
  43.   // 申请权限
  44.   try {
  45.     // 申请权限
  46.     await this.requestPermissions(["ohos.permission.MICROPHONE"])
  47.   } catch {
  48.     // 未开启弹窗提示
  49.     promptAction.showDialog({
  50.       alignment: DialogAlignment.Center,
  51.       title: '温馨提示',
  52.       message: '录音功能需要获取权限,请在系统设置中打开麦克风开关',
  53.       buttons: [
  54.         { text: '取消', color: $r('app.color.font_sub') },
  55.         { text: '立即开启', color: $r('app.color.brand') }
  56.       ]
  57.     })
  58.       .then((res) => {
  59.         // 打开设置页
  60.         if (res.index === 1) {
  61.           this.openPermissionSettingsPage()
  62.         }
  63.       })
  64.   }
  65. }
复制代码


  • 创建/获取音频采集器 关键API [audio.createAudioCapturer]
  1. // 音频采集器实例
  2. private audioCapturer: audio.AudioCapturer | null = null
  3. // 音频流配置
  4. private audioStreamInfo: audio.AudioStreamInfo = {
  5.   samplingRate: audio.AudioSamplingRate.SAMPLE_RATE_48000, // 采样率
  6.   channels: audio.AudioChannel.CHANNEL_2, // 通道
  7.   sampleFormat: audio.AudioSampleFormat.SAMPLE_FORMAT_S16LE, // 采样格式
  8.   encodingType: audio.AudioEncodingType.ENCODING_TYPE_RAW // 编码格式
  9. };
  10. // 音频采集器配置
  11. private audioCapturerInfo: audio.AudioCapturerInfo = {
  12.     source: audio.SourceType.SOURCE_TYPE_MIC, //音源类型:Mic音频源
  13.     capturerFlags: 0//音频采集器标志。0代表普通音频采集器,1代表低时延音频采集器。
  14. };
  15. //创建/获取音频采集器
  16. async getAudioCapturer() {
  17.   //如果有的话直接返回,避免占用系统资源
  18.   if (this.audioCapturer) {
  19.     return this.audioCapturer
  20.   }
  21.   //关键API  audio.createAudioCapturer
  22.   this.audioCapturer = await audio.createAudioCapturer({
  23.     streamInfo: this.audioStreamInfo,
  24.     capturerInfo: this.audioCapturerInfo
  25.   })
  26.   return this.audioCapturer
  27. }
复制代码


  • 开始录音
  1. /**
  2. * 开始录音采集
  3. * @param filePath 录音存放路径
  4. */
  5. async startRecorder(filePath: string) {
  6.   //  1) 打开文件,注意设置模式
  7.   const file = fileIo.openSync(filePath, fileIo.OpenMode.CREATE|fileIo.OpenMode.READ_WRITE)
  8.   // 1. 创建音频采集器
  9.   const audioCapturer = await this.getAudioCapturer()
  10.   // 2. 订阅(读取音频采集器的数据流,写入到打开的文件中)
  11.   audioCapturer.on('readData', (buffer) => {
  12.     //  2) 把 buffer 数据流,写入到打开的文件中
  13.     fileIo.writeSync(file.fd, buffer)
  14.   })
  15.   // 3. 开始
  16.   audioCapturer.start()
  17. }
复制代码


  • 结束录音
  1. // 结束录音采集
  2. async stopRecorder(): Promise<AudioInfo> {
  3.   // 获取音频采集器
  4.   const audioCapturer = await this.getAudioCapturer()
  5.   // 1. 停止录音
  6.   await audioCapturer.stop()
  7.   // 2. 释放资源和硬件占用
  8.   audioCapturer.release()
  9.   // 3. 释放变量,对象重新赋值为 null,可以被 垃圾回收机制 自动清理
  10.   this.audioCapturer = null
  11. }
复制代码
结束录音函数中最后需要做音频文件和音频数据持久化,以便后续展示和渲染音频。
二、音频渲染

利用AudioRenderer播放音频涉及到AudioRenderer实例的创建、音频渲染参数的设置、渲染的开始与停止、资源的开释等。建议搭配[AudioRenderer的API说明]阅读。
实现步调



  • 设置/获取音频渲染器 关键API [audio.createAudioRenderer]
  1. // 音频渲染器实例
  2. private audioRenderer: audio.AudioRenderer | null = null
  3. // 音频渲染器配置
  4. private audioRendererInfo: audio.AudioRendererInfo = {
  5.     usage: audio.StreamUsage.STREAM_USAGE_MOVIE, // 播放类型,MOVIE 表示用喇叭播放
  6.     rendererFlags: 0 //音频渲染器标志。0代表普通音频渲染器,1代表低时延音频渲染器
  7. };
  8. // 获取音频渲染器(播放器)
  9. async getAudioRenderer() {
  10.   if (this.audioRenderer) {
  11.     return this.audioRenderer
  12.   }
  13.   this.audioRenderer = await audio.createAudioRenderer({
  14.     streamInfo: this.audioStreamInfo,
  15.     rendererInfo: this.audioRendererInfo
  16.   })
  17.   return this.audioRenderer
  18. }
复制代码


  • 播放器渲染音频
  1. /**
  2. * 播放
  3. * @param filePath 音频文件路径
  4. */
  5. async startRenderer(filePath: string) {
  6.   //  1) 根据路径打开文件,获取文件信息
  7.   const file = fileIo.openSync(filePath)
  8.   const stat = fileIo.statSync(file.fd)
  9.   // 1. 获取音频渲染器(播放器)
  10.   const audioRenderer = await this.getAudioRenderer()
  11.   //  2) 准备累加值,用于自动停止
  12.   let bufferSize: number = 0
  13.   // 2. 调用on('writeData')方法,订阅监听音频数据写入回调
  14.   audioRenderer.on('writeData', async (buffer) => {
  15.     // 3) 把 buffer 信息写入到音频渲染器中
  16.     fileIo.readSync(file.fd, buffer)
  17.     // 获取文件信息,如果读取时已经超出文件大小,自动停止
  18.     bufferSize += buffer.byteLength
  19.     if (bufferSize >= stat.size) {
  20.       await audioRenderer.stop() // 停止渲染器(播放器)
  21.       audioRenderer.release() // 释放资源(硬件)
  22.       this.audioRenderer = null // 释放变量
  23.     }
  24.   })
  25.   // 3. 启动音频渲染器(播放器)
  26.   audioRenderer.start()
  27. }
复制代码


  • 停止播放录音
  1. // 停止播放录音
  2. async stopRenderer() {
  3.   // 获取音频渲染器(播放器)
  4.   const audioRenderer = await this.getAudioRenderer()
  5.   // RUNNING 和 PAUSED 状态下才能 stop,stop 后自动 release 释放资源(硬件)
  6.   if ([audio.AudioState.STATE_RUNNING, audio.AudioState.STATE_PAUSED].includes(this.audioRenderer!.state)) {
  7.     await audioRenderer.stop() // 停止渲染(播放)
  8.     audioRenderer.release() // 释放资源(硬件)
  9.     this.audioRenderer = null // 释放变量
  10.   }
  11. }
复制代码

最后呢,很多开发朋侪不知道需要学习那些鸿蒙技术?鸿蒙开发岗位需要掌握那些核心技术点?为此鸿蒙的开发学习必须要体系性的进行。
而网上有关鸿蒙的开发资料非常的少,假如你想学好鸿蒙的应用开发与体系底层开发。你可以参考这份资料,少走很多弯路,节省没必要的麻烦。由两位前阿里高级研发工程师联合打造的《鸿蒙NEXT星河版OpenHarmony开发文档》里面内容包罗了(ArkTS、ArkUI开发组件、Stage模子、多端摆设、分布式应用开发、音频、视频、WebGL、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、Harmony南向开发、鸿蒙项目实战等等)鸿蒙(Harmony NEXT)技术知识点
假如你是一名Android、Java、前端等等开发人员,想要转入鸿蒙方向发展。可以直接领取这份资料辅助你的学习。下面是鸿蒙开发的学习路线图。
​​​​

高清完整版请点击→《鸿蒙NEXT星河版开发学习文档》
针对鸿蒙发展路线打造的鸿蒙学习文档。话不多说,我们直接看具体资料鸿蒙(OpenHarmony )学习手册(共计1236页)与鸿蒙(OpenHarmony )开发入门讲授视频,资助各人在技术的道路上更进一步。
《鸿蒙 (OpenHarmony)开发学习视频》
《鸿蒙生态应用开发V2.0白皮书》
《鸿蒙 (OpenHarmony)开发基础到实战手册》
《鸿蒙开发基础》
《鸿蒙开发进阶》
《鸿蒙开发实战》

获取这份鸿蒙星河版学习资料,请点击→《鸿蒙NEXT星河版开发学习文档》
总结

鸿蒙—作为国家主力推送的国产操作体系。部分的高校已经取消了安卓课程,从而开设鸿蒙课程;企业纷纷跟进启动了鸿蒙研发。
而且鸿蒙是完全具备无与伦比的机遇和潜力的;预计到年底将有 5,000 款的应用完成原生鸿蒙开发,将来将会支持 50 万款的应用。那么这么多的应用需要开发,也就意味着需要有更多的鸿蒙人才。鸿蒙开发工程师也将会迎来爆发式的增长,学习鸿蒙势在必行!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

勿忘初心做自己

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表