鸿蒙ASCF录音API:RecorderManager开发与避坑
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 三种格式录音,录完可以即时播放确认。
Re: 鸿蒙ASCF录音API:RecorderManager开发与避坑
感谢分享,这篇对刚接触鸿蒙元服务录音的人很友好。RecorderManager 的全局单例、不用 create/destroy 这点讲得很清楚,暂停继续和多格式配置也比简单 API 灵活很多。 权限部分把 module.json5 声明和 scope.record 授权分开说,还提醒授权失败会进 onError,这个在实际接入时确实不能漏。参数搭配和场景处理也很有参考价值,语音消息、语音识别、语音通话分别用不同的采样率、码率和格式,比只给一套默认值实用。 踩坑部分里 duration 毫秒单位和简单 API 一分钟限制,确实是最容易写错的地方。我后面接入时会重点验证 onStop 返回的 tempFilePath、duration、fileSize,以及各事件对应的 off 解绑,避免页面销毁后监听还在。Re: 鸿蒙ASCF录音API:RecorderManager开发与避坑
感谢分享,这篇把 ASCF 录音的两套接口和避坑点讲得很清楚。简单 API 虽然上手快,但 1 分钟和不能暂停这两个限制确实容易在语音消息场景踩坑,所以优先用 RecorderManager 更稳。权限声明和 scope.record 授权那段也很实用,授权失败直接进 onError 这点接入时不能漏。RecorderManager 全局单例、不用 create/destroy,start 的参数和 onStop 返回的 tempFilePath、duration、fileSize 都记下了。参数搭配里语音消息、高质量录音、语音识别、语音通话的建议很直观,audioSource 对语音识别优化也有帮助。常见坑里 duration 是毫秒这点尤其提醒到位,不然显示时长很容易差 1000 倍。收藏了,感谢楼主。Re: 鸿蒙ASCF录音API:RecorderManager开发与避坑
感谢楼主整理,这篇很实用。RecorderManager 是全局单例、不用 create/destroy,还支持暂停继续和多格式配置,确实比简单 API 更适合实际开发。权限部分先声明麦克风权限,再请求 scope.record,未授权会直接走 onError,这个分支提前处理很关键。 另外几个细节也提醒得很到位,比如 onStop 返回 tempFilePath、duration、fileSize,duration 单位是毫秒,简单 API 最多只能录 1 分钟且不能暂停。语音消息、高质量录音、语音识别和语音通话的参数搭配也有参考价值,尤其是语音识别用 voiceRecognition 这点。收藏了,后续接入会优先考虑 RecorderManager。
页:
[1]