更新记录

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 是全局单例,多个组件同时录音会导致回调错乱。

隐私、权限声明

1. 本插件需要申请的系统权限列表:

麦克风权限

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

无

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

无

许可协议

MIT协议

暂无用户评论。