@tencentcloud/sdk-mcp 1.3.1 → 1.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/index.js +5 -1
- package/index.js.map +1 -1
- package/package.json +1 -1
- package/resource/doc/chatuikit/faq/web_sdk/faq.md +117 -0
- package/resource/doc/chatuikit/flutter/client_api_Flutter.md +100 -179
- package/resource/doc/chatuikit/flutter/faq.md +17 -112
- package/resource/doc/chatuikit/flutter/integrate_tuikit_Flutter.md +272 -1281
- package/resource/doc/roomkit/vue/features/call-user-to-room.md +256 -0
- package/resource/doc/roomkit/vue/features/device-detection.md +388 -0
- package/resource/doc/roomkit/vue/features/device-state.md +480 -0
- package/resource/doc/roomkit/vue/features/free-beauty-panel.md +238 -0
- package/resource/doc/roomkit/vue/features/room-chat.md +427 -0
- package/resource/doc/roomkit/vue/features/room-participant-state.md +407 -0
- package/resource/doc/roomkit/vue/features/room-state.md +291 -0
- package/resource/doc/roomkit/vue/features/room-view.md +338 -0
- package/resource/doc/roomkit/vue/features/schedule-room.md +349 -0
- package/resource/doc/roomkit/vue/features/screen-share.md +333 -0
- package/resource/doc/roomkit/vue/features/virtual-background.md +281 -0
- package/resource/doc/roomkit/vue/features/workflow.md +553 -0
- package/resource/doc/roomkit/vue/integration.md +479 -0
- package/resource/doc/roomkit/vue/workflow.md +487 -0
- package/resource/doc/tuicallkit/react/api.md +16 -0
- package/resource/doc/tuicallkit/vue/api.md +16 -0
- package/tools/definitions/get_web_live_uikit_integration_def.js +1 -1
- package/tools/definitions/get_web_room_feature_detail_def.js +95 -0
- package/tools/definitions/get_web_room_feature_detail_def.js.map +1 -0
- package/tools/definitions/get_web_room_uikit_integration_def.js +44 -0
- package/tools/definitions/get_web_room_uikit_integration_def.js.map +1 -0
- package/tools/index.js +4 -2
- package/tools/index.js.map +1 -1
- package/tools/room/get-web-room-feature-detail.js +68 -0
- package/tools/room/get-web-room-feature-detail.js.map +1 -0
- package/tools/room/get-web-room-integration.js +43 -0
- package/tools/room/get-web-room-integration.js.map +1 -0
- package/utils/report-cls-client.js +1 -1
- package/utils/report-es-client.js +1 -1
- package/resource/doc/roomkit/vue/states/device-state.md +0 -316
- package/resource/doc/roomkit/vue/states/login-state.md +0 -51
- package/resource/doc/roomkit/vue/states/room-list-state.md +0 -287
- package/resource/doc/roomkit/vue/states/room-participant-state.md +0 -307
- package/tools/definitions/get_web_room_state_detail_def.js +0 -19
- package/tools/definitions/get_web_room_state_detail_def.js.map +0 -1
- package/tools/room/get-web-room-state-detail.js +0 -31
- package/tools/room/get-web-room-state-detail.js.map +0 -1
|
@@ -0,0 +1,553 @@
|
|
|
1
|
+
# RoomKit Feature 自实现 UI 工作流指令
|
|
2
|
+
|
|
3
|
+
## 📋 指令目的
|
|
4
|
+
|
|
5
|
+
为 Agent 提供使用 **RoomKit 原子化 API/Hooks** 自定义实现音视频会议功能的代码生成蓝图。本指令专门针对**不使用完整 TUIRoomKit 页面**,而是基于原子化能力自己搭建 UI 的场景。
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 🎯 适用场景
|
|
10
|
+
|
|
11
|
+
本工作流适用于以下场景:
|
|
12
|
+
|
|
13
|
+
- H5/移动端音视频会议应用开发
|
|
14
|
+
- PC Web 端音视频会议应用开发
|
|
15
|
+
- 使用 RoomKit 原子化能力自定义会议 UI
|
|
16
|
+
- 集成特定功能模块(屏幕分享、美颜、聊天等)到现有应用
|
|
17
|
+
- 深度定制会议界面或业务流程
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## 🛑 核心约束与规范
|
|
22
|
+
|
|
23
|
+
### 1. 登录与鉴权(前置必须)
|
|
24
|
+
|
|
25
|
+
**🔐 核心原则**:Feature 自实现 UI 模式下,**必须使用 `get_usersig` 工具 + `useLoginState` Hook 进行登录鉴权**,禁止手动编写 UserSig 生成代码。
|
|
26
|
+
|
|
27
|
+
#### 为什么需要登录?
|
|
28
|
+
|
|
29
|
+
使用 TUIRoomKit 的原子化 API(useRoomState、useDeviceState 等)之前,必须先完成登录鉴权:
|
|
30
|
+
- **身份验证**:确保用户有权限使用腾讯云 TRTC 服务
|
|
31
|
+
- **SDK 初始化**:登录成功后 SDK 才能正常工作
|
|
32
|
+
- **数据同步**:登录后才能接收房间、成员等实时数据
|
|
33
|
+
|
|
34
|
+
#### 登录代码示例
|
|
35
|
+
|
|
36
|
+
```vue
|
|
37
|
+
<script setup lang="ts">
|
|
38
|
+
import { useLoginState } from 'tuikit-atomicx-vue3';
|
|
39
|
+
|
|
40
|
+
// 标准用法:解构出需要的方法和状态
|
|
41
|
+
const { login, loginUserInfo } = useLoginState();
|
|
42
|
+
|
|
43
|
+
async function performLogin() {
|
|
44
|
+
try {
|
|
45
|
+
// 使用 get_usersig 工具返回的信息进行登录
|
|
46
|
+
await login({
|
|
47
|
+
sdkAppId: YOUR_SDK_APP_ID, // 来自 get_usersig 工具
|
|
48
|
+
userId: YOUR_USER_ID, // 来自 get_usersig 工具
|
|
49
|
+
userSig: YOUR_USER_SIG, // 来自 get_usersig 工具
|
|
50
|
+
});
|
|
51
|
+
console.log('登录成功,用户ID:', loginUserInfo.value?.userID);
|
|
52
|
+
// 登录成功后,可以使用其他功能模块
|
|
53
|
+
} catch (error) {
|
|
54
|
+
console.error('登录失败:', error);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
</script>
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
#### 强制约束与规范
|
|
61
|
+
|
|
62
|
+
| 约束项 | 要求 | 说明 |
|
|
63
|
+
|--------|------|------|
|
|
64
|
+
| **UserID 生成规则** | ✅ **格式**:`userXXX`(XXX 为数字)<br>✅ **示例**:`user123`、`user001`、`user999`<br>❌ **禁止**使用特殊连接符(如 `user_123`、`user-001`) | 测试环境使用简单的 userID 格式,方便识别和调试 |
|
|
65
|
+
| **UserSig 生成(强制)** | ✅ **必须**使用 `get_usersig` MCP 工具生成<br>❌ **严禁**在项目中编写 `generateUserSig` 函数<br>❌ **严禁**在项目中引入 `GenerateTestUserSig` 类<br>❌ **严禁**编写任何 UserSig 生成逻辑 | **集成测试必须使用 get_usersig 工具**,Agent 只能调用该工具获取 UserSig,不得生成任何相关代码 |
|
|
66
|
+
| **登录 API** | ✅ **必须**使用 `useLoginState` Hook 的 login 方法<br>❌ **禁止**直接调用 SDK 底层 API | 使用原子化 Hook 的 API,不要直接操作 TUIRoomEngine |
|
|
67
|
+
| **登录时机** | ✅ **必须**在使用任何其他功能前完成登录<br>⚠️ 登录失败会导致所有功能无法使用 | 建议在应用启动时或进入会议前完成登录 |
|
|
68
|
+
| **安全提醒** | ⚠️ **必须**告知用户:<br>• 客户端生成 UserSig 仅用于开发测试<br>• 生产环境必须在服务端生成 UserSig<br>• 不要将 secretKey 暴露在客户端代码中 | UserSig 包含用户身份信息,必须保证安全 |
|
|
69
|
+
|
|
70
|
+
#### UserSig 生成强制规范(重要)
|
|
71
|
+
|
|
72
|
+
**核心原则**:**集成测试阶段,UserSig 必须由 `get_usersig` MCP 工具生成,严禁在项目代码中实现任何 UserSig 生成逻辑**。
|
|
73
|
+
|
|
74
|
+
##### ✅ 正确做法:使用 get_usersig 工具
|
|
75
|
+
|
|
76
|
+
```typescript
|
|
77
|
+
// ✅ 正确:Agent 调用 get_usersig 工具获取凭证
|
|
78
|
+
// 工具返回:{ sdkAppId: 1400xxx, userId: 'user123', userSig: 'eJw...' }
|
|
79
|
+
|
|
80
|
+
// 在项目代码中直接使用工具返回的值
|
|
81
|
+
const { login } = useLoginState();
|
|
82
|
+
|
|
83
|
+
await login({
|
|
84
|
+
sdkAppId: 1400188366, // 来自 get_usersig 工具
|
|
85
|
+
userId: 'user123', // 来自 get_usersig 工具
|
|
86
|
+
userSig: 'eJw1jdEKgj...', // 来自 get_usersig 工具
|
|
87
|
+
});
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
##### ❌ 错误做法:在项目中生成 UserSig
|
|
91
|
+
|
|
92
|
+
```typescript
|
|
93
|
+
// ❌ 严禁:编写 generateUserSig 函数
|
|
94
|
+
function generateUserSig(userId: string) {
|
|
95
|
+
const SDKAPPID = 1400188366;
|
|
96
|
+
const SECRETKEY = 'your-secret-key';
|
|
97
|
+
// ... HMAC-SHA256 算法实现
|
|
98
|
+
return userSig;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
// ❌ 严禁:引入 GenerateTestUserSig 类
|
|
102
|
+
import GenerateTestUserSig from './debug/GenerateTestUserSig';
|
|
103
|
+
const { userSig } = GenerateTestUserSig.genTestUserSig(userId);
|
|
104
|
+
|
|
105
|
+
// ❌ 严禁:从任何文件导入 UserSig 生成逻辑
|
|
106
|
+
import { createUserSig } from './utils/usersig';
|
|
107
|
+
|
|
108
|
+
// ❌ 严禁:任何形式的 UserSig 生成代码
|
|
109
|
+
const userSig = crypto.createHmac('sha256', SECRETKEY).update(data).digest('base64');
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
**为什么禁止**:
|
|
113
|
+
1. **安全风险**:项目中包含 secretKey 会导致密钥泄露
|
|
114
|
+
2. **违背最佳实践**:集成测试应使用工具,生产环境应使用服务端 API
|
|
115
|
+
3. **误导用户**:容易让用户认为客户端生成 UserSig 是正确做法
|
|
116
|
+
|
|
117
|
+
**Agent 行为约束**:
|
|
118
|
+
- ✅ **必须**调用 `get_usersig` MCP 工具获取 UserSig
|
|
119
|
+
- ✅ **必须**在代码注释中说明这些值来自 get_usersig 工具
|
|
120
|
+
- ❌ **严禁**生成任何包含 `generateUserSig`、`GenerateTestUserSig`、`SECRETKEY` 的代码
|
|
121
|
+
- ❌ **严禁**创建任何 UserSig 生成相关的工具函数或类
|
|
122
|
+
|
|
123
|
+
---
|
|
124
|
+
|
|
125
|
+
### 2. 文档驱动开发
|
|
126
|
+
|
|
127
|
+
- ✅ **严格遵循**本次返回的功能文档内容
|
|
128
|
+
- ✅ **优先使用**文档中的代码示例和最佳实践
|
|
129
|
+
- ❌ **禁止擅自修改**文档提供的 API 调用方式和参数
|
|
130
|
+
- ⚠️ **禁止使用记忆中的 API**:必须以 feature 文档为准,不要使用训练数据中的过时 API
|
|
131
|
+
|
|
132
|
+
---
|
|
133
|
+
|
|
134
|
+
### 3. API 版本约束(重要)
|
|
135
|
+
|
|
136
|
+
**核心原则**:**严格使用 feature 文档中列出的 API,禁止使用任何未在文档中出现的 API 名称**。
|
|
137
|
+
|
|
138
|
+
#### API 使用流程(必须遵守)
|
|
139
|
+
|
|
140
|
+
```
|
|
141
|
+
1. 查阅本次返回的 feature 文档中的 API 列表
|
|
142
|
+
↓
|
|
143
|
+
2. 对照官方 API 文档确认 API 签名和用法
|
|
144
|
+
↓
|
|
145
|
+
3. 使用文档中明确列出的 API 生成代码
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
**官方 API 文档**:
|
|
149
|
+
- 📚 **TUIRoomKit API 参考**:https://web.sdk.qcloud.com/trtc/live/web/doc/zh/index.html
|
|
150
|
+
- ⚠️ **任何 API 使用前必须在此文档中确认其存在性和签名**
|
|
151
|
+
|
|
152
|
+
**强制约束**:
|
|
153
|
+
1. ✅ **必须**以 feature 文档中的 API 列表为准
|
|
154
|
+
2. ✅ **必须**在官方文档(https://web.sdk.qcloud.com/trtc/live/web/doc/zh/index.html)中确认 API 存在
|
|
155
|
+
3. ❌ **禁止**使用训练数据或记忆中的 API 名称
|
|
156
|
+
4. ❌ **禁止**使用未在 feature 文档中列出的 API
|
|
157
|
+
5. ⚠️ 如果 feature 文档中没有列出某个 API,说明该 API 已废弃或不存在
|
|
158
|
+
|
|
159
|
+
**API 验证检查清单**:
|
|
160
|
+
- [ ] API 名称在 feature 文档中明确列出?
|
|
161
|
+
- [ ] API 在官方文档中存在?
|
|
162
|
+
- [ ] API 签名与官方文档一致?
|
|
163
|
+
- [ ] 没有使用记忆中的过时 API?
|
|
164
|
+
|
|
165
|
+
---
|
|
166
|
+
|
|
167
|
+
## 📚 RoomKit State API 架构说明
|
|
168
|
+
|
|
169
|
+
> **说明**:本节说明 TUIRoomKit (Atomicx 版本) 的 State API 架构和使用规范,详细的 API 参数和代码示例请参考具体的 feature 文档。
|
|
170
|
+
|
|
171
|
+
### 🔍 API 架构概述
|
|
172
|
+
|
|
173
|
+
TUIRoomKit Atomicx 版本采用响应式(Reactive)设计,将功能划分为不同的 State 模块。每个模块通过 `use[StateName]` Hook 提供响应式数据和操作方法。
|
|
174
|
+
|
|
175
|
+
**核心设计理念**:
|
|
176
|
+
- ✅ **响应式数据**:所有状态都是 Vue 3 Ref,可直接在模板中使用或通过 `watch` 监听
|
|
177
|
+
- ✅ **模块化解构**:按需解构所需的方法和状态,避免引入不必要的依赖
|
|
178
|
+
- ✅ **标准调用方式**:`const { method, state } = useXxxState()`
|
|
179
|
+
|
|
180
|
+
---
|
|
181
|
+
|
|
182
|
+
### 📝 使用规范(重要)
|
|
183
|
+
|
|
184
|
+
#### 1. 标准解构方式
|
|
185
|
+
|
|
186
|
+
✅ **正确**:
|
|
187
|
+
```typescript
|
|
188
|
+
const { login, loginUserInfo } = useLoginState();
|
|
189
|
+
await login({ sdkAppId, userId, userSig });
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
❌ **错误**:
|
|
193
|
+
```typescript
|
|
194
|
+
const loginState = useLoginState();
|
|
195
|
+
await loginState.login({ sdkAppId, userId, userSig });
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
#### 2. 响应式数据访问
|
|
199
|
+
|
|
200
|
+
✅ **正确**:
|
|
201
|
+
```typescript
|
|
202
|
+
const { loginUserInfo } = useLoginState();
|
|
203
|
+
|
|
204
|
+
// 在 setup 中访问
|
|
205
|
+
if (loginUserInfo.value) {
|
|
206
|
+
console.log(loginUserInfo.value.userID);
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
// 在模板中访问(自动解包)
|
|
210
|
+
<template>
|
|
211
|
+
<div v-if="loginUserInfo">
|
|
212
|
+
{{ loginUserInfo.userID }}
|
|
213
|
+
</div>
|
|
214
|
+
</template>
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
❌ **错误**:
|
|
218
|
+
```typescript
|
|
219
|
+
// 忘记使用 .value
|
|
220
|
+
if (loginUserInfo) { // ❌ loginUserInfo 是 Ref 对象,不是布尔值
|
|
221
|
+
console.log(loginUserInfo.userID); // ❌ 无法访问
|
|
222
|
+
}
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
#### 3. 状态监听
|
|
226
|
+
|
|
227
|
+
```typescript
|
|
228
|
+
import { watch } from 'vue';
|
|
229
|
+
const { loginUserInfo } = useLoginState();
|
|
230
|
+
|
|
231
|
+
// 监听登录状态变化
|
|
232
|
+
watch(loginUserInfo, (newInfo, oldInfo) => {
|
|
233
|
+
if (newInfo) {
|
|
234
|
+
console.log('用户已登录:', newInfo.userID);
|
|
235
|
+
} else {
|
|
236
|
+
console.log('用户已登出');
|
|
237
|
+
}
|
|
238
|
+
});
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
---
|
|
242
|
+
|
|
243
|
+
### 🔗 参考资源
|
|
244
|
+
|
|
245
|
+
- **官方 API 文档**:https://web.sdk.qcloud.com/trtc/live/web/doc/zh/index.html
|
|
246
|
+
- **详细代码示例**:参考各功能模块的具体 feature 文档
|
|
247
|
+
|
|
248
|
+
---
|
|
249
|
+
|
|
250
|
+
## 🏗️ 通用集成步骤
|
|
251
|
+
|
|
252
|
+
#### 步骤 1:安装依赖
|
|
253
|
+
|
|
254
|
+
**核心依赖**:
|
|
255
|
+
|
|
256
|
+
```json
|
|
257
|
+
{
|
|
258
|
+
"tuikit-atomicx-vue3": "latest", // TUIRoomKit 原子化组件库(包含所有 Hooks 和 UI 组件,会自动安装 tuiroom-engine-js)
|
|
259
|
+
"@tencentcloud/uikit-base-component-vue3": "latest", // 基础 UI 组件库(按钮、输入框等通用组件)
|
|
260
|
+
"vue-router": "^4.0.0" // Vue 路由(用于页面导航,如需路由功能时安装)
|
|
261
|
+
}
|
|
262
|
+
```
|
|
263
|
+
|
|
264
|
+
**依赖说明**:
|
|
265
|
+
- **tuikit-atomicx-vue3**: 核心包,包含所有原子化 Hooks 和 UI 组件,会自动安装 `@tencentcloud/tuiroom-engine-js`
|
|
266
|
+
- **@tencentcloud/uikit-base-component-vue3**: 基础 UI 组件库(如需使用 TUIKit UI 组件时安装)
|
|
267
|
+
- **vue-router**: Vue 路由库(如需实现页面导航时安装)
|
|
268
|
+
|
|
269
|
+
**安装命令**:
|
|
270
|
+
|
|
271
|
+
```bash
|
|
272
|
+
# 最小化安装(仅核心包)
|
|
273
|
+
npm install tuikit-atomicx-vue3
|
|
274
|
+
|
|
275
|
+
# 完整安装(包含 UI 组件库和路由)
|
|
276
|
+
npm install tuikit-atomicx-vue3 @tencentcloud/uikit-base-component-vue3 vue-router
|
|
277
|
+
|
|
278
|
+
# 或使用 pnpm
|
|
279
|
+
pnpm install tuikit-atomicx-vue3
|
|
280
|
+
pnpm install tuikit-atomicx-vue3 @tencentcloud/uikit-base-component-vue3 vue-router
|
|
281
|
+
```
|
|
282
|
+
|
|
283
|
+
**构建环境补丁(Vite 项目)**:
|
|
284
|
+
|
|
285
|
+
若检测到 Vite 项目,Agent 必须在 `package.json` 自动增加补丁配置以兼容 esbuild-wasm:
|
|
286
|
+
|
|
287
|
+
```json
|
|
288
|
+
{
|
|
289
|
+
"overrides": {
|
|
290
|
+
"esbuild": "npm:esbuild-wasm@latest" // npm 使用此字段覆盖依赖版本
|
|
291
|
+
},
|
|
292
|
+
"resolutions": {
|
|
293
|
+
"esbuild": "npm:esbuild-wasm@latest" // yarn/pnpm 使用此字段覆盖依赖版本
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
**补丁说明**:
|
|
299
|
+
- **为什么需要**:部分环境下 esbuild 原生二进制可能无法正常运行,使用 esbuild-wasm(WebAssembly 版本)可以提供更好的跨平台兼容性
|
|
300
|
+
- **适用场景**:主要针对 Vite 构建工具的项目
|
|
301
|
+
- **作用**:强制将项目中所有依赖的 esbuild 版本替换为 esbuild-wasm 版本
|
|
302
|
+
|
|
303
|
+
#### 步骤 2:登录鉴权(前置必须)
|
|
304
|
+
|
|
305
|
+
所有功能模块使用前必须先完成登录。详细代码请参考具体 feature 文档中的示例。
|
|
306
|
+
|
|
307
|
+
#### 步骤 3:引入和使用功能 Hook
|
|
308
|
+
|
|
309
|
+
所有 Hooks 都从 `tuikit-atomicx-vue3` 导入,具体 API 调用方式请参考 feature 文档。
|
|
310
|
+
|
|
311
|
+
---
|
|
312
|
+
|
|
313
|
+
## 🎨 代码生成规范
|
|
314
|
+
|
|
315
|
+
### 1. Vue 3 组合式 API
|
|
316
|
+
|
|
317
|
+
- 使用 `<script setup lang="ts">` 语法
|
|
318
|
+
- 使用 Vue 3 Composition API(ref、reactive、computed、onMounted 等)
|
|
319
|
+
- 从 `tuikit-atomicx-vue3` 导入所需 Hooks
|
|
320
|
+
|
|
321
|
+
### 2. TypeScript 类型安全
|
|
322
|
+
|
|
323
|
+
- 使用官方类型定义(从 `@tencentcloud/tuiroom-engine-js` 导入)
|
|
324
|
+
- 为状态变量添加正确的类型注解
|
|
325
|
+
|
|
326
|
+
### 3. 错误处理
|
|
327
|
+
|
|
328
|
+
- 所有异步操作必须使用 try-catch 处理错误
|
|
329
|
+
- 提供友好的错误提示
|
|
330
|
+
|
|
331
|
+
### 4. 麦克风开关最佳实践(重要)
|
|
332
|
+
|
|
333
|
+
#### 核心原则
|
|
334
|
+
|
|
335
|
+
**麦克风物理开启只在进房时执行一次,中途开关使用静音/取消静音**。
|
|
336
|
+
|
|
337
|
+
#### 实现方式
|
|
338
|
+
|
|
339
|
+
| 场景 | API 调用 | 说明 |
|
|
340
|
+
|------|---------|------|
|
|
341
|
+
| **进房时开启麦克风** | `await openLocalMicrophone()`<br>`await unmuteLocalAudio()` | 物理打开麦克风设备并取消静音 |
|
|
342
|
+
| **中途关闭麦克风** | `await muteLocalAudio()` | 仅静音,不关闭物理设备 |
|
|
343
|
+
| **中途开启麦克风** | `await unmuteLocalAudio()` | 仅取消静音,不重新打开物理设备 |
|
|
344
|
+
|
|
345
|
+
#### 代码示例
|
|
346
|
+
|
|
347
|
+
```typescript
|
|
348
|
+
import { useDeviceState } from 'tuikit-atomicx-vue3';
|
|
349
|
+
|
|
350
|
+
const { openLocalMicrophone, muteLocalAudio, unmuteLocalAudio } = useDeviceState();
|
|
351
|
+
|
|
352
|
+
// ✅ 正确:进房时初始化麦克风
|
|
353
|
+
async function enterRoomWithMicrophone() {
|
|
354
|
+
try {
|
|
355
|
+
// 1. 加入房间
|
|
356
|
+
await joinRoom('room123');
|
|
357
|
+
|
|
358
|
+
// 2. 物理打开麦克风(仅此一次)
|
|
359
|
+
await openLocalMicrophone();
|
|
360
|
+
|
|
361
|
+
// 3. 取消静音
|
|
362
|
+
await unmuteLocalAudio();
|
|
363
|
+
} catch (error) {
|
|
364
|
+
console.error('初始化麦克风失败:', error);
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
// ✅ 正确:中途关闭麦克风(静音)
|
|
369
|
+
async function closeMicInRoom() {
|
|
370
|
+
try {
|
|
371
|
+
await muteLocalAudio(); // 仅静音,不关闭物理设备
|
|
372
|
+
} catch (error) {
|
|
373
|
+
console.error('静音失败:', error);
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
// ✅ 正确:中途开启麦克风(取消静音)
|
|
378
|
+
async function openMicInRoom() {
|
|
379
|
+
try {
|
|
380
|
+
await unmuteLocalAudio(); // 仅取消静音,不重新打开物理设备
|
|
381
|
+
} catch (error) {
|
|
382
|
+
console.error('取消静音失败:', error);
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
// ❌ 错误:中途重复调用 openLocalMicrophone
|
|
387
|
+
async function wrongWayToOpenMic() {
|
|
388
|
+
// 不要在中途调用,会导致延迟和吞音问题
|
|
389
|
+
await openLocalMicrophone(); // ❌ 错误!
|
|
390
|
+
await unmuteLocalAudio();
|
|
391
|
+
}
|
|
392
|
+
```
|
|
393
|
+
|
|
394
|
+
#### 技术原因
|
|
395
|
+
|
|
396
|
+
1. **性能优化**:麦克风物理设备的开启需要硬件初始化,耗时较长(通常 100-300ms)
|
|
397
|
+
2. **避免吞音**:频繁打开/关闭物理设备可能导致音频流的首包丢失,造成吞音现象
|
|
398
|
+
3. **用户体验**:静音/取消静音操作即时响应,无延迟感
|
|
399
|
+
|
|
400
|
+
#### 强制约束
|
|
401
|
+
|
|
402
|
+
- ✅ **必须**在进房时调用 `openLocalMicrophone()` 初始化麦克风
|
|
403
|
+
- ✅ **必须**在中途开关麦克风时使用 `muteLocalAudio()` / `unmuteLocalAudio()`
|
|
404
|
+
- ❌ **禁止**在会议中途重复调用 `openLocalMicrophone()`
|
|
405
|
+
- ❌ **禁止**使用 `closeLocalMicrophone()` 然后再 `openLocalMicrophone()` 的方式
|
|
406
|
+
|
|
407
|
+
### 5. 视频流渲染最佳实践(推荐)
|
|
408
|
+
|
|
409
|
+
#### 核心原则
|
|
410
|
+
|
|
411
|
+
**使用 State API 开发时,推荐使用 `RoomParticipantView` 组件渲染视频流**。
|
|
412
|
+
|
|
413
|
+
#### 平台适用性
|
|
414
|
+
|
|
415
|
+
| 组件 | 适用平台 | 说明 |
|
|
416
|
+
|------|---------|------|
|
|
417
|
+
| **RoomParticipantView** | ✅ H5 移动端<br>✅ PC Web 端 | **H5 开发优先推荐**,轻量级,适配移动端和桌面端 |
|
|
418
|
+
| **RoomView** | ✅ PC Web 端 | 仅适用于 PC 端,包含完整的会议室布局 |
|
|
419
|
+
|
|
420
|
+
**强制约束**:
|
|
421
|
+
- ✅ **H5 移动端开发**:必须使用 `RoomParticipantView` 组件
|
|
422
|
+
- ✅ **PC Web 端开发**:优先推荐 `RoomParticipantView` 组件,更灵活
|
|
423
|
+
- ⚠️ **RoomView** 仅用于 PC 端且需要完整会议室布局的场景
|
|
424
|
+
|
|
425
|
+
#### 推荐导入方式
|
|
426
|
+
|
|
427
|
+
```typescript
|
|
428
|
+
import { RoomParticipantView } from 'tuikit-atomicx-vue3/room';
|
|
429
|
+
```
|
|
430
|
+
|
|
431
|
+
#### 使用示例
|
|
432
|
+
|
|
433
|
+
##### 基础用法:直接渲染参与者视频
|
|
434
|
+
|
|
435
|
+
```vue
|
|
436
|
+
<template>
|
|
437
|
+
<div class="video-container">
|
|
438
|
+
<!-- 渲染本地视频流 -->
|
|
439
|
+
<RoomParticipantView
|
|
440
|
+
v-if="localParticipant"
|
|
441
|
+
:participant="localParticipant"
|
|
442
|
+
:stream-type="VideoStreamType.Camera"
|
|
443
|
+
/>
|
|
444
|
+
|
|
445
|
+
<!-- 渲染远端视频流 -->
|
|
446
|
+
<RoomParticipantView
|
|
447
|
+
v-for="user in remoteParticipants"
|
|
448
|
+
:key="user.userId"
|
|
449
|
+
:participant="user"
|
|
450
|
+
:stream-type="VideoStreamType.Camera"
|
|
451
|
+
/>
|
|
452
|
+
</div>
|
|
453
|
+
</template>
|
|
454
|
+
|
|
455
|
+
<script setup lang="ts">
|
|
456
|
+
import { RoomParticipantView, VideoStreamType } from 'tuikit-atomicx-vue3/room';
|
|
457
|
+
import { useRoomParticipantState } from 'tuikit-atomicx-vue3';
|
|
458
|
+
|
|
459
|
+
const { localParticipant, remoteParticipants } = useRoomParticipantState();
|
|
460
|
+
</script>
|
|
461
|
+
```
|
|
462
|
+
|
|
463
|
+
##### 高级用法:区分本地屏幕分享和摄像头流
|
|
464
|
+
|
|
465
|
+
```vue
|
|
466
|
+
<template>
|
|
467
|
+
<LocalScreenViewUI v-if="isLocalScreen" />
|
|
468
|
+
<ParticipantViewUI
|
|
469
|
+
v-else
|
|
470
|
+
:participant="participant"
|
|
471
|
+
:stream-type="streamType"
|
|
472
|
+
/>
|
|
473
|
+
</template>
|
|
474
|
+
|
|
475
|
+
<script setup lang="ts">
|
|
476
|
+
import { computed } from 'vue';
|
|
477
|
+
import { useRoomParticipantState, VideoStreamType } from 'tuikit-atomicx-vue3/room';
|
|
478
|
+
import LocalScreenViewUI from './LocalScreenViewUI.vue';
|
|
479
|
+
import ParticipantViewUI from './ParticipantViewUI.vue';
|
|
480
|
+
import type { RoomParticipant } from 'tuikit-atomicx-vue3/room';
|
|
481
|
+
|
|
482
|
+
interface Props {
|
|
483
|
+
participant: RoomParticipant;
|
|
484
|
+
streamType: VideoStreamType;
|
|
485
|
+
}
|
|
486
|
+
const props = defineProps<Props>();
|
|
487
|
+
|
|
488
|
+
const { localParticipant } = useRoomParticipantState();
|
|
489
|
+
|
|
490
|
+
// 判断是否为本地屏幕分享流
|
|
491
|
+
const isLocalScreen = computed(() =>
|
|
492
|
+
props.participant.userId === localParticipant.value?.userId &&
|
|
493
|
+
props.streamType === VideoStreamType.Screen
|
|
494
|
+
);
|
|
495
|
+
</script>
|
|
496
|
+
```
|
|
497
|
+
|
|
498
|
+
#### 优势
|
|
499
|
+
|
|
500
|
+
1. **自动管理视频流**:组件内部自动处理视频流的订阅、渲染和销毁
|
|
501
|
+
2. **状态同步**:自动同步用户的音视频状态(静音、关闭摄像头等)
|
|
502
|
+
3. **简化开发**:无需手动操作 DOM 或管理视频元素
|
|
503
|
+
4. **最佳实践**:封装了 TRTC 视频渲染的最佳实践和优化
|
|
504
|
+
|
|
505
|
+
#### 强制约束
|
|
506
|
+
|
|
507
|
+
- ✅ **推荐**使用 `RoomParticipantView` 组件渲染视频流
|
|
508
|
+
- ✅ **必须**从 `tuikit-atomicx-vue3/room` 导入
|
|
509
|
+
- ⚠️ 如需自定义渲染逻辑,请参考 feature 文档中的高级用法
|
|
510
|
+
|
|
511
|
+
**详细代码示例请参考具体 feature 文档。**
|
|
512
|
+
|
|
513
|
+
---
|
|
514
|
+
|
|
515
|
+
## 🔗 工具参考
|
|
516
|
+
|
|
517
|
+
### `get_usersig` - 生成用户签名(登录必须)
|
|
518
|
+
|
|
519
|
+
**用途**:Agent 调用此 MCP 工具获取登录凭证(SDKAppID、userID、userSig),用于用户代码中的登录调用。
|
|
520
|
+
|
|
521
|
+
**强制约束**:
|
|
522
|
+
- ✅ Agent 必须调用此工具获取登录凭证
|
|
523
|
+
- ❌ 禁止手动编写 UserSig 生成代码
|
|
524
|
+
- ⚠️ 必须告知用户:生产环境中应在服务端生成 UserSig
|
|
525
|
+
|
|
526
|
+
---
|
|
527
|
+
|
|
528
|
+
### `record_result` - 记录集成结果
|
|
529
|
+
|
|
530
|
+
**用途**:记录功能集成过程和结果,用于统计分析
|
|
531
|
+
|
|
532
|
+
**调用时机**:在完成功能集成并验证无误后调用
|
|
533
|
+
|
|
534
|
+
---
|
|
535
|
+
|
|
536
|
+
## 📝 关键要点总结
|
|
537
|
+
|
|
538
|
+
| 类别 | 要求 |
|
|
539
|
+
|------|------|
|
|
540
|
+
| **适用场景** | 使用 RoomKit 原子化 API 自定义实现会议 UI |
|
|
541
|
+
| **平台支持** | ✅ RoomKit State API 完全支持 H5 移动端和 PC Web 端 |
|
|
542
|
+
| **登录鉴权** | ✅ 必须使用 `get_usersig` 工具 + `useLoginState` Hook |
|
|
543
|
+
| **API 调用** | ✅ 必须使用官方 Hooks(useRoomState、useDeviceState 等) |
|
|
544
|
+
| **文档优先** | 严格遵循本次返回的功能文档内容 |
|
|
545
|
+
| **错误处理** | 所有异步操作必须使用 try-catch 处理错误 |
|
|
546
|
+
| **安全提示** | ⚠️ 必须告知用户:生产环境中 UserSig 应在服务端生成 |
|
|
547
|
+
| **支持框架** | Vue 3.4.21+ (使用 Composition API) |
|
|
548
|
+
|
|
549
|
+
---
|
|
550
|
+
|
|
551
|
+
**适用框架**: Vue 3.4.21+
|
|
552
|
+
**集成模式**: Feature 自实现 UI(原子化 API)
|
|
553
|
+
**平台支持**: H5 移动端 + PC Web 端
|