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