6.5 KiB
6.5 KiB
录音问题完整诊断
📊 当前状态分析
从日志中看到的流程
14:54:12.223 === startTalking 被调用 ===
14:54:12.223 ✅ 开始说话, isTalking 设置为: true
14:54:12.223 📤 发送 ptt_on 信号
14:54:12.223 === startRecording 被调用 ===
14:54:12.246 ✅ 录音已开始
[5秒后,用户松开按钮]
14:54:17.219 === stopTalking 被调用 ===
14:54:17.391 📋 完整的 res 对象: {"tempFilePath":"_doc/uniapp_temp_..."}
14:54:17.391 📁 文件路径: _doc/uniapp_temp_1772434445765/recorder/1772434458065.pcm
14:54:17.416 ⏱️ 录音时长: undefined, ms
14:54:17.417 📦 文件大小: undefined, bytes
[然后就没有后续日志了]
问题分析
✅ 已经工作的部分:
ptt_on信号发送成功- 录音启动成功
onStop回调触发成功- 获取到文件路径
❌ 没有工作的部分:
- 没有看到 "✅ 录音文件路径有效,准备读取文件..."
- 没有看到 WebSocket 状态检查的日志
- 没有看到文件读取的任何日志
可能的原因
最可能的原因:代码在某个检查点 return 了,但没有输出日志。
可能的检查点:
res.tempFilePath检查 ✅(有日志,说明通过了)res.duration检查 ✅(duration 是 undefined,跳过了检查)this.socketTask检查 ❌(没有日志,可能在这里 return 了)this.socketTask.readyState检查 ❌(没有日志)
🔧 已添加的诊断代码
我已经添加了更详细的日志:
console.log('✅ 录音文件路径有效,准备读取文件...')
// 检查 WebSocket 状态
console.log('🔍 检查 WebSocket 状态...')
console.log('🔍 this.socketTask 是否存在:', !!this.socketTask)
if (!this.socketTask) {
console.error('❌ socketTask 不存在')
// ... 显示提示
return
}
console.log('🔌 WebSocket 状态:', this.socketTask.readyState)
console.log('🔌 状态说明: 0=CONNECTING, 1=OPEN, 2=CLOSING, 3=CLOSED')
if (this.socketTask.readyState !== 1) {
console.error('❌ WebSocket 未连接,无法发送,状态:', this.socketTask.readyState)
// ... 显示提示
return
}
console.log('✅ WebSocket 状态正常,继续处理...')
🧪 测试步骤
1. 重新编译
在 HBuilderX 中:
- 停止当前运行
- 清理缓存
- 重新运行到手机
2. 测试并观察日志
按住说话 3-5 秒,观察以下日志:
预期日志(如果 WebSocket 正常):
⏹️ 录音已停止
📁 文件路径: xxx
✅ 录音文件路径有效,准备读取文件...
🔍 检查 WebSocket 状态...
🔍 this.socketTask 是否存在: true
🔌 WebSocket 状态: 1
🔌 状态说明: 0=CONNECTING, 1=OPEN, 2=CLOSING, 3=CLOSED
✅ WebSocket 状态正常,继续处理...
📁 转换后的绝对路径: xxx
📂 获取文件系统管理器: 成功
📁 准备读取文件: xxx
✅ 文件读取成功
预期日志(如果 WebSocket 断开):
⏹️ 录音已停止
📁 文件路径: xxx
✅ 录音文件路径有效,准备读取文件...
🔍 检查 WebSocket 状态...
🔍 this.socketTask 是否存在: false
❌ socketTask 不存在
或者:
⏹️ 录音已停止
📁 文件路径: xxx
✅ 录音文件路径有效,准备读取文件...
🔍 检查 WebSocket 状态...
🔍 this.socketTask 是否存在: true
🔌 WebSocket 状态: 3
🔌 状态说明: 0=CONNECTING, 1=OPEN, 2=CLOSING, 3=CLOSED
❌ WebSocket 未连接,无法发送,状态: 3
🐛 可能的问题和解决方案
问题 1:WebSocket 在录音过程中断开
症状:
- 录音开始时 WebSocket 是连接的
- 录音结束时 WebSocket 已断开
- 日志显示状态为 2(CLOSING)或 3(CLOSED)
可能原因:
- 服务器主动关闭连接(超时、错误等)
- 网络不稳定
- App 进入后台导致连接断开
解决方案:
在 onStop 回调中添加重连逻辑:
if (!this.socketTask || this.socketTask.readyState !== 1) {
console.log('🔄 WebSocket 已断开,尝试重连...')
// 保存录音文件路径
const savedFilePath = res.tempFilePath
// 重新连接
this.connectWebSocket()
// 等待连接建立
setTimeout(() => {
if (this.socketTask && this.socketTask.readyState === 1) {
console.log('✅ 重连成功,继续发送音频')
// 继续读取和发送文件
this.readAndSendAudioFile(savedFilePath)
} else {
console.error('❌ 重连失败')
uni.showToast({
title: '连接断开,请重新进入',
icon: 'none'
})
}
}, 2000)
return
}
问题 2:this.socketTask 为 null
症状:
- 日志显示
this.socketTask 是否存在: false
可能原因:
- WebSocket 连接失败
- 变量被意外清空
- 作用域问题
解决方案:
检查 connectWebSocket 方法是否正确设置了 this.socketTask。
问题 3:录音时间太短
症状:
- 录音时长小于 500ms
- 日志显示 "❌ 录音时长太短"
解决方案:
录音至少 2-3 秒。
问题 4:文件路径问题
症状:
- 文件路径是相对路径
- 文件读取失败
解决方案:
已添加文件路径转换逻辑,会自动转换为绝对路径。
📝 调试技巧
1. 使用 console.log 追踪执行流程
在关键位置添加日志:
console.log('🔍 执行到这里了 - 步骤 1')
// ... 代码
console.log('🔍 执行到这里了 - 步骤 2')
// ... 代码
console.log('🔍 执行到这里了 - 步骤 3')
2. 检查变量值
console.log('🔍 变量值:', {
socketTask: !!this.socketTask,
readyState: this.socketTask?.readyState,
isTalking: this.isTalking,
isRecording: this.isRecording
})
3. 捕获异常
try {
// 可能出错的代码
} catch (err) {
console.error('❌ 捕获到异常:', err)
console.error('❌ 异常详情:', JSON.stringify(err))
}
🚀 下一步
- 重新编译并测试
- 观察新增的日志
- 根据日志确定具体问题
- 如果还有问题,提供完整日志
重点关注:
- 🔍 this.socketTask 是否存在?
- 🔌 WebSocket 状态是什么?
- 如果状态不是 1,为什么会断开?
当前进度:
- ✅
ptt_on信号发送 - ✅ 录音启动
- ✅
onStop回调触发 - ❌ WebSocket 状态检查(待确认)
- ❌ 文件读取(待执行)
- ❌ 音频发送(待执行)