不能直接用 uni.getrecordermanager().onframerecorded 实现跨端实时波形图,因其在 app 端完全不可用,h5 和小程序端支持极不稳定;应改用 recorder-core 的 powerlevel 能量估算配合 css 条形动画渲染。

不能直接用 uni.getRecorderManager().onFrameRecorded 实现跨端实时波形图——这个 API 在 App 端完全不可用,H5 和小程序端支持极不稳定,iOS 微信几乎不触发,安卓也常返回空 frameBuffer。真正在多端跑得通的方案,是绕过“原始 PCM 波形”,改用 powerLevel 能量估算 + 轻量渲染。
为什么 onFrameRecorded 在 uni-app 里基本等于废功能
App 端(Android/iOS)的 uni.getRecorderManager() 根本不提供音频帧数据,只返回临时文件路径;onFrameRecorded 事件在 #ifdef APP 下压根不会触发,不是你代码漏了监听,是平台没实现。小程序端虽有该事件,但微信基础库需 ≥2.25.0,且仅部分安卓机型可用,iOS 上多数为 undefined。H5 端虽能用 MediaRecorder,但 uni-app 的 H5 编译层并未透出原生流,onFrameRecorded 同样无效。
用 recorder-core 的 powerLevel 做跨端能量反馈
recorder-core 提供的 powerLevel 是一个毫秒级更新的振幅估算值(范围 0–1),它不依赖原始 PCM,而是通过 Web Audio 或原生插件快速计算当前音频能量,兼容 H5、小程序、App 全平台。关键在于:它稳定、轻量、无需解码。
由于微信的大热,为了更好的方便使用微信的用户查询一些信息,这篇文章是入门级的微信公众平台开发教程,需要的朋友可以参考下 这篇入门教程将引导你完成如下任务: 创建百度云平台应用启用微信公众平台开发模式获取订阅、文字、图片、语音、视频消息回复文本、图文及音乐消息程序开发
- 引入时必须加载对应平台的引擎和扩展:
import 'recorder-core/src/engine/mp3'+import 'recorder-core/src/extensions/waveview' - 初始化 Recorder 实例后,调用
rec.start(),再用setInterval(() => { console.log(rec.powerLevel) }, 30)每 30ms 读一次值 - 不要用
requestAnimationFrame驱动波形刷新——它受页面帧率限制,在后台或低性能机上掉帧严重;固定 30ms 间隔更可控 - Vue3 中注意
this绑定:若在setup()里使用,需通过getCurrentInstance().proxy访问实例方法
波形 UI 渲染:别碰 canvas,用 CSS 动画柱状条
在 App 和低端安卓机上,用 uni.createCanvasContext 实时绘制 64 根频谱柱,内存占用高、卡顿明显,echarts 更是直接 crash。实际交付项目中,推荐「CSS 条形动画」方案:用 view 模拟柱子,高度由 powerLevel 动态控制,配合 transition: height 0.1s ease-out 实现平滑起伏。
- 模板里写 20–30 个
<view class="bar" :style="{ height: barHeight[i] + 'rpx' }"></view>,避免动态增删节点 -
barHeight数组长度固定(如 24),每次取powerLevel值做简单映射:Math.min(80, Math.max(8, powerLevel * 80)) - 录音停止后,让柱子缓降归零(加个
v-if="isRecording"控制显示时机),比突兀消失更符合微信体验 - H5 环境下可额外加一层
filter: blur(0.5px)模拟真实波形毛边感,App 和小程序不用加
App 端特殊处理:必须用原生插件补足能力
如果你的 App 需要更高精度的频谱(比如用于语音质检),powerLevel 不够用,那就得上原生插件。DCloud 插件市场已有 AudioAnalyzer 类插件,调用方式是:const analyzer = uni.requireNativePlugin('AudioAnalyzer'),传入录音完成后的 tempFilePath,100ms 内返回 32 个频段能量数组。但注意:这不是“实时”波形,是录完再分析,所以 UI 上要区分「录制中用 powerLevel,播放时用真频谱」两个状态。
最容易被忽略的是:App 端的录音权限提示不显眼,用户点“不允许”后,powerLevel 会一直为 0,UI 却还在跳——得在 start() 后加个 1s 超时检测,powerLevel === 0 持续超时就弹 toast 提示“请检查麦克风权限”。










