5.6 KiB
5.6 KiB
录音失败问题诊断
🔍 当前问题
从日志看到:
18:31:12.587 ⭕ 录音已停止,undefined,ms
18:31:12.588 📁 文件大小:undefined,bytes
录音文件大小和时长都是 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. 测试录音
- 进入语音通话页面
- 按住"按住说话"按钮至少 3 秒
- 松开按钮
- 观察日志
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'
重新测试,看是否能生成文件。
🎓 经验总结
常见问题
-
权限问题
- 最常见的原因
- 用户拒绝了麦克风权限
- 需要引导用户去设置中开启
-
录音时间太短
- 用户按住时间不够
- 需要 UI 提示和时长检查
-
格式兼容性
- 某些设备不支持 PCM
- 可能需要降级到 MP3
-
录音器未初始化
recorderManager为 null- 需要在 onLoad 中正确初始化
最佳实践
-
权限检查
- 在录音前检查权限
- 提供友好的权限引导
-
时长限制
- 最少 2-3 秒
- UI 上提示用户
-
错误处理
- 捕获所有可能的错误
- 给用户明确的提示
-
格式选择
- 优先使用 PCM(服务器期望)
- 如果不支持,降级到 MP3
📞 下一步
- 重新编译客户端(已添加更详细的日志)
- 测试时按住至少 3 秒
- 查看完整的 res 对象
- 根据日志判断问题
如果 res 对象中有 tempFilePath 和 duration,说明录音成功。
如果还是 undefined,请提供完整的日志,包括:
- 录音开始的日志
- 录音错误的日志(如果有)
- 录音停止的完整 res 对象
诊断时间: 2026-02-28
问题: 录音文件大小和时长为 undefined
可能原因: 权限问题 / 录音时间太短 / 格式不支持
解决方案: 检查权限 / 增加时长限制 / 尝试 MP3 格式