ASCF 在元服务里提供了录音能力,常见用途包括语音消息、语音备忘录和语音识别输入。它有两套接口:简单 API(has.startRecord/has.stopRecord)和 RecorderManager。简单 API 上手快,但最长只能录 1 分钟,且不能暂停;RecorderManager 支持暂停/继续、多格式和采样率配置,并且是全局单例,不需要 create/destroy。实际开发中建议优先使用 RecorderManager。
一、权限声明与授权
录音前必须声明麦克风权限。先在 module.json5 中配置:- {
- "requestPermissions": [
- { "name": "ohos.permission.MICROPHONE" }
- ]
- }
复制代码 然后在代码中请求 scope.record 授权:- has.authorize({
- scope: 'scope.record',
- success: () => { console.info('录音权限已授权'); },
- fail: (err) => { console.error('授权失败:', err); }
- });
复制代码 如果没有授权就调用录音,会直接进入 onError 回调,接入时要把授权失败分支处理掉。
二、RecorderManager 核心用法
获取实例:- const recorderManager = has.getRecorderManager();
复制代码 它是全局单例,和 BackgroundAudioManager 一样,不需要 create,也不需要 destroy。
开始录音可以配置时长、采样率、声道数、码率和格式:- recorderManager.start({
- duration: 60000,
- sampleRate: 16000,
- numberOfChannels: 1,
- encodeBitRate: 96000,
- format: 'aac'
- });
复制代码 其中 duration 单位是毫秒,sampleRate 是采样率,numberOfChannels 是声道数,encodeBitRate 是编码码率,format 可选择 aac、mp3、wav 等。
暂停、继续和停止:- recorderManager.pause(); // 暂停
- recorderManager.resume(); // 继续
- recorderManager.stop(); // 停止
复制代码 暂停后可以继续录音,停止后本次录音结束。
事件监听:- recorderManager.onStart(() => {
- console.info('录音开始');
- });
- recorderManager.onPause(() => {
- console.info('录音暂停');
- });
- recorderManager.onResume(() => {
- console.info('录音继续');
- });
- recorderManager.onStop((res) => {
- console.info('录音文件:', res.tempFilePath);
- console.info('时长:', res.duration, 'ms');
- console.info('大小:', res.fileSize, 'byte');
- });
- recorderManager.onError((res) => {
- console.error('录音错误:', res.errMsg);
- });
复制代码 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:- has.startRecord({
- success: (res) => {
- console.info('开始录音');
- }
- });
- has.stopRecord({
- success: (res) => {
- console.info('录音结束');
- }
- });
复制代码 简单 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 三种格式录音,录完可以即时播放确认。 |