249 lines
5.6 KiB
Markdown
249 lines
5.6 KiB
Markdown
|
|
# 录音失败问题诊断
|
|||
|
|
|
|||
|
|
## 🔍 当前问题
|
|||
|
|
|
|||
|
|
从日志看到:
|
|||
|
|
```
|
|||
|
|
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: 检查录音权限(最可能)
|
|||
|
|
|
|||
|
|
在开始录音前,先检查并请求权限:
|
|||
|
|
|
|||
|
|
```javascript
|
|||
|
|
// 在 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:
|
|||
|
|
|
|||
|
|
```javascript
|
|||
|
|
const recorderOptions = {
|
|||
|
|
duration: 600000,
|
|||
|
|
sampleRate: 16000,
|
|||
|
|
numberOfChannels: 1,
|
|||
|
|
encodeBitRate: 48000,
|
|||
|
|
format: 'mp3', // 改为 MP3
|
|||
|
|
audioSource: 'auto'
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**但是**:服务器期望 PCM 格式,如果用 MP3,需要修改服务器代码进行转换。
|
|||
|
|
|
|||
|
|
### 方案3: 增加录音时长提示
|
|||
|
|
|
|||
|
|
在 UI 上提示用户至少说 3 秒:
|
|||
|
|
|
|||
|
|
```vue
|
|||
|
|
<view class="opt_name">
|
|||
|
|
{{ isTalking ? '松开结束(至少3秒)' : '按住说话' }}
|
|||
|
|
</view>
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 方案4: 添加录音时长计时器
|
|||
|
|
|
|||
|
|
```javascript
|
|||
|
|
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 格式
|
|||
|
|
|
|||
|
|
修改录音参数:
|
|||
|
|
```javascript
|
|||
|
|
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` 对象中有 `tempFilePath` 和 `duration`,说明录音成功。
|
|||
|
|
如果还是 `undefined`,请提供完整的日志,包括:
|
|||
|
|
- 录音开始的日志
|
|||
|
|
- 录音错误的日志(如果有)
|
|||
|
|
- 录音停止的完整 res 对象
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
**诊断时间**: 2026-02-28
|
|||
|
|
**问题**: 录音文件大小和时长为 undefined
|
|||
|
|
**可能原因**: 权限问题 / 录音时间太短 / 格式不支持
|
|||
|
|
**解决方案**: 检查权限 / 增加时长限制 / 尝试 MP3 格式
|