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

211 lines
4.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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