news 2026/10/15 2:54:45

Recorder-UniCore 组件版本演进全解析:uni-app 跨端录音能力从 1.0 到 1.0.260708

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Recorder-UniCore 组件版本演进全解析:uni-app 跨端录音能力从 1.0 到 1.0.260708
  • 音频
  • 音频处理

【免费下载链接】Recorder

html5 js 录音 mp3 wav ogg webm amr g711a g711u 格式,支持pc和Android、iOS部分Web浏览器、Hybrid App(提供Android iOS App源码)、微信,提供ASR语音识别转文字 H5版语音通话聊天示例 DTMF编码解码

项目地址:https://gitcode.com/gh_mirrors/record/Recorder
点击查看免费下载

本文以 Recorder 开源仓库中 app-support-sample/demo_UniApp/uni_modules/Recorder-UniCore/changelog.md 为骨架,结合组件的 readme.md、核心适配文件 app-uni-support.js、配套鸿蒙 UTS 组件 Recorder-UniHarmony 以及 demo_UniApp 示例工程源码,逐版本梳理 Recorder-UniCore 的功能演进脉络,帮助开发者在集成、升级与排障时准确理解每个版本引入的能力与约束。

导读

Recorder-UniCore 是用于在 uni-app 工程内调用 RecordApp 进行录音的适配组件,核心适配逻辑集中在 app-uni-support.js 中。自 2023 年 12 月首次发布以来,该组件经历了鸿蒙 App 支持、vue3 兼容性修复、原生录音插件深度集成、后台录音保活等多次迭代。读完本文,你将掌握:各版本号的变更要点与升级影响面、鸿蒙 App 的接入方式与权限配置、vue3 组合式/选项式 API 的正确写法、App 端 renderjs 与原生插件两条录音路径的取舍,以及后台录音、实时 PCM 处理、PCM 流式播放等进阶能力。

一、组件定位与版本总览

Recorder-UniCore 是「跨平台 Recorder 录音插件」,其 package.json 中的displayName明确了能力范围:支持多种格式、音频可视化、实时上传、语音识别,HBuilderX 引擎要求^3.6.11,uni-app 要求^3.7.13,同时兼容 vue2 / vue3 / nvue,覆盖 H5、Android App、iOS App、鸿蒙 App、微信小程序五大平台。

组件的实际工作方式:Recorder开源库负责录音与音频数据处理,RecordApp提供跨平台统一入口,app-uni-support.js 负责把 RecordApp 适配到 uni-app 的不同平台环境(其文件头注释明确写着 "录音 RecordApp: uni-app支持文件,支持 H5、App vue、App nvue、微信小程序")。

从 changelog 可以梳理出组件演进的三个主要阶段:

版本日期核心变更
1.0.2312012023-12-04第一次发布
1.0.2312082023-12-08完善文档,增加 ASR 语音识别示例
1.0.2404092024-04-09增加功能调用,完善 demo 项目
1.0.2406252024-06-25UniWebViewCallAsync失败信息细化;android_audioSource默认值 1→0;新增ios_categoryOptions
1.0.2409102024-09-10新增UniMainCallBack_Register;iOS 权限声明预检;新增appNativePlugin_sampleRate;Android 后台录音保活
1.0.2501112025-01-11修复 vue3 Fragments(multi-root) 兼容性;修复 XXPermissions 后台权限问题
1.0.2503312025-03-31新增UniNativeUtsPlugin_OnJsCall;原生插件新增 PcmPlayer 播放器
1.0.2604272026-04-27增加鸿蒙 App 支持;修复 vue3 setup 子组件$root.$page缺失问题
1.0.2607082026-07-08适配 Recorder 1.3.26070800;增强 vue3 multi-root 检测与兼容提示;调整原生插件requireNativePlugin多端加载方式

二、基础版本:从首发到功能完善(1.0.231201 ~ 1.0.240409)

2023 年 12 月 4 日组件首次发布(1.0.231201),随后的 1.0.231208 完善了文档并加入 ASR 语音识别示例,1.0.240409 增加了功能调用并完善 demo。这一时期奠定了组件的核心使用范式,至今仍是集成时的基础:

  1. 安装依赖:项目根目录执行npm install recorder-core --registry=https://registry.npmmirror.com/;
  2. 导入组件:将 Recorder-UniCore 放入/uni_modules/Recorder-UniCore;
  3. 按序 import:先import Recorder from 'recorder-core',再import RecordApp from 'recorder-core/src/app-support/app',最后引入 app-uni-support.js;
  4. 编译成 App 时提供 renderjs 模块:在 vue 文件末尾照抄<script module="recModule" lang="renderjs">代码块,并在其中重复 import 上述 js(微信小程序支持文件除外),App 默认在 renderjs(WebView)中进行录音和音频编码。

