# 音视频通话测试指南 ## 问题说明 当前错误的根本原因: ``` 目标用户 patient_1 没有在腾讯云 TRTC 中登录/初始化 ``` ### 为什么会出现这个错误? 1. **医生端**(当前系统)已经初始化:`doctor_1` 2. **患者端**需要呼叫:`patient_1` 3. **问题**:`patient_1` 没有登录 TRTC,无法接听 这就像打电话: - 你(医生)的手机已经开机 ✅ - 对方(患者)的手机没开机 ❌ - 所以无法接通 ## 解决方案 ### 方案 1: 双浏览器测试(推荐) 使用两个浏览器窗口模拟医生和患者: #### 步骤 1: 创建测试页面 创建一个简单的患者端测试页面: ```html 患者端测试

患者端 - 等待来电

初始化中...
``` #### 步骤 2: 后端添加获取患者签名的接口 ```php // server/app/adminapi/controller/tcm/DiagnosisController.php /** * @notes 获取患者通话签名(用于测试) * @return \think\response\Json */ public function getPatientSignature() { $params = $this->request->get(); if (empty($params['patient_id'])) { return $this->fail('患者ID不能为空'); } $result = DiagnosisLogic::getPatientSignature($params); if ($result) { return $this->data($result); } return $this->fail(DiagnosisLogic::getError()); } ``` ```php // server/app/adminapi/logic/tcm/DiagnosisLogic.php /** * @notes 获取患者通话签名 * @param array $params * @return array|bool */ public static function getPatientSignature(array $params) { try { $config = self::getTrtcConfig(); if (!$config) { self::setError('请先配置腾讯云TRTC参数'); return false; } // 患者的 userId $userId = 'patient_' . $params['patient_id']; // 生成 UserSig $userSig = self::generateUserSig($config['sdkAppId'], $config['secretKey'], $userId); if (!$userSig) { self::setError('生成签名失败'); return false; } return [ 'sdkAppId' => $config['sdkAppId'], 'userId' => $userId, 'userSig' => $userSig, 'expireTime' => 86400 ]; } catch (\Exception $e) { self::setError($e->getMessage()); return false; } } ``` #### 步骤 3: 测试流程 1. **打开患者端** - 浏览器 1:访问 `http://localhost/patient-test.html?patient_id=1` - 获取签名并初始化 - 等待来电 2. **打开医生端** - 浏览器 2:登录后台管理系统 - 进入诊断列表 - 点击"视频通话" - 发起通话 3. **验证** - 患者端应该收到来电提示 - 点击接听 - 双方可以进行视频通话 ### 方案 2: 使用腾讯云 Demo(快速测试) 1. 访问腾讯云官方 Demo: ``` https://web.sdk.qcloud.com/trtc/webrtc/demo/latest/official-demo/index.html ``` 2. 输入你的配置: - SDKAppID - SecretKey - UserID: `patient_1` 3. 点击"进入房间" 4. 在你的系统中发起通话 ### 方案 3: 自测试(单用户测试) 如果只是想测试初始化是否成功,可以呼叫自己: ```typescript // 修改前端代码,呼叫自己 await TUICallKitServer.call({ userID: res.userId, // 呼叫自己 type: TUICallType.VIDEO_CALL }) ``` 这样可以验证: - ✅ 初始化是否成功 - ✅ 签名是否正确 - ✅ 配置是否正确 - ❌ 但无法测试真实的通话流程 ## 完整的测试方案 ### 创建患者端测试组件 ```vue ``` ### 添加路由 ```typescript // admin/src/router/index.ts { path: '/test/patient-call', name: 'PatientCallTest', component: () => import('@/views/test/patient-call.vue'), meta: { title: '患者端测试' } } ``` ## 测试步骤 ### 完整测试流程 1. **准备两个浏览器窗口** - 窗口 1:Chrome(医生端) - 窗口 2:Chrome 无痕模式(患者端) 2. **初始化患者端** - 在窗口 2 中访问:`http://localhost:5173/#/test/patient-call` - 输入患者ID:1 - 点击"初始化患者端" - 等待提示"患者端初始化成功" 3. **发起通话** - 在窗口 1 中进入诊断列表 - 找到患者ID为1的诊单 - 点击"视频通话" - 点击"开始通话" 4. **接听通话** - 窗口 2 应该收到来电提示 - 点击"接听" - 开始视频通话 5. **验证功能** - ✅ 视频画面正常 - ✅ 音频正常 - ✅ 可以挂断 - ✅ 通话记录保存 ## 常见问题 ### Q1: 患者端没有收到来电 **可能原因**: 1. 患者端没有初始化 2. 患者ID不匹配 3. 网络问题 **解决方案**: ```javascript // 在患者端控制台检查 console.log('当前用户ID:', TUICallKitServer.userID) // 应该显示: patient_1 ``` ### Q2: 提示用户不存在 **原因**: UserSig 生成的 userId 和呼叫的 userId 不一致 **解决方案**: 确保: ```typescript // 医生端 const doctorUserId = 'doctor_1' // 医生登录时使用 // 患者端 const patientUserId = 'patient_1' // 患者登录时使用 // 呼叫时 await TUICallKitServer.call({ userID: 'patient_1' // 必须和患者登录的 userId 一致 }) ``` ### Q3: 两个窗口都是同一个用户 **原因**: 使用了相同的浏览器和相同的 localStorage **解决方案**: 使用无痕模式或不同的浏览器 ## 生产环境部署 在生产环境中,需要: 1. **患者端应用** - 开发患者端 H5/小程序/App - 集成 TUICallKit - 实现登录和来电监听 2. **推送通知** - 当医生发起通话时,推送通知给患者 - 患者点击通知进入通话界面 3. **在线状态管理** - 检查患者是否在线 - 如果不在线,提示医生 4. **通话记录** - 保存通话记录 - 统计通话时长 - 生成通话报表 ## 参考资料 - [TUICallKit 快速集成](https://cloud.tencent.com/document/product/647/78742) - [多端互通](https://cloud.tencent.com/document/product/647/78769) - [常见问题](https://cloud.tencent.com/document/product/647/78769#3a61f42b-e06f-49af-88bf-362d40025887)