265 lines
6.5 KiB
Markdown
265 lines
6.5 KiB
Markdown
# 录音问题完整诊断
|
||
|
||
## 📊 当前状态分析
|
||
|
||
### 从日志中看到的流程
|
||
|
||
```
|
||
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
|
||
|
||
[然后就没有后续日志了]
|
||
```
|
||
|
||
### 问题分析
|
||
|
||
✅ **已经工作的部分:**
|
||
1. `ptt_on` 信号发送成功
|
||
2. 录音启动成功
|
||
3. `onStop` 回调触发成功
|
||
4. 获取到文件路径
|
||
|
||
❌ **没有工作的部分:**
|
||
1. 没有看到 "✅ 录音文件路径有效,准备读取文件..."
|
||
2. 没有看到 WebSocket 状态检查的日志
|
||
3. 没有看到文件读取的任何日志
|
||
|
||
### 可能的原因
|
||
|
||
**最可能的原因:代码在某个检查点 return 了,但没有输出日志。**
|
||
|
||
可能的检查点:
|
||
1. `res.tempFilePath` 检查 ✅(有日志,说明通过了)
|
||
2. `res.duration` 检查 ✅(duration 是 undefined,跳过了检查)
|
||
3. `this.socketTask` 检查 ❌(没有日志,可能在这里 return 了)
|
||
4. `this.socketTask.readyState` 检查 ❌(没有日志)
|
||
|
||
## 🔧 已添加的诊断代码
|
||
|
||
我已经添加了更详细的日志:
|
||
|
||
```javascript
|
||
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 中:
|
||
1. 停止当前运行
|
||
2. 清理缓存
|
||
3. 重新运行到手机
|
||
|
||
### 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)
|
||
|
||
**可能原因:**
|
||
1. 服务器主动关闭连接(超时、错误等)
|
||
2. 网络不稳定
|
||
3. App 进入后台导致连接断开
|
||
|
||
**解决方案:**
|
||
|
||
在 `onStop` 回调中添加重连逻辑:
|
||
|
||
```javascript
|
||
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`
|
||
|
||
**可能原因:**
|
||
1. WebSocket 连接失败
|
||
2. 变量被意外清空
|
||
3. 作用域问题
|
||
|
||
**解决方案:**
|
||
|
||
检查 `connectWebSocket` 方法是否正确设置了 `this.socketTask`。
|
||
|
||
### 问题 3:录音时间太短
|
||
|
||
**症状:**
|
||
- 录音时长小于 500ms
|
||
- 日志显示 "❌ 录音时长太短"
|
||
|
||
**解决方案:**
|
||
|
||
录音至少 2-3 秒。
|
||
|
||
### 问题 4:文件路径问题
|
||
|
||
**症状:**
|
||
- 文件路径是相对路径
|
||
- 文件读取失败
|
||
|
||
**解决方案:**
|
||
|
||
已添加文件路径转换逻辑,会自动转换为绝对路径。
|
||
|
||
## 📝 调试技巧
|
||
|
||
### 1. 使用 console.log 追踪执行流程
|
||
|
||
在关键位置添加日志:
|
||
```javascript
|
||
console.log('🔍 执行到这里了 - 步骤 1')
|
||
// ... 代码
|
||
console.log('🔍 执行到这里了 - 步骤 2')
|
||
// ... 代码
|
||
console.log('🔍 执行到这里了 - 步骤 3')
|
||
```
|
||
|
||
### 2. 检查变量值
|
||
|
||
```javascript
|
||
console.log('🔍 变量值:', {
|
||
socketTask: !!this.socketTask,
|
||
readyState: this.socketTask?.readyState,
|
||
isTalking: this.isTalking,
|
||
isRecording: this.isRecording
|
||
})
|
||
```
|
||
|
||
### 3. 捕获异常
|
||
|
||
```javascript
|
||
try {
|
||
// 可能出错的代码
|
||
} catch (err) {
|
||
console.error('❌ 捕获到异常:', err)
|
||
console.error('❌ 异常详情:', JSON.stringify(err))
|
||
}
|
||
```
|
||
|
||
## 🚀 下一步
|
||
|
||
1. **重新编译并测试**
|
||
2. **观察新增的日志**
|
||
3. **根据日志确定具体问题**
|
||
4. **如果还有问题,提供完整日志**
|
||
|
||
重点关注:
|
||
- 🔍 this.socketTask 是否存在?
|
||
- 🔌 WebSocket 状态是什么?
|
||
- 如果状态不是 1,为什么会断开?
|
||
|
||
---
|
||
|
||
**当前进度:**
|
||
- ✅ `ptt_on` 信号发送
|
||
- ✅ 录音启动
|
||
- ✅ `onStop` 回调触发
|
||
- ❌ WebSocket 状态检查(待确认)
|
||
- ❌ 文件读取(待执行)
|
||
- ❌ 音频发送(待执行)
|