需要特别注意的是:Recorder 变量如果未被实际引用,vue3 编译时可能被 tree-shaking 优化删除,官方建议改成import 'recorder-core'或通过Recorder.a=1保证强引用(见 main_recTest.vue 的注释)。

三、录音参数与错误信息精细化(1.0.240625)

1.0.240625 的两个变更虽小,却直接影响录音音质与排障体验:

android_audioSource 默认值由 1 改为 0

该参数用于指定 Android 麦克风源。按 readme 的说明,取值含义为:0 DEFAULT 默认音频源、1 MIC 主麦克风、5 CAMCORDER 相机方向的麦、6 VOICE_RECOGNITION 语音识别、7 VOICE_COMMUNICATION 语音通信(带回声消除)。默认值从 1(主麦克风)改为 0(系统默认音频源),避免了在部分设备上强制指定麦克风可能引发的采集异常。demo 中可通过RecordApp.Start({android_audioSource:7})显式指定(不建议常用,提供此配置时优先级比audioTrackSet更高)。

新增 ios_categoryOptions 原生插件录音选项

iOS 的AVAudioSession setCategory支持通过withOptions配置会话行为,该版本将ios_categoryOptions暴露为原生插件录音选项,默认值为5(即0x1|0x4),需要搭配原生录音插件使用。

UniWebViewCallAsync 失败信息细化

UniWebViewCallAsync用于在逻辑层异步调用 renderjs 中的代码。调整后调用失败时返回更详细的错误信息(如超时、找不到 renderjs 模块等),便于定位问题。从压缩版源码中的字符串可看到相关错误码,例如KnF0::无法连接到renderjs、RDcZ::{1}处理超时、URyD::没有找到组件的renderjs模块。

四、实时回调、后台录音与权限预检(1.0.240910)

1.0.240910 是一次功能大版本,包含四个要点:

1. 新增 RecordApp.UniMainCallBack_Register 接口

该接口允许 App 的 renderjs 层多次回调数据给逻辑层。此前 renderjs 回调逻辑层的能力有限,UniMainCallBack_Register补齐了实时、多路回调通道。在 main_recTest.vue 中,testH5Play5F方法展示了标准用法:

var cb = RecordApp.UniMainCallBack_Register("H5Play5F", (data) => { logFn(data.msg, data.color); }); // 在 renderjs 中通过 RecordApp.UniWebViewSendToMain({action: cb, msg, color}) 回传

2. iOS 权限声明预检

iOS App 请求录音权限前,组件会预先检查Info.plist中是否声明了NSMicrophoneUsageDescription。从压缩版源码可找到错误串9xoE::项目配置中未声明iOS录音权限{1},这意味着未声明时调用录音不会再直接崩溃,而是给出明确的配置提示。

3. 新增 appNativePlugin_sampleRate 原生插件录音选项

允许在原生插件录音时单独指定采样率,避免与 renderjs 路径共用采样率配置产生歧义。

4. Android App 后台录音保活功能

Android 9 开始,锁屏或进入后台一段时间后 App 可能被禁止访问麦克风,导致录音静音或无法录音(renderjs 中 H5 录音同样受影响)。该版本起,可调用配套原生插件的androidNotifyService接口启用保活(Foreground services + 常驻通知),test_native_plugin.vue 的showNotifyService方法给出了完整示例:

