ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

HarmonyOS 7 新特性(二十八)|Audio Kit 后台录音与无声排障

HarmonyOS 7 新特性(二十八)|Audio Kit 后台录音与无声排障 HarmonyOS 7API 26Beta2 配套资料新增后台录音、录制流选型与音频快照排障指导。后台采集涉及麦克风权限、长时任务和隐私提示具体接口与上架要求请以当前 Audio Kit 文档为准。录音功能在前台正常并不代表退到后台后仍可靠。系统可能挂起应用蓝牙或耳机切换可能改变输入设备通话会触发并发策略错误的 SourceType 还会造成“回调有数据但实际无声”。高质量录音必须把权限、流类型、生命周期、文件写入和诊断证据连成一条链。本文以会议录音为例设计后台录音状态机、分段文件、音量探针和音频快照排障方案。一、先选择正确录音方案AudioCapturer 适合获取 PCM 并自行处理若需要直接生成常见封装格式可选择相应媒体录制方案低时延采集只用于确有耳返或实时处理需求的场景。不要因为“更快”就默认启用低时延它会增加调度和功耗压力。普通会议录音、语音识别、VoIP 和直播的 SourceType 不同。错误类型会影响通路、算法、并发和输入设备。二、状态机覆盖前后台typeRecorderState|{kind:idle}|{kind:preparing;sessionId:string}|{kind:recording;sessionId:string;segment:number}|{kind:paused;sessionId:string;reason:string}|{kind:stopping;sessionId:string}|{kind:failed;sessionId?:string;code:string}interfaceRecordingSession{sessionId:stringstartedAt:numbersourceType:stringsampleRate:numberchannelCount:number}页面只订阅状态不直接持有 Capturer。这样页面销毁或旋转不会意外释放后台任务。三、启动顺序必须可观测推荐按“权限—参数—创建—监听—启动—确认 RUNNING—读数据—写文件”执行。每一步记录稳定事件和错误码禁止把所有异常都显示为“录音失败”。asyncfunctionstartRecording(config:RecorderConfig){awaitpermission.ensureMicrophone()validateConfig(config)constcapturerawaitaudioFactory.create(config)capturer.onStateChange(onStateChange)capturer.onReadData(onAudioData)awaitcapturer.start()if(capturer.state!RUNNING)thrownewError(STATE_NOT_RUNNING)returncapturer}具体 API 名称以当前 SDK 为准这里的重点是顺序与证据。四、后台录音需要长时任务用户明确开始录音后应用进入后台仍需持续采集应按官方要求申请长时任务并展示持续可感知提示。进入后台前确认任务已建立结束录音时立即停止任务。classBackgroundRecordingGuard{privateactivefalseasyncenter(sessionId:string){if(this.active)returnawaitbackgroundTask.start({type:audio-recording,sessionId})this.activetrue}asyncleave(){if(!this.active)returnawaitbackgroundTask.stop()this.activefalse}}权限被撤销或系统终止任务后状态机必须进入可解释终态。五、分段写入降低损坏风险长时间录音不要只写一个巨大临时文件。按时间或大小切分片段每段完成后关闭句柄、计算哈希并更新 Manifest。崩溃后可恢复已完成片段。interfaceAudioSegment{index:numberpath:stringstartedAt:numberdurationMs:numberbytes:numbersha256?:string}interfaceRecordingManifest{sessionId:stringsegments:AudioSegment[]finalized:boolean}文件路径存放在受控目录最终保存或分享前再让用户确认。六、用振幅探针提前发现无声能够收到回调不代表有效录音。周期计算短窗 RMS 或最大振幅若连续一段时间接近零结合静音、输入设备和业务场景提示用户检查。functionrms(samples:Int16Array):number{if(!samples.length)return0letsum0for(constvalueofsamples)sumvalue*valuereturnMath.sqrt(sum/samples.length)/32768}functionisProbablySilent(history:number[]):boolean{returnhistory.length10history.every(valuevalue0.002)}安静环境可能确实无声因此不要自动停止只提供清晰诊断入口。七、设备切换与并发打断监听输入设备、录音流状态和系统打断。蓝牙断开后重新确认路由通话到来时根据业务规则暂停或结束恢复后新建片段避免把不同参数的数据拼进同一 PCM 文件。functiononRouteChanged(route:InputRoute){telemetry.event(audio_route_changed,{type:route.type})if(!route.available)recorder.pause(input-device-lost)elserecorder.reconfigure(route)}不要在回调线程执行耗时编码或网络上传数据通过有界队列交给工作线程。八、音频快照用于现场定位无声问题出现时音频快照可以提供当前进程音频子系统状态。快照应由用户或受控诊断流程触发附带会话 ID、状态变化和路由事件但不包含不必要的录音内容。采集后先本地检查大小与敏感字段再进入受控上传。生产环境设置频率和存储上限。九、停止流程也要可恢复先停止读取再刷新编码器关闭文件句柄更新 Manifest最后释放 Capturer 与长时任务。任何一步失败都继续执行后续清理并把未完成状态留给下次启动恢复。asyncfunctionstopSafely(resources:RecorderResources){consterrors:string[][]for(constjobof[resources.stopCapture,resources.flush,resources.closeFile,resources.stopBackground]){try{awaitjob()}catch(error){errors.push(String(error))}}returnerrors}十、验收矩阵覆盖首次拒绝权限、后台 30 分钟、锁屏、来电、蓝牙切换、耳机插拔、存储不足、进程终止和恢复。记录启动成功率、首个数据延迟、丢帧率、静音误报、文件可播放率、功耗与温升。十一、上线清单根据业务选择正确 SourceType 与录音方案状态机由服务层持有不依赖页面生命周期后台录音已接入长时任务和持续提示PCM 队列有上限编码不阻塞回调长录音分段、落盘并可崩溃恢复输入设备、打断和静音都有诊断停止路径即使部分失败也完成清理真机前后台与外设矩阵已验证。结语后台录音的难点不是调用start而是持续证明“系统仍在采、数据有效、文件安全、用户知情”。用服务级状态机管理生命周期用分段文件保护结果再用振幅探针和音频快照缩短排障才能把录音从演示功能做成可靠工具。官方参考录音无声定位指导https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/audio-recording-no-audio-troubleshooting音频录制概述https://developer.huawei.com/consumer/cn/doc/doccenter-feature-dev/bpta-audio-record-overview
返回列表