查看: 243|回复: 0

鸿蒙ASCF录音API:RecorderManager开发与避坑

[复制链接]
发表于 1 小时前 | 显示全部楼层 |阅读模式
ASCF 在元服务里提供了录音能力,常见用途包括语音消息、语音备忘录和语音识别输入。它有两套接口:简单 API(has.startRecord/has.stopRecord)和 RecorderManager。简单 API 上手快,但最长只能录 1 分钟,且不能暂停;RecorderManager 支持暂停/继续、多格式和采样率配置,并且是全局单例,不需要 create/destroy。实际开发中建议优先使用 RecorderManager。

一、权限声明与授权
录音前必须声明麦克风权限。先在 module.json5 中配置:
  1. {
  2.   "requestPermissions": [
  3.     { "name": "ohos.permission.MICROPHONE" }
  4.   ]
  5. }
复制代码
然后在代码中请求 scope.record 授权:
  1. has.authorize({
  2.   scope: 'scope.record',
  3.   success: () => { console.info('录音权限已授权'); },
  4.   fail: (err) => { console.error('授权失败:', err); }
  5. });
复制代码
如果没有授权就调用录音,会直接进入 onError 回调,接入时要把授权失败分支处理掉。

二、RecorderManager 核心用法
获取实例:
  1. const recorderManager = has.getRecorderManager();
复制代码
它是全局单例,和 BackgroundAudioManager 一样,不需要 create,也不需要 destroy。

开始录音可以配置时长、采样率、声道数、码率和格式:
  1. recorderManager.start({
  2.   duration: 60000,
  3.   sampleRate: 16000,
  4.   numberOfChannels: 1,
  5.   encodeBitRate: 96000,
  6.   format: 'aac'
  7. });
复制代码
其中 duration 单位是毫秒,sampleRate 是采样率,numberOfChannels 是声道数,encodeBitRate 是编码码率,format 可选择 aac、mp3、wav 等。

暂停、继续和停止:
  1. recorderManager.pause(); // 暂停
  2. recorderManager.resume(); // 继续
  3. recorderManager.stop(); // 停止
复制代码
暂停后可以继续录音,停止后本次录音结束。

事件监听:
  1. recorderManager.onStart(() => {
  2.   console.info('录音开始');
  3. });
  4. recorderManager.onPause(() => {
  5.   console.info('录音暂停');
  6. });
  7. recorderManager.onResume(() => {
  8.   console.info('录音继续');
  9. });
  10. recorderManager.onStop((res) => {
  11.   console.info('录音文件:', res.tempFilePath);
  12.   console.info('时长:', res.duration, 'ms');
  13.   console.info('大小:', res.fileSize, 'byte');
  14. });
  15. recorderManager.onError((res) => {
  16.   console.error('录音错误:', res.errMsg);
  17. });
复制代码
onStop 返回 tempFilePath、duration(毫秒)和 fileSize(字节)。每个事件都有对应的 off 方法用于取消监听。

三、音频格式与参数搭配
语音消息建议 sampleRate 16000、encodeBitRate 96000、format aac;高质量录音建议 sampleRate 44100、encodeBitRate 128000、format mp3;语音识别建议 sampleRate 16000、encodeBitRate 128000、format wav;语音通话建议 sampleRate 8000、encodeBitRate 64000、format wav,并使用 audioSource voiceCommunication。
audioSource 可选 auto、mic、camcorder、voiceCommunication、voiceRecognition。做语音识别时使用 voiceRecognition,系统会对音频做优化处理,有利于提升识别率。

四、简单 API 的适用边界
只需要快速录一段短语音时,可以用简单 API:
  1. has.startRecord({
  2.   success: (res) => {
  3.     console.info('开始录音');
  4.   }
  5. });
  6. has.stopRecord({
  7.   success: (res) => {
  8.     console.info('录音结束');
  9.   }
  10. });
复制代码
简单 API 没有暂停功能,也没有格式配置,超过 1 分钟会自动停止。需要更长时间或更细粒度控制时,应改用 RecorderManager,原文提到其最大支持 10 分钟。

五、典型场景处理
语音消息录制时,在页面 onReady 中拿到 RecorderManager,并监听 onStop;回调里停止计时、把 isRecording 置为 false,然后把 tempFilePath 和 duration 交给发送逻辑。开始录音时可使用 duration 60000、sampleRate 16000、numberOfChannels 1、encodeBitRate 96000、format aac。
录音后播放确认时,先保存 onStop 返回的 tempFilePath,再通过 has.createInnerAudioContext() 创建播放器,设置 src 后 play,并在 onEnded 中 destroy。
语音识别输入建议用 WAV 格式录音:duration 30000、sampleRate 16000、numberOfChannels 1、encodeBitRate 128000、format wav。

六、常见踩坑
1. 简单 API 最多 1 分钟。has.startRecord 到时间会自动停止;要录更久必须换 RecorderManager。
2. duration 单位是毫秒。RecorderManager.start 的 duration 和 onStop 返回的 duration 都是毫秒,不是秒。如果按秒处理,显示会差 1000 倍。
3. fileSize 单位是字节。onStop 返回的 fileSize 是 byte,不是 kB;显示 kB 时需要除以 1024。
4. 暂停后 stop 不会丢录音。先 pause 再 stop,onStop 返回的是包含暂停前部分的完整录音,而不是只返回暂停后的片段。
5. 临时文件要尽快处理。tempFilePath 和拍照、选图类似,属于临时路径;需要长期保存时,应上传服务器或用文件 API 拷贝到永久目录。
6. 没有 saveAudioToPhotosAlbum。录音完成后如果要立即播放确认,可以用 InnerAudioContext 播放 tempFilePath;但保存到相册目前没有对应 API,只能上传或拷贝到永久目录。

七、API 速查
简单 API:has.startRecord、has.stopRecord。
RecorderManager 方法:start、pause、resume、stop。
RecorderManager 事件:onStart、onPause、onResume、onStop、onError,以及对应的 off 取消监听。

整体来看,ASCF 录音功能的主力是 RecorderManager。接入时重点确认权限、时长单位、文件大小单位、暂停后停止的行为,以及临时文件的生命周期。原文提到的 Demo 已注册到项目路由中,可在“接口”->“媒体”分类下找到“录音API”入口,支持 AAC、MP3、WAV 三种格式录音,录完可以即时播放确认。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

Hacking Group 021A

旗下站点

态势感知中心

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

官方邮箱:security#ihonker.org(#改成@)

官方核心成员

关注微信公众号

Archiver|手机版|小黑屋| ( 沪ICP备2021026908号 )

GMT+8, 2026-9-17 11:43 , Processed in 0.019050 second(s), 18 queries , Gzip On, Redis On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部