Ai_GirlFriend/xuniYou/录音失败问题诊断.md
2026-02-28 18:41:16 +08:00

5.6 KiB
Raw Permalink Blame History

录音失败问题诊断

🔍 当前问题

从日志看到:

18:31:12.587 ⭕ 录音已停止undefinedms
18:31:12.588 📁 文件大小undefinedbytes

录音文件大小和时长都是 undefined 这说明录音没有正确完成。

🎯 可能的原因

1. 录音时间太短

  • 用户按住按钮的时间不够长
  • 可能只按了不到 1 秒就松开了

2. 录音权限问题

  • App 没有麦克风权限
  • 用户拒绝了权限请求

3. 录音器初始化失败

  • recorderManager 没有正确初始化
  • 录音参数不支持

4. 平台兼容性问题

  • 某些 Android 设备不支持 PCM 格式
  • 需要降级到 MP3 或 AAC 格式

🔧 解决方案

方案1: 检查录音权限(最可能)

在开始录音前,先检查并请求权限:

// 在 startRecording 方法开始处添加
async startRecording() {
    console.log('=== startRecording 被调用 ===')
    
    // 检查录音权限
    try {
        const result = await uni.authorize({
            scope: 'scope.record'
        })
        console.log('✅ 录音权限已授予')
    } catch (err) {
        console.error('❌ 录音权限被拒绝:', err)
        uni.showModal({
            title: '需要麦克风权限',
            content: '请在设置中开启麦克风权限',
            success: (res) => {
                if (res.confirm) {
                    uni.openSetting()
                }
            }
        })
        return
    }
    
    // 继续原有逻辑...
}

方案2: 降级到 MP3 格式

如果 PCM 格式不支持,可以尝试 MP3

const recorderOptions = {
    duration: 600000,
    sampleRate: 16000,
    numberOfChannels: 1,
    encodeBitRate: 48000,
    format: 'mp3',  // 改为 MP3
    audioSource: 'auto'
}

但是:服务器期望 PCM 格式,如果用 MP3需要修改服务器代码进行转换。

方案3: 增加录音时长提示

在 UI 上提示用户至少说 3 秒:

<view class="opt_name">
    {{ isTalking ? '松开结束至少3秒' : '按住说话' }}
</view>

方案4: 添加录音时长计时器

data() {
    return {
        recordStartTime: 0,
        recordDuration: 0
    }
},

startTalking(e) {
    // ...
    this.recordStartTime = Date.now()
    
    // 开始计时
    this.recordTimer = setInterval(() => {
        this.recordDuration = Date.now() - this.recordStartTime
        console.log('录音中...', (this.recordDuration / 1000).toFixed(1), '秒')
    }, 100)
},

stopTalking(e) {
    // ...
    if (this.recordTimer) {
        clearInterval(this.recordTimer)
    }
    
    const duration = Date.now() - this.recordStartTime
    console.log('录音时长:', (duration / 1000).toFixed(1), '秒')
    
    if (duration < 2000) {
        uni.showToast({
            title: '录音太短,请至少说 2 秒',
            icon: 'none'
        })
        return
    }
}

📱 立即测试步骤

1. 检查权限

打开 App 后,检查是否弹出麦克风权限请求:

  • 如果弹出 → 点击"允许"
  • 如果没弹出 → 可能已经拒绝过,需要去设置中手动开启

2. 测试录音

  1. 进入语音通话页面
  2. 按住"按住说话"按钮至少 3 秒
  3. 松开按钮
  4. 观察日志

3. 预期日志

✅ 录音权限已授予
✅ recorderManager.start 已调用
✅ 录音已开始
录音中... 1.0 秒
录音中... 2.0 秒
录音中... 3.0 秒
⏹️ 录音已停止
📋 完整的 res 对象: {"tempFilePath":"...","duration":3000,"fileSize":96000}
📁 文件路径: _doc/uniapp_temp_xxx/recorder/xxx.pcm
⏱️ 录音时长: 3000 ms  ✅ 不再是 undefined
📦 文件大小: 96000 bytes  ✅ 不再是 undefined

🐛 如果还是 undefined

检查1: 查看完整的 res 对象

📋 完整的 res 对象: {...}

如果这个对象是空的或者没有 tempFilePath,说明录音确实失败了。

检查2: 查看是否有录音错误

❌ 录音错误: {...}

如果有这个日志,说明录音过程中出错了。

检查3: 尝试 MP3 格式

修改录音参数:

format: 'mp3'  // 从 'pcm' 改为 'mp3'

重新测试,看是否能生成文件。

🎓 经验总结

常见问题

  1. 权限问题

    • 最常见的原因
    • 用户拒绝了麦克风权限
    • 需要引导用户去设置中开启
  2. 录音时间太短

    • 用户按住时间不够
    • 需要 UI 提示和时长检查
  3. 格式兼容性

    • 某些设备不支持 PCM
    • 可能需要降级到 MP3
  4. 录音器未初始化

    • recorderManager 为 null
    • 需要在 onLoad 中正确初始化

最佳实践

  1. 权限检查

    • 在录音前检查权限
    • 提供友好的权限引导
  2. 时长限制

    • 最少 2-3 秒
    • UI 上提示用户
  3. 错误处理

    • 捕获所有可能的错误
    • 给用户明确的提示
  4. 格式选择

    • 优先使用 PCM服务器期望
    • 如果不支持,降级到 MP3

📞 下一步

  1. 重新编译客户端(已添加更详细的日志)
  2. 测试时按住至少 3 秒
  3. 查看完整的 res 对象
  4. 根据日志判断问题

如果 res 对象中有 tempFilePathduration,说明录音成功。 如果还是 undefined,请提供完整的日志,包括:

  • 录音开始的日志
  • 录音错误的日志(如果有)
  • 录音停止的完整 res 对象

诊断时间: 2026-02-28
问题: 录音文件大小和时长为 undefined
可能原因: 权限问题 / 录音时间太短 / 格式不支持
解决方案: 检查权限 / 增加时长限制 / 尝试 MP3 格式