4.8 KiB
4.8 KiB
录音数据丢失问题修复说明
🔴 问题描述
症状: 录音8.5秒,但文件只有0.4秒
原因: MP3编码需要时间,但代码没有等待编码完成就读取了文件
✅ 已修复内容
1. evaluation.vue - 添加延迟和文件验证
// 修复前:立即使用文件
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 - 增加延迟时间
// 修复前: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
const defaultOptions = {
format: 'wav', // 改为WAV
sampleRate: 16000,
numberOfChannels: 1,
encodeBitRate: 48000, // WAV不需要此参数
frameSize: 50
}
修改 evaluation.vue
this.recorderManager.start({
format: 'wav', // 改为WAV
// ... 其他参数
})
WAV vs MP3
| 格式 | 优点 | 缺点 |
|---|---|---|
| MP3 | 文件小(~1MB/10秒) | 需要编码时间,可能丢失数据 |
| WAV | 无损,无编码延迟 | 文件大(~3MB/10秒) |
建议:
- 如果网络良好:使用 WAV(更可靠)
- 如果网络较差:使用 MP3(文件小)
🧪 测试步骤
1. 重新编译APP
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: 可能的原因:
- 设备不支持MP3编码 → 改用WAV
- 系统缓冲区太小 → 增加frameSize
- 录音权限问题 → 重新授予权限
Q3: 提示"录音文件异常"
A: 文件太小(<10KB),建议:
- 重新录音,说慢一点
- 改用WAV格式
- 检查麦克风是否正常
Q4: 百度API提示"音频时长过短"
A:
- 确认文件大小正常
- 确认录音时长 >= 3秒
- 改用WAV格式(时长计算更准确)
🔄 如果问题仍然存在
方案1:改用WAV格式
修改所有录音配置为 format: 'wav'
方案2:增加更长的延迟
将延迟时间改为:
setTimeout(..., 2000) // 第一次延迟
setTimeout(..., 1500) // 第二次延迟
方案3:使用原生录音插件
考虑使用第三方录音插件,而不是uni.getRecorderManager
📝 修改文件总结
-
evaluation.vue
- onStop回调添加延迟
- 添加文件大小验证
- 文件太小时警告用户
-
speech-recorder.js
- 增加延迟到 1500ms + 1000ms
- 添加文件大小验证
- 增加超时时间到 10000ms
✅ 预期效果
修复后:
- ✅ 录音8秒,文件大小应该 > 80KB
- ✅ 不会再出现 "0.4秒" 的情况
- ✅ 百度API能正确识别
- ✅ 评测结果正常返回
生成时间:2025-12-07