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 格式
|