211 lines
4.8 KiB
Markdown
211 lines
4.8 KiB
Markdown
# 录音数据丢失问题修复说明
|
||
|
||
## 🔴 问题描述
|
||
|
||
**症状:** 录音8.5秒,但文件只有0.4秒
|
||
|
||
**原因:** MP3编码需要时间,但代码没有等待编码完成就读取了文件
|
||
|
||
---
|
||
|
||
## ✅ 已修复内容
|
||
|
||
### 1. evaluation.vue - 添加延迟和文件验证
|
||
```javascript
|
||
// 修复前:立即使用文件
|
||
this.recordPath = res.tempFilePath
|
||
|
||
// 修复后:等待1500ms + 验证文件大小
|
||
setTimeout(() => {
|
||
uni.getFileInfo({
|
||
filePath: res.tempFilePath,
|
||
success: (fileInfo) => {
|
||
if (fileInfo.size < 10000) {
|
||
// 警告用户文件太小
|
||
} else {
|
||
this.recordPath = res.tempFilePath
|
||
}
|
||
}
|
||
})
|
||
}, 1500)
|
||
```
|
||
|
||
### 2. speech-recorder.js - 增加延迟时间
|
||
```javascript
|
||
// 修复前:800ms + 500ms = 1300ms
|
||
setTimeout(() => { ... }, 800)
|
||
setTimeout(() => { resolve(path) }, 500)
|
||
|
||
// 修复后:1500ms + 1000ms = 2500ms + 文件验证
|
||
setTimeout(() => { ... }, 1500)
|
||
setTimeout(() => {
|
||
uni.getFileInfo({ ... })
|
||
resolve(path)
|
||
}, 1000)
|
||
```
|
||
|
||
---
|
||
|
||
## 📊 延迟时间说明
|
||
|
||
| 阶段 | 时间 | 说明 |
|
||
|------|------|------|
|
||
| **停止录音** | 0ms | 调用 recorderManager.stop() |
|
||
| **等待编码** | 1500ms | MP3编码需要时间 |
|
||
| **等待写入** | 1000ms | 文件写入磁盘需要时间 |
|
||
| **文件验证** | 100ms | 验证文件大小 |
|
||
| **总延迟** | ~2600ms | 停止到可用 |
|
||
|
||
---
|
||
|
||
## 🔧 备用方案:使用WAV格式
|
||
|
||
如果MP3格式仍有问题,可以改用WAV格式(无损,无需编码):
|
||
|
||
### 修改 speech-recorder.js
|
||
```javascript
|
||
const defaultOptions = {
|
||
format: 'wav', // 改为WAV
|
||
sampleRate: 16000,
|
||
numberOfChannels: 1,
|
||
encodeBitRate: 48000, // WAV不需要此参数
|
||
frameSize: 50
|
||
}
|
||
```
|
||
|
||
### 修改 evaluation.vue
|
||
```javascript
|
||
this.recorderManager.start({
|
||
format: 'wav', // 改为WAV
|
||
// ... 其他参数
|
||
})
|
||
```
|
||
|
||
### WAV vs MP3
|
||
|
||
| 格式 | 优点 | 缺点 |
|
||
|------|------|------|
|
||
| **MP3** | 文件小(~1MB/10秒) | 需要编码时间,可能丢失数据 |
|
||
| **WAV** | 无损,无编码延迟 | 文件大(~3MB/10秒) |
|
||
|
||
**建议:**
|
||
- 如果网络良好:使用 WAV(更可靠)
|
||
- 如果网络较差:使用 MP3(文件小)
|
||
|
||
---
|
||
|
||
## 🧪 测试步骤
|
||
|
||
### 1. 重新编译APP
|
||
```bash
|
||
cd fronted_uniapp
|
||
npm run build:app
|
||
```
|
||
|
||
### 2. 测试录音
|
||
```
|
||
1. 录音 8-10 秒
|
||
2. 停止录音
|
||
3. 等待 "录音完成" 提示(约3秒)
|
||
4. 查看控制台日志
|
||
```
|
||
|
||
### 3. 验证日志
|
||
成功的日志应该显示:
|
||
```
|
||
[录音] 开始录音
|
||
[录音] 准备停止录音...
|
||
[录音] 等待音频缓冲写入和MP3编码...
|
||
[录音] 停止成功,文件路径: ...
|
||
[录音] 等待MP3文件完全编码保存...
|
||
[录音] 文件已完全保存,大小: XXXXX bytes ← 应该 > 50000
|
||
等待录音文件完全保存...
|
||
录音文件信息: { size: XXXXX, duration: ... } ← size应该合理
|
||
```
|
||
|
||
### 4. 检查文件大小
|
||
```
|
||
录音时长 | 预期文件大小(MP3 128kbps)
|
||
---------|----------------------------
|
||
3秒 | > 45KB (48KB理论值)
|
||
5秒 | > 75KB (80KB理论值)
|
||
8秒 | > 120KB (128KB理论值)
|
||
10秒 | > 150KB (160KB理论值)
|
||
|
||
计算公式:128kbps ÷ 8 = 16KB/秒
|
||
```
|
||
|
||
**注意:**
|
||
- 实际文件会略小于理论值(MP3头部开销)
|
||
- 如果实际大小 < 理论值的50%,说明数据丢失严重
|
||
|
||
---
|
||
|
||
## ⚠️ 常见问题
|
||
|
||
### Q1: 停止录音后等待很久才显示"录音完成"
|
||
**A:** 正常,MP3编码需要时间。如果超过5秒,考虑改用WAV格式。
|
||
|
||
### Q2: 文件大小仍然很小
|
||
**A:** 可能的原因:
|
||
1. 设备不支持MP3编码 → 改用WAV
|
||
2. 系统缓冲区太小 → 增加frameSize
|
||
3. 录音权限问题 → 重新授予权限
|
||
|
||
### Q3: 提示"录音文件异常"
|
||
**A:** 文件太小(<10KB),建议:
|
||
1. 重新录音,说慢一点
|
||
2. 改用WAV格式
|
||
3. 检查麦克风是否正常
|
||
|
||
### Q4: 百度API提示"音频时长过短"
|
||
**A:**
|
||
1. 确认文件大小正常
|
||
2. 确认录音时长 >= 3秒
|
||
3. 改用WAV格式(时长计算更准确)
|
||
|
||
---
|
||
|
||
## 🔄 如果问题仍然存在
|
||
|
||
### 方案1:改用WAV格式
|
||
修改所有录音配置为 `format: 'wav'`
|
||
|
||
### 方案2:增加更长的延迟
|
||
将延迟时间改为:
|
||
```javascript
|
||
setTimeout(..., 2000) // 第一次延迟
|
||
setTimeout(..., 1500) // 第二次延迟
|
||
```
|
||
|
||
### 方案3:使用原生录音插件
|
||
考虑使用第三方录音插件,而不是uni.getRecorderManager
|
||
|
||
---
|
||
|
||
## 📝 修改文件总结
|
||
|
||
1. **evaluation.vue**
|
||
- onStop回调添加延迟
|
||
- 添加文件大小验证
|
||
- 文件太小时警告用户
|
||
|
||
2. **speech-recorder.js**
|
||
- 增加延迟到 1500ms + 1000ms
|
||
- 添加文件大小验证
|
||
- 增加超时时间到 10000ms
|
||
|
||
---
|
||
|
||
## ✅ 预期效果
|
||
|
||
修复后:
|
||
- ✅ 录音8秒,文件大小应该 > 80KB
|
||
- ✅ 不会再出现 "0.4秒" 的情况
|
||
- ✅ 百度API能正确识别
|
||
- ✅ 评测结果正常返回
|
||
|
||
---
|
||
|
||
生成时间:2025-12-07
|