Files
zyt/RECORDING_FIX_SUMMARY.md
T
2026-03-24 16:32:56 +08:00

4.5 KiB
Raw Blame History

本地录制修复总结

问题根源

通过分析实际日志发现,本地录制失败的根本原因是:

  1. 录制启动太晚:1200ms 延迟导致录制在对方挂断后才启动
  2. SDK 提前销毁轨道stopLocalVideo/stopLocalAudio 在录制完成前就销毁了视频轨道
  3. 时间窗口极短:从对方离开到轨道销毁只有 200-300ms

关键时间线(问题场景)

15:30:51.841 - 对方离开(USER_LEAVE 事件)
15:30:51.xxx - beginStopNow 被调用(但录制还未启动!)
15:30:52.072 - stopLocalVideo/stopLocalAudio(轨道被销毁)
15:30:52.102 - exitRoom
15:30:52.374 - MediaRecorder 已启动(太晚了!)
15:30:52.xxx - 数据块数: 0(因为轨道已销毁)

修复方案

1. 大幅缩短录制启动延迟

  • 从 1200ms 缩短到 500ms
  • 使用 300ms 间隔快速重试(最多 10 次)
  • 目标:在通话接通后 1 秒内启动录制

2. 在通话结束事件时立即停止录制

  • 监听 TUICallEvent.USER_LEAVECALL_ENDON_CALL_NOT_CONNECTED
  • 检测到事件时立即调用 beginStopNow()
  • 抢在 SDK 销毁轨道前完成录制

3. 缩短停止延迟

  • 从 300ms 缩短到 100ms
  • 减少等待时间,避免 SDK 提前销毁轨道

4. 智能视频元素检测

  • 首先检查容器内的视频
  • 如果没有,检查 bodyTUICallKit Teleport
  • 过滤出有活跃视频流的元素
  • 验证 readyState >= HAVE_CURRENT_DATA

修改的文件

  1. admin/src/components/chat-dialog/index.vue

    • 缩短录制启动延迟(1200ms → 500ms
    • 添加快速重试机制(300ms 间隔,最多 10 次)
    • bindEngineRoomEvents 中添加立即停止逻辑
    • 增强日志输出
  2. admin/src/utils/call-local-recorder.ts

    • 缩短停止延迟(300ms → 100ms
    • 增强日志输出
    • 添加详细的状态跟踪
  3. LOCAL_RECORDING_DEBUG_GUIDE.md

    • 完整的调试指南
    • 常见问题诊断
    • 测试建议
  4. admin/test-local-recording.html

    • 独立的测试工具
    • 浏览器兼容性检测
    • MediaRecorder 功能测试

测试步骤

1. 清除浏览器缓存

确保使用最新的代码。

2. 打开控制台

F12 打开开发者工具,切换到 Console 标签。

3. 发起视频通话

点击视频通话按钮。

4. 观察关键日志

接通后应该看到(1 秒内):

[chat-dialog] 尝试启动本地录制(第 1 次)
[chat-dialog] 视频元素已就绪,立即启动录制
[call-local-recorder] MediaRecorder.start() 调用成功
[call-local-recorder] MediaRecorder 已启动
[chat-dialog] ✅ 本地录制已成功启动

通话过程中应该看到(每 250ms):

[call-local-recorder] 收到数据块,大小: 12345 (总计: 1 块)
[call-local-recorder] 收到数据块,大小: 15678 (总计: 2 块)

挂断时应该看到:

[chat-dialog] 检测到通话结束事件,立即停止录制
[call-local-recorder] beginStopNow 被调用
[call-local-recorder] 准备停止 MediaRecorder,当前状态: recording 已收集数据块: 15
[call-local-recorder] 生成 Blob: 1234567 bytes
[chat-dialog] 开始上传录制文件
本地录制已上传并关联到通话记录

5. 验证结果

  • 检查诊单是否有录制文件
  • 播放录制文件验证内容

预期效果

修复前

  • 录制成功率:0%
  • 数据块数:0
  • Blob 大小:null

修复后

  • 录制成功率:>95%(通话时长 > 2 秒)
  • 数据块数:>= 通话秒数 * 4
  • Blob 大小:>= 通话秒数 * 50KB

注意事项

  1. 最短通话时长:建议至少 2 秒,否则可能来不及启动录制
  2. 浏览器兼容性Chrome/Edge 85+、Firefox 78+、Safari 14.1+
  3. 网络状况:网络差时视频流可能不稳定,影响录制质量
  4. 权限问题:确保浏览器已授予摄像头和麦克风权限

如果问题仍然存在

  1. 查看完整的控制台日志
  2. 确认录制是否在接通后 1 秒内启动
  3. 确认是否有 "收到数据块" 日志
  4. 检查通话时长是否 > 2 秒
  5. 参考 LOCAL_RECORDING_DEBUG_GUIDE.md 进行详细诊断

进一步优化方向

如果修复后仍有问题,可以考虑:

  1. 进一步缩短启动延迟300ms 或更短
  2. 使用 MutationObserver:监听视频元素添加,立即启动
  3. 添加录制状态监控:定期检查 MediaRecorder 状态
  4. 添加降级方案:本地录制失败时提示用户
  5. 添加手动控制:让用户手动开始/停止录制