不能,uni.getrecordermanager()不支持实时音频帧回调;android可用yl-audiorecorder插件获取pcm数据,ios和harmonyos无稳定实时方案,需降级分段录音或原生扩展。

uni.getRecorderManager() 在 App 端能实时回调吗?不能
uni.getRecorderManager() 的 onStop 只在录音结束时触发一次,onStart 和 onError 也都是离散事件——它**不支持实时音频帧回调**。想边录边分析(比如声压检测、VAD 语音活动检测、波形绘制),必须绕过这个 API。
Android 上怎么拿到实时 PCM 数据?用 YL-AudioRecorder 插件
这是目前 App 端唯一稳定支持实时帧回调的方案,仅限 Android(iOS 不支持):
-
const ar = uni.requireNativePlugin("YL-AudioRecorder"),插件需从 DCloud 插件市场安装(ID:14028 或升级版 14047) -
ar.setConfig(16000, 1, 16):采样率 16kHz、单声道、16bit,够用且兼容性好;设为-1表示用默认值 -
ar.start(res => { console.log(res.buffer, res.isLast) }):每次回调的res.buffer是Uint8Array,即原始 PCM 帧数据(注意是 little-endian signed 16-bit) - 别直接对
res.buffer做 FFT 或 RMS——先转成Int16Array:new Int16Array(res.buffer),再计算幅值或频域能量
iOS 和 HarmonyOS 怎么办?没有原生实时回调,只能妥协
iOS 和 HarmonyOS 当前无公开、稳定的第三方插件提供 PCM 实时流。可行路径只有两条:
-
降级方案:改用短间隔分段录音(如每 2 秒自动 stop → save → 分析 → restart),靠
onStop驱动,延迟高、有断点,但全平台可用 -
原生扩展方案:自己写 iOS 的 AVAudioEngine + AVCaptureSession 或 HarmonyOS 的
AVRecorder+AudioCapturer,再通过 uni-app 原生插件桥接,暴露帧回调方法——这需要熟悉对应平台音频栈,且维护成本高 - 注意:
uni.getRecorderManager()在 iOS/HarmonyOS 上 start 失败时**静默无提示**,必须提前核对 manifest 配置:NSMicrophoneUsageDescription非空、ohos.permission.MICROPHONE已声明
实时分析后怎么保存或上传?别碰 tempFilePath
无论用插件还是分段方案,只要涉及文件落地,就绕不开路径陷阱:
- YL-AudioRecorder 的
stop回调给的是真实文件路径(如/data/user/0/xxx/files/xxx.pcm),可直接用于后续处理 - 而
uni.getRecorderManager().onStop返回的res.tempFilePath是临时 URI(如file:///.../temp/xxx.aac),重启即失效,**绝不能直接传给后端或存数据库** - 必须走
uni.saveFile({ tempFilePath: res.tempFilePath })拿到持久路径,再用uni.getFileInfo校验 size > 0,否则大概率传了个空文件过去