RecordApp.UniNativeUtsPluginCallAsync("androidNotifyService", { title: "正在录音", content: "正在录音中,请勿关闭App运行" }).then((data) => { // data.notifyPermissionCode: 1 有通知权限 / 3 可能无权限 }).catch((e) => { /* 检查 AndroidManifest.xml 中 service 是否解开注释 */ }); // 关闭:RecordApp.UniNativeUtsPluginCallAsync("androidNotifyService", {close:true})

配合RecordApp.UniWithoutAppRenderjs=true可禁用 renderjs 层音频编码(改用逻辑层直接编码),进一步避免部分手机 WebView 后台运行受限的影响——demo 中 page_renderjsWithout.vue 专门演示了这一「后台录音更稳」的配置组合。

五、vue3 兼容性修复(1.0.250111 与 1.0.241020)

vue3 兼容性是组件迭代中反复打磨的重点,涉及两个已知雷区:

Fragments(multi-root 多根节点)兼容性

vue3 允许 template 下存在多个根节点,但 Recorder-UniCore 依赖组件this与页面 WebView 的对应关系,多根节点会破坏$root.$page的获取,产生"奇奇怪怪的兼容性问题"。1.0.250111 修复了该问题,组件会输出检测提示(源码中的pF0r::检测到当前页面或组件可能存在Vue3 Fragments兼容性问题与sQ1d::...尽量在最外面再套一层view来避免兼容性问题)。官方建议是template 下只保留一个根节点(最外层套一个<view>),这在 readme 与 main_recTest.vue 的模板注释中均有强调。

HBuilder 4.28 编译环境下 $root.$scope 读取 bug

1.0.241020 记录了 HBuilder 4.28 在 vue3 setup 编译环境下$root.$scope无法读取的问题(HBuilder 4.29 已修复编译 bug,但仍可能存在使用问题)。官方给出的规避方案:如果 setup 内不能使用,可新建一个 vue 组件,使用选项式 API 调用录音功能,页面 setup 内引用此 vue 组件。

vue3 setup 组合式写法统一支持(1.0.260427)

在 1.0.260427 中,组件修复了 vue3 setup 组合式写法的子组件中没有$root.$page属性导致无法调用的问题,此后无论组合式还是选项式写法的子组件都能正常录音。组合式写法(Composition API)的标准姿势是(参考 page_vue3____composition_api.vue):

import { getCurrentInstance } from 'vue'; var vue3This = getCurrentInstance().proxy; // 必须定义在 import 之后的最外层 // 之后在需要 this 的地方传 vue3This,其余用法与选项式 API 完全一致

demo 中还提供了专门的子组件测试页 vue3_Page.vue 与多根节点对照页vue3_Page_MultiRoot_CompositionAPI.vue/vue3_Page_MultiRoot_OptionsAPI.vue,用于验证子组件与 multi-root 场景。

六、原生插件深化集成(1.0.250331)

1.0.250331 新增RecordApp.UniNativeUtsPlugin_OnJsCall接口:App 端搭配原生录音插件使用时,可绑定接收配套原生录音插件事件,例如 main_recTest.vue 中的用法:

RecordApp.UniNativeUtsPlugin_JsCall = (data) => { if (data.action == "onLog") { // 接收原生插件日志 this.reclog("[Native.onLog][" + data.tag + "]" + data.message, data.isError ? 1 : "#bbb"); } };

同版本原生插件新增PcmPlayer 播放器,支持流式播放与完整播放,App 端可实现"边录音边播放"的流畅体验(如 AI 语音合成的完整播放)。配套的演示页面为 test_player_nativePlugin_pcmPlayer.vue,而基于 H5 BufferStreamPlayer 的实时流式播放示例位于 test_realtime_voice.vue(配合仓库 assets/node-localServer 内的 WebSocket 服务器可实现实时语音通话对讲)。

App 端两种录音路径的取舍

根据 readme 的说明,App 中录音分两种情况,理解这一点是配置原生插件的前提:

  1. 默认未配置RecordApp.UniNativeUtsPlugin:在 renderjs 中使用 Recorder H5 录音,数据实时回传逻辑层。此路径下 iOS 仅支持 14.3 以上版本,且每次进入页面后第一次请求权限(或长时间无操作后)WebView 都会弹出权限对话框;
  2. 配置了RecordApp.UniNativeUtsPlugin={nativePlugin:true}:直接调用原生插件录音,无上述 iOS 版本限制。编码默认仍在 renderjs 中进行(WebWorker 加速);若再配置RecordApp.UniWithoutAppRenderjs=true,编码将完全在逻辑层进行,后台录音更稳定但会略微降低逻辑层性能,且必须搭配原生插件(鸿蒙暂未提供原生插件,因此鸿蒙环境下不要禁用 renderjs)。

启用原生插件的方式在 main_recTest.vue 中为一行配置:RecordApp.UniNativeUtsPlugin={nativePlugin:true};。

七、鸿蒙 App 支持(1.0.260427)

1.0.260427 正式增加鸿蒙 App 支持,这是组件向 HarmonyOS 生态迈出的关键一步。鸿蒙适配依赖配套的 UTS 组件 Recorder-UniHarmony,接入方式如下:

// #ifdef APP-HARMONY import * as UniHarmonyUTS from '@/uni_modules/Recorder-UniHarmony'; RecordApp.UniHarmonyUTS = UniHarmonyUTS; // #endif

条件编译APP-HARMONY可避免 Android、iOS 也编译这段用不到的 UTS 代码。该 UTS 组件提供两个原生能力(见其 readme):

  • Harmony_RequestPermissionAsync(permissions):请求权限,返回数组1 有权限 / 3 无权限 / 2 未用到;
  • Harmony_SaveLocalFile(fileName, base64):保存 base64 数据到Context.filesDir/RecUniSaveFiles目录。

鸿蒙录音权限声明位于 module.json5,默认包含ohos.permission.MICROPHONE,reason 文案为"正在申请使用麦克风权限,以便为您提供相应的服务",可在打包合并时按需自行添加修改权限。

鸿蒙环境下录音文件保存路径为Context.filesDir/RecUniSaveFiles,与 Android 的plus.io.PUBLIC_DOWNLOADS、小程序的wx.env.USER_DATA_PATH不同(见 readme 中RecordApp.UniSaveLocalFile的说明)。

八、最新版能力汇总(1.0.260708)

1.0.260708 作为当前最新版本,包含三项收尾性增强:

  1. 适配 Recorder 1.3.26070800:与上游Recorder、RecordApp版本保持同步(app.js 中LM:"2026-07-08 20:43",适配文件UniSupportLM="2026-07-08 22:56"),确保 API 行为一致;
  2. 增强 vue3 multi-root 检测和兼容提示:在 1.0.250111 修复的基础上,进一步强化了多根节点场景的检测与引导提示;
  3. 调整原生插件 requireNativePlugin 多端的加载方式:适配 HBuilder 对 Android / iOS / 鸿蒙多端原生插件加载机制的变化,保证RecordApp.UniNativeUtsPlugin={nativePlugin:true}在各端均可正确加载(压缩版源码中可看到Xh1W::已加载原生录音插件[{1}]与SCW9::配置了RecordApp.UniNativeUtsPlugin,但当前App未打包进原生录音插件[{1}]两条提示)。

九、各平台权限配置要点(升级必查清单)

结合 readme 的「录音权限配置、需要注意的细节」章节与源码,升级或集成时务必核对以下权限项:

平台必需配置注意事项
Androidandroid.permission.RECORD_AUDIO、android.permission.MODIFY_AUDIO_SETTINGS(第二个必须添加)后台录音需启用保活服务;Android 9+ 锁屏/后台可能被禁麦
iOSNSMicrophoneUsageDescriptionApp常用其它设置 → 后台运行能力需提供audio配置,否则切后台立即停止录音
鸿蒙ohos.permission.MICROPHONE(在 Recorder-UniHarmony 的 module.json5 内声明)需先下载安装 Recorder-UniHarmony 组件
微信小程序隐私保护指引中声明录音权限否则正式版请求权限会直接走错误回调;可用wx.getSetting检查scope.record并引导wx.openSetting授权

十、进阶实战:实时数据处理与 PCM 流式播放

组件支持在onProcess中实时拿到 PCM 数据(Int16Array),这是实时上传、实时保存、ASR 语音识别、实时语音通话的基础:

var prevChunk = null; RecordApp.Start({ type: "mp3", sampleRate: 16000, bitRate: 16 , onProcess: (buffers, powerLevel, duration, sampleRate, newBufferIdx, asyncEnd) => { prevChunk = Recorder.SampleData(buffers, sampleRate, 16000, prevChunk); var newPCM = prevChunk.data; // 最新 PCM 数据 Int16Array var pcmBase64 = RecordApp.UniBtoa(newPCM.buffer); // 转 base64 } // App 端如需修改会写入文件的音频数据,请在 onProcess_renderjs 中操作 , onProcess_renderjs: `function(buffers, powerLevel, duration, sampleRate, newBufferIdx, asyncEnd){ ... }` });

重要限制(readme 与源码注释中多次强调):

  • App 中实际编码发生在 renderjs,逻辑层onProcess收到的 buffers 是 renderjs 实时转发的,修改此处 buffers 不会改变生成的音频文件;如需修改请用onProcessBefore_renderjs(在转发给逻辑层之前修改)或onProcess_renderjs;
  • 长时间录音需配合takeoffEncodeChunk实时取出编码片段并清理 buffers 内存,否则 Stop 时会产生超大数据从 renderjs 回传逻辑层(uni-app 逻辑层与 renderjs 层的数据交互性能较弱),takeoffEncodeChunk也可配合原生插件writeFile接口将音频实时写入文件(参考 test_native_plugin.vue 的realtimeWritePcm2Wav方法);
  • 若需边录音边播放语音(语音通话),应配置audioTrackSet:{echoCancellation:true,noiseSuppression:true,autoGainControl:true}打开回声消除,但 H5、App+renderjs 中必须在请求权限前同步配置RecordApp.RequestPermission_H5OpenSet才会生效;App 搭配原生插件时还可通过setSpeakerOff切换听筒/外放,小程序用wx.setInnerAudioOption({speakerOn}),H5 不支持切换。

十一、授权许可边界

组件对授权有明确区分(readme 与 app-uni-support.js 文件头均有声明):

  • H5、微信小程序:免费授权;
  • App 平台(Android / iOS / 鸿蒙):app-uni-support.js仅供测试用,不可用于正式发布或商用;未授权时 App 打开后第一次调用RecordApp.RequestPermission会弹出"未获得商用授权时,App上仅供测试"提示框;
  • 获得授权后,需在调用RequestPermission前赋值RecordApp.UniAppUseLicense="我已获得UniAppID=***的商用授权"(星号替换为项目的 uni-app 应用标识);配置了RecordApp.UniNativeUtsPlugin使用配套原生插件时视为已授权,不再弹提示框。

结语

从 1.0.231201 到 1.0.260708,Recorder-UniCore 的 changelog 记录了一条清晰的演进路径:先打稳跨端基础(H5 / 小程序 / App vue),再补 vue3 兼容性短板,继而通过原生插件把录音体验与后台稳定性推向纵深,最后拥抱鸿蒙生态。对开发者而言,理解每个版本背后的平台限制(iOS 14.3+、Android 9 后台禁麦、鸿蒙无原生插件、renderjs 数据传输瓶颈),比记住版本号本身更重要。集成时建议以 main_recTest.vue 为入门范本,配合本仓库的 src/engine(mp3、wav、pcm、g711x、beta-amr、beta-ogg、beta-webm 等编码引擎)与 src/extensions(waveview、wavesurfer.view、frequency.histogram.view、buffer_stream.player 等插件)按需引入,即可在 uni-app 中搭建从基础录音到实时语音通话、ASR 识别的完整方案。

  • 音频
  • 音频处理

【免费下载链接】Recorder

html5 js 录音 mp3 wav ogg webm amr g711a g711u 格式,支持pc和Android、iOS部分Web浏览器、Hybrid App(提供Android iOS App源码)、微信,提供ASR语音识别转文字 H5版语音通话聊天示例 DTMF编码解码

项目地址:https://gitcode.com/gh_mirrors/record/Recorder
点击查看免费下载

相关推荐

上一篇:告别繁琐模拟器!Windows平台APK安装神器:5分钟解锁安卓应用自由
下一篇:fontTools svgLib.path.parser 深入解析:SVG 路径数据如何绘制到 FontTools Pen 协议

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/15 2:54:11

液冷技术:数据中心高效散热与节能新方案

1. 液冷技术为何成为算力中心的新宠&#xff1f;最近两年&#xff0c;数据中心行业最火的话题莫过于液冷技术。传统风冷系统在应对高密度计算时已经捉襟见肘——一台8卡GPU服务器的散热需求就高达3-4kW&#xff0c;整个机柜动辄需要30kW以上的散热能力。而液体的比热容是空气的…

作者头像 李华
网站建设 2026/10/15 2:52:57

基于炬芯ATS308X的Find my防丢器查找器功能实现

# ATS3089P 设备查找与防丢报警本功能用于手机 BLE App 查找附近开发板&#xff0c;以及 BLE 连接丢失后的本机声音报警。PC 直接使用原有普通 UART 串口发送指令。这里的“Find My”是本地 BLE 查找功能&#xff0c;没有接入 Apple 查找网络。查找声音由固件实时合成&#xff…

作者头像 李华
网站建设 2026/10/15 2:51:09

BiliPai 的 Miuix 导航深度集成:从源码捆绑到预测式返回策略定制

移动开发音视频插件系统 【免费下载链接】BiliPai 原生、纯净、可扩展 —— 重新定义你的 B 站体验 项目地址&#xff1a; https://gitcode.com/gh_mirrors/bil/BiliPai 点击查看 免费下载 导读 本文围绕 BiliPai 项目中捆绑的 miuix-navigation 模块展开&#xff0c;系统讲解…

作者头像 李华
网站建设 2026/10/15 2:44:39

Flutter 图文混排实战:商品列表布局与滚动性能优化

1. 从一张商品卡片说起&#xff1a;图文混排到底难在哪做移动端电商项目的人&#xff0c;迟早都会撞上「商品列表图文混排」这堵墙。表面上看&#xff0c;无非就是左边一张图、右边几行字&#xff0c;或者上面一张大图、下面标题价格&#xff0c;用Row和Column拼一拼就完事了。…

作者头像 李华