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

4.8 KiB
Raw Blame History

录音数据丢失问题修复说明

🔴 问题描述

症状: 录音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: 可能的原因:

  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增加更长的延迟

将延迟时间改为:

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