更新记录
1.0.0(2026-07-06) 下载此版本
v1.0.0 初始版本,支持录音、上传、播放、倍速、进度拖拽
平台兼容性
uni-app x(5.14)
| Chrome | Safari | Android | iOS | 鸿蒙 | 微信小程序 |
|---|---|---|---|---|---|
| × | × | 5.0 | 12 | √ | × |
VoiceMemo 语音备忘组件
uni-app x 语音备忘组件,支持按住说话、上划取消、音频播放、倍速控制、进度拖拽。零依赖,开箱即用。
功能特性
- 按住说话:仿微信交互,按住录音按钮开始录音
- 上划取消:录音过程中手指上划超过阈值进入取消状态,松手取消发送
- 自动上传:录音完成后自动上传音频文件到指定服务器
- 音频播放:支持播放/暂停、0.7x/1.5x 倍速切换、进度条拖拽定位
- 权限引导:自动检测麦克风权限,引导用户授权
- 零依赖:不依赖第三方 UI 库,图标全部用 CSS 绘制,自包含可独立使用
平台兼容性
| 平台 | 支持情况 |
|---|---|
| App-Android | ✅ 支持 |
| App-iOS | ✅ 支持 |
| Web | ❌ 不支持 |
| 小程序 | ❌ 不支持 |
本组件基于 uni-app x(.uvue + UTS)开发,仅支持 App 端。
安装
方式一:插件市场安装(推荐)
在 DCloud 插件市场 搜索 "VoiceMemo",点击「使用 HBuilderX 导入插件」即可。
方式二:手动安装
将 voice-memo 目录复制到项目的 components/ 或 uni_modules/ 目录下:
components/
└── voice-memo/
├── voice-memo.uvue # 主组件
├── audio-player.uvue # 音频播放器子组件
└── package.json # 插件配置
基础用法
<template>
<VoiceMemo
uploadUrl="https://your-api.com/upload"
:uploadHeaders="{ Authorization: 'Bearer ' + token }"
@uploadSuccess="onUploadSuccess"
@delete="onDelete"
/>
</template>
<script setup lang="uts">
import VoiceMemo from '@/components/voice-memo/voice-memo.uvue'
const token = 'your-auth-token'
const onUploadSuccess = (data: { fileUrl: string; duration: number }) => {
console.log('上传成功:', data.fileUrl, '时长:', data.duration + '秒')
}
const onDelete = () => {
console.log('用户删除了语音')
}
</script>
进阶用法
编辑回显
<template>
<VoiceMemo
:audioUrl="existingVoiceUrl"
:audioDuration="existingDuration"
uploadUrl="https://your-api.com/upload"
@uploadSuccess="onUploadSuccess"
@delete="onDelete"
/>
</template>
自定义上传逻辑
<template>
<VoiceMemo
:customUploader="handleCustomUpload"
@uploadSuccess="onUploadSuccess"
/>
</template>
<script setup lang="uts">
import VoiceMemo from '@/components/voice-memo/voice-memo.uvue'
const handleCustomUpload = (filePath: string): Promise<string> => {
return new Promise((resolve, reject) => {
// 你的自定义上传逻辑
uni.uploadFile({
url: 'https://your-api.com/upload',
filePath: filePath,
name: 'file',
success: (res) => {
const data = JSON.parse(res.data) as UTSJSONObject
resolve(data['url'] as string)
},
fail: (err) => {
reject(err.errMsg)
}
})
})
}
const onUploadSuccess = (data: { fileUrl: string; duration: number }) => {
console.log('上传成功:', data.fileUrl)
}
</script>
通过 ref 主动控制
<template>
<VoiceMemo ref="voiceMemoRef" uploadUrl="https://your-api.com/upload" />
<button @click="startRecord">开始录音</button>
<button @click="resetVoice">重置</button>
</template>
<script setup lang="uts">
import { ref } from 'vue'
import VoiceMemo from '@/components/voice-memo/voice-memo.uvue'
const voiceMemoRef = ref<InstanceType<typeof VoiceMemo> | null>(null)
const startRecord = () => {
voiceMemoRef.value?.startRecord()
}
const resetVoice = () => {
voiceMemoRef.value?.reset()
}
</script>
Props
| 属性 | 类型 | 默认值 | 说明 |
|---|---|---|---|
audioUrl |
string | '' |
已上传的音频地址(用于编辑回显) |
audioDuration |
number | 0 |
音频时长,单位秒(用于编辑回显) |
showDelete |
boolean | true |
是否显示删除按钮 |
showSpeed |
boolean | true |
是否显示倍速控制(0.7x / 1.5x) |
showEmptyTip |
boolean | true |
是否显示空态提示文案 |
emptyTipText |
string | '请按住下方按钮进行说话录制' |
空态提示文案 |
holdText |
string | '按住说话' |
按住按钮默认文案 |
releaseText |
string | '松手发送' |
录音中按钮文案 |
cancelSlideText |
string | '手指上滑,取消发送' |
上划取消提示 |
cancelReleaseText |
string | '松开手指,取消发送' |
松开取消提示 |
recordingHintText |
string | '正在录音' |
录音中底部提示 |
cancelHintText |
string | '松开取消' |
取消中底部提示 |
maxDuration |
number | 600000 |
最大录音时长,单位毫秒(默认10分钟) |
sampleRate |
number | 44100 |
采样率 |
numberOfChannels |
number | 1 |
声道数 |
encodeBitRate |
number | 192000 |
编码码率 |
format |
string | 'aac' |
录音格式(aac / mp3) |
cancelThreshold |
number | 80 |
上划取消阈值,单位 px |
uploadUrl |
string | '' |
上传接口完整地址 |
uploadHeaders |
object | {} |
上传请求头 |
uploadFileName |
string | 'file' |
上传文件字段名 |
customUploader |
function | null |
自定义上传方法,接收文件路径,返回 Promise |
Events
| 事件 | 回调参数 | 说明 |
|---|---|---|
recordStart |
- | 录音开始 |
recordStop |
{ cancelled, tempFilePath, duration } |
录音结束(含取消) |
uploadSuccess |
{ fileUrl, duration } |
音频上传成功 |
uploadFail |
{ message, tempFilePath } |
音频上传失败 |
delete |
- | 用户删除语音 |
play |
- | 开始播放(可用于列表互斥) |
tooShort |
- | 录音时间太短(小于1秒) |
permissionDenied |
- | 麦克风权限被拒绝 |
暴露方法(defineExpose)
通过 ref 可调用以下方法:
| 方法 | 返回值 | 说明 |
|---|---|---|
getAudioUrl() |
string | 获取当前音频 URL |
getAudioDuration() |
number | 获取当前音频时长 |
getIsUploading() |
boolean | 获取是否正在上传 |
startRecord() |
void | 主动开始录音 |
stopRecord() |
void | 主动停止录音 |
reset() |
void | 重置组件状态(清空录音) |
插槽
| 插槽名 | 说明 |
|---|---|
record-icon |
自定义录音按钮图标(默认使用 CSS 绘制的麦克风图标) |
<VoiceMemo uploadUrl="https://your-api.com/upload">
<template #record-icon>
<image src="/static/custom-mic.png" style="width: 48rpx; height: 48rpx;" />
</template>
</VoiceMemo>
注意事项
- 平台限制:本组件仅支持 uni-app x App 端(Android / iOS),Web 和小程序不支持
uni.getRecorderManager()。 - 权限申请:首次使用会自动检测并引导申请麦克风权限,请在
manifest.json中配置录音权限。 - 录音格式:默认使用
aac格式,如需修改请确保服务器支持对应格式。 - 上传配置:
uploadUrl和customUploader二选一,同时配置时优先使用customUploader。 - 互斥播放:组件内部通过
uni.$emit('audio-player-mutex')实现列表中多音频互斥播放,如需自定义互斥逻辑可监听play事件。
目录结构
voice-memo/
├── voice-memo.uvue # 主组件:录音管理 + 上传 + UI 交互
├── audio-player.uvue # 子组件:音频播放 + 进度条 + 倍速控制
├── package.json # 插件市场发布配置
└── readme.md # 本文档
更新日志
v1.0.0
- 初始版本
- 支持录音、上传、播放、倍速、进度拖拽
- 零依赖,自包含设计
License
MIT

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