guoyu/Test/md/录音数据丢失问题修复说明.md

211 lines
4.8 KiB
Markdown
Raw Normal View History

# 录音数据丢失问题修复说明
## 🔴 问题描述
**症状:** 录音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