更新记录
1.0.1(2026-09-30) 下载此版本
初始第一版本更新
平台兼容性
uni-app(5.24)
| Vue2 | Vue3 | Chrome | Safari | app-vue | app-nvue | Android | iOS | 鸿蒙 |
|---|---|---|---|---|---|---|---|---|
| √ | × | √ | - | √ | - | - | - | - |
| 微信小程序 | 支付宝小程序 | 抖音小程序 | 百度小程序 | 快手小程序 | 京东小程序 | 鸿蒙元服务 | QQ小程序 | 飞书小程序 | 小红书小程序 | 快应用-华为 | 快应用-联盟 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| √ | √ | - | - | - | - | - | - | - | - | - | - |
一、快速上手
<template>
<CustomRecording
TRIGGER_TYPE="click"
TITLE="录音"
:MAX_DURATION="60"
:ENABLE_PLAYBACK="true"
@record-stop="onRecordStop"
@record-error="onRecordError"
/>
</template>
<script>
import CustomRecording from '@/components/CustomRecording/index.vue'
export default {
components: { CustomRecording },
methods: {
onRecordStop(info) {
// 小程序:info.tempFilePath 可直接上传
// H5:info.blob 可直接作为 uni.uploadFile 的 filePath
console.log(info.duration, info.filename, info.type, info.fileSize)
},
onRecordError(error) {
console.log(error.code, error.message)
}
}
}
</script>
二、Props
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
TRIGGER_TYPE |
String | click |
触发方式:click 点击开关(可暂停/继续/停止);hold 长按录音、松手停止(无暂停,上滑取消) |
TITLE |
String | 录音 |
录音浮层标题 |
MAX_DURATION |
Number | 60 |
最长录音时长(秒),到达后自动停止并提示 |
MIN_DURATION |
Number | 1 |
最短录音时长(秒),低于该值不产生产物 |
ENABLE_PLAYBACK |
Boolean | false |
停止后是否支持本地回放(展示回放条) |
DISABLED |
Boolean | false |
是否禁用触发区 |
TRIGGER_TEXT |
String | '' |
自定义触发区文案,不传则按状态自动展示 |
Z_INDEX |
Number | 550 |
录音浮层层级,默认比导航栏(CustomNavBar 的 z-index: 500)高 50 |
FORMAT |
String | mp3 |
录音格式,合法值 mp3 / aac / wav / pcm(微信文档 PCM 亦写作大写 PCM,两者均可) |
命名规范:组件内所有 props 统一使用「大写 + 下划线」。
三、Events
| 事件 | 载荷 | 说明 |
|---|---|---|
record-start |
{ maxDuration } |
真正开始采集时触发 |
record-stop |
文件信息对象,见下方 | 正常停止并产出录音 |
record-pause |
{ duration } |
暂停 |
record-resume |
{ duration } |
继续 |
record-cancel |
无 | 取消,不产生产物 |
record-error |
{ code, message, raw } |
录音错误 |
permission-denied |
{ code, message, raw } |
麦克风权限被拒(组件内部已弹引导) |
interruption-begin |
{ duration } |
录音被系统占用中断(来电、语音通话等) |
interruption-end |
{ duration } |
中断结束 |
record-stop 文件信息(停止后可直接用于上传)
| 字段 | 类型 | 说明 |
|---|---|---|
duration |
Number | 录音时长(秒),暂停期间不计时 |
tempFilePath |
String | 小程序:本地临时路径;H5:blob 地址 |
blob |
Blob | null | H5 录音数据,可直接作为 uni.uploadFile 的 filePath |
fileSize |
Number | 文件大小(Byte) |
filename |
String | 文件名,格式 recording-<时间戳>.<扩展名> |
type / mimeType |
String | MIME 类型,按 FORMAT 声明,如 audio/mp3(H5 内核真实编码见下方说明) |
extension |
String | 扩展名,按 FORMAT 声明,如 mp3 |
format |
String | 本次对外声明的音频格式(归一化后的 mp3/aac/wav/PCM) |
maxDurationReached |
Boolean | 是否因到达最长时长而自动停止 |
stopReason |
String | max-duration(到达上限)/ manual(主动停止) |
关于 FORMAT 的跨端说明
- 微信 / 支付宝小程序:
format会原样传给RecorderManager.start,非法值会导致录音直接启动失败,因此组件底层会先归一化:pcm/PCM→PCM,其余非法值 →mp3。frameSize仅在mp3/PCM下有效,其他格式会被自动移除。 - H5:
MediaRecorder只能产出内核支持的封装格式(Chrome/安卓多为webm,iOS Safari 为mp4),无法真正指定任意格式。组件会把FORMAT作为 MIME 挑选偏好(如mp3→audio/mpeg、wav→audio/wav),若内核不支持则回退通用候选,保证一定能录到音。此时产物对外的type/mimeType/extension/format仍按FORMAT声明(上传链路按此校验),内核真实编码仅记录在内部_h5MimeType,不再对外暴露。 - 原始 PCM 为裸流,H5 端无法通过
MediaRecorder直接录制,会回退通用候选。
四、组件方法(通过 ref 调用)
| 方法 | 说明 |
|---|---|
start() |
开始录音 |
pause() |
暂停(hold 模式无效) |
resume() |
继续录音 |
stop() |
停止并产出录音 |
cancel() |
取消录音,不产生产物 |
reset() |
清空录音结果并释放资源 |
getRecordInfo() |
获取当前录音文件信息 |
<CustomRecording ref="recorder" TRIGGER_TYPE="click" />
<!-- this.$refs.recorder.start() -->
五、两种触发模式
click(点击模式)
点击开始录音,浮层提供「暂停 / 继续 / 停止 / 取消」四个操作,适合录制较长语音。
hold(长按模式)
按下超过 200ms 开始录音,松手结束,上滑超过 60px 取消,不提供暂停(符合微信语音的交互习惯)。
<CustomRecording TRIGGER_TYPE="hold" TITLE="按住说话" @record-stop="onRecordStop" />
六、内置交互与异常处理
| 场景 | 处理方式 |
|---|---|
| 首次使用麦克风 | 系统授权弹窗 |
| 权限被拒绝 | 不展开录音浮层,直接弹窗引导,小程序可直达设置页;H5 按系统/浏览器给出差异化开启路径 |
| 权限弹窗期间松手 | 静默作废本次录音,不误报「录音时间太短」 |
| 按住时间过短(误触) | 未达 200ms 不启动麦克风 |
| 来电 / 语音通话中断 | 自动暂停并提示,中断结束后可继续录音 |
| 到达最长时长 | 自动停止并 toast 提示「已达到最长录音时长」 |
| 录音时长不足 | 提示「录音时间太短」,不产生产物 |
| 部分机型 stop 无回调 | 超时兜底收尾,避免会话卡死 |
| 连续快速点击 | 自动拦截,不会重复启动 |
七、动画效果
录音浮层包含麦克风扩散音圈 + 12 根波形柱动画;暂停时通过 animation-play-state: paused 冻结动画并压低波形,可直观区分「录音中」与「已暂停」。时长下方提供按 MAX_DURATION 推进的进度条;长按模式上滑进入取消区时,浮层整体转为危险色并停止扩散动画。
八、常见问题
Q:为什么 H5 端暂停无效?
部分浏览器(如 iOS Safari)的 MediaRecorder 不支持 pause(),组件会提示「当前环境不支持暂停录音」,此时只能停止。
Q:H5 回放的 blob 地址需要手动释放吗?
不需要。组件在重新录音或 reset() 时会自动调用 revokeLastBlobUrl() 回收。上传完成后建议及时调用 reset()。
Q:小程序端如何上传录音?
onRecordStop(info) {
uni.uploadFile({
url: '你的上传接口',
filePath: info.tempFilePath, // H5 端传 info.tempFilePath 或 info.blob
name: 'file',
formData: { duration: info.duration }
})
}
Q:同一页面能放多个录音组件吗?
不建议。微信小程序的 RecorderManager 是全局单例,多个组件同时录音会导致回调错乱。

收藏人数:
下载插件并导入HBuilderX
赞赏(0)
下载 0
赞赏 0
下载 12649165
赞赏 1953
赞赏
京公网安备:11010802035340号