@tanzhenxing/zx-recorder
Version:
zx-recorder 录音组件,用于录音功能
274 lines (222 loc) • 7.19 kB
Markdown
# zx-recorder 录音组件
一个基于 uni-app 录音管理器的高级录音组件,支持录音、播放、暂停、继续、上传等功能。
## 特性
- ✅ **完整的录音控制**:开始、停止、暂停、继续
- ✅ **实时播放**:录音完成后可直接播放
- ✅ **自动上传**:支持自动上传到 uniCloud 云存储
- ✅ **状态管理**:完整的录音状态跟踪和显示
- ✅ **错误处理**:完善的错误提示和处理机制
- ✅ **进度显示**:录音时间计时和上传进度显示
- ✅ **灵活配置**:支持多种音频格式和参数配置
- ✅ **事件回调**:丰富的事件监听机制
- ✅ **美观UI**:现代化的用户界面设计
## 平台支持
| 平台 | 支持状态 | 说明 |
|------|---------|------|
| App | ✅ | 完全支持 |
| H5 | ✅ | 完全支持 |
| 微信小程序 | ✅ | 完全支持 |
| 百度小程序 | ✅ | 完全支持 |
| 支付宝小程序 | ❌ | 不支持 |
| HarmonyOS Next | ❌ | 不支持 |
## 安装使用
### 1. 复制组件文件
将 `zx-recorder.vue` 文件复制到您的项目中。
### 2. 基础使用
```vue
<template>
<view>
<zx-recorder
@end="onRecordEnd"
@error="onRecordError"
/>
</view>
</template>
<script setup>
import zxRecorder from '@/components/zx-recorder/zx-recorder.vue';
const onRecordEnd = (recordFile) => {
console.log('录音完成:', recordFile);
};
const onRecordError = (error) => {
console.error('录音出错:', error);
};
</script>
```
### 3. 高级配置
```vue
<template>
<zx-recorder
:duration="120000"
:sampleRate="44100"
:format="'aac'"
:autoUpload="true"
:cloudPathPrefix="'my-audio/'"
:detectDecibel="true"
@start="onStart"
@stop="onStop"
@pause="onPause"
@resume="onResume"
@end="onEnd"
@error="onError"
@play="onPlay"
@playEnd="onPlayEnd"
/>
</template>
```
## API 文档
### Props
| 参数 | 类型 | 默认值 | 说明 |
|------|------|--------|------|
| show | Boolean | true | 是否显示录音控制按钮 |
| duration | Number | 60000 | 录音时长限制(毫秒),最大值 600000(10分钟) |
| sampleRate | Number | 16000 | 采样率,有效值:8000/16000/44100 |
| numberOfChannels | Number | 2 | 录音通道数,有效值:1、2 |
| encodeBitRate | Number | 64000 | 编码码率 |
| format | String | 'mp3' | 音频格式,有效值:aac/mp3/wav/PCM |
| frameSize | Number | 1 | 指定帧大小,单位 KB |
| hideTips | Boolean | false | 是否隐藏录音状态提示 |
| audioSource | String | '' | 录音的音频输入源 |
| detectDecibel | Boolean | false | 是否检测声音分贝数 |
| autoUpload | Boolean | true | 是否自动上传到云存储 |
| cloudPathPrefix | String | 'audio/' | 云存储路径前缀 |
### Events
| 事件名 | 参数 | 说明 |
|--------|------|------|
| start | res | 开始录音时触发 |
| stop | res | 停止录音时触发 |
| pause | res | 暂停录音时触发 |
| resume | res | 继续录音时触发 |
| end | recordFile | 录音结束时触发,包含完整的录音文件信息 |
| error | error | 录音出错时触发 |
| play | - | 开始播放录音时触发 |
| playEnd | - | 播放结束时触发 |
### Methods
通过 ref 可以调用以下方法:
| 方法名 | 参数 | 返回值 | 说明 |
|--------|------|--------|------|
| startRecord | - | - | 开始录音 |
| stopRecord | - | - | 停止录音 |
| pauseRecord | - | - | 暂停录音 |
| resumeRecord | - | - | 继续录音 |
| playAudio | - | - | 播放录音 |
| stopAudio | - | - | 停止播放 |
| getRecordFile | - | Object | 获取录音文件信息 |
| resetRecorder | - | - | 重置录音器状态 |
| uploadFile | - | Promise | 手动上传文件 |
### 录音文件对象
```javascript
{
duration: 30000, // 录音时长(毫秒)
tempFilePath: '...', // 临时文件路径
fileSize: 256000, // 文件大小(字节)
url: '...', // 云存储文件 URL
key: '...', // 云存储文件 key
cloudPath: '...' // 云存储文件路径
}
```
## 完整示例
### 基础录音功能
```vue
<template>
<view>
<zx-recorder
ref="recorder"
:autoUpload="false"
@end="handleRecordEnd"
/>
<button @click="handleReset">重置</button>
<button @click="handleUpload">上传</button>
</view>
</template>
<script setup>
import { ref } from 'vue';
import zxRecorder from '@/components/zx-recorder/zx-recorder.vue';
const recorder = ref();
const handleRecordEnd = (recordFile) => {
console.log('录音信息:', recordFile);
uni.showToast({
title: `录音完成: ${Math.round(recordFile.duration/1000)}秒`,
duration: 2000
});
};
const handleReset = () => {
recorder.value.resetRecorder();
};
const handleUpload = async () => {
try {
await recorder.value.uploadFile();
uni.showToast({ title: '上传成功' });
} catch (error) {
uni.showToast({ title: '上传失败', icon: 'error' });
}
};
</script>
```
### 高级配置示例
```vue
<template>
<view>
<!-- 高音质录音 -->
<zx-recorder
:duration="300000"
:sampleRate="44100"
:numberOfChannels="2"
:encodeBitRate="128000"
:format="'aac'"
:detectDecibel="true"
@end="handleHighQualityRecord"
/>
</view>
</template>
<script setup>
const handleHighQualityRecord = (recordFile) => {
console.log('高音质录音完成:', recordFile);
// 处理高音质录音
};
</script>
```
## 错误处理
组件内置了完善的错误处理机制:
```javascript
// 录音权限错误
{
errCode: 10001,
errMsg: '未获得录音权限'
}
// 网络错误
{
errCode: 10002,
errMsg: '网络问题无法录音'
}
// 录音被占用
{
errCode: 10003,
errMsg: '录音功能被占用'
}
// 录音已暂停
{
errCode: 10004,
errMsg: '录音已经被暂停'
}
```
## 注意事项
1. **权限要求**:使用前请确保应用已获取录音权限
2. **平台限制**:部分平台可能不支持某些音频格式
3. **文件上传**:需要配置 uniCloud 云存储才能使用自动上传功能
4. **内存管理**:长时间录音请注意内存使用情况
5. **兼容性**:微信小程序建议使用 API 方式而不是 audio 组件
## 更新日志
### v1.0.0
- ✅ 初始版本发布
- ✅ 支持基础录音功能
- ✅ 支持音频播放
- ✅ 支持云存储上传
- ✅ 完善的状态管理
- ✅ 错误处理机制
## 参考文档
- [uni-app 录音管理器](https://uniapp.dcloud.net.cn/api/media/record-manager.html)
- [uni-app 音频上下文](https://uniapp.dcloud.net.cn/api/media/audio-context.html)
- [uni-app 背景音频管理](https://uniapp.dcloud.net.cn/api/media/background-audio-manager.html)
- [uni-app audio 组件](https://uniapp.dcloud.net.cn/component/audio.html)
## 许可证
MIT License