@tencentcloud/sdk-mcp 1.3.0 → 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.
Files changed (67) hide show
  1. package/index.js +5 -1
  2. package/index.js.map +1 -1
  3. package/package.json +2 -2
  4. package/resource/doc/chatuikit/faq/web_sdk/faq.md +117 -0
  5. package/resource/doc/chatuikit/flutter/client_api_Flutter.md +100 -179
  6. package/resource/doc/chatuikit/flutter/faq.md +17 -112
  7. package/resource/doc/chatuikit/flutter/integrate_tuikit_Flutter.md +272 -1281
  8. package/resource/doc/chatuikit/react/integration.md +516 -48
  9. package/resource/doc/chatuikit/react/workflow.md +254 -0
  10. package/resource/doc/chatuikit/uniapp-app/faq.md +0 -0
  11. package/resource/doc/chatuikit/uniapp-app/integration.md +619 -0
  12. package/resource/doc/chatuikit/uniapp-app/workflow.md +576 -0
  13. package/resource/doc/chatuikit/vue/integration.md +511 -129
  14. package/resource/doc/chatuikit/vue/workflow.md +395 -0
  15. package/resource/doc/roomkit/vue/features/call-user-to-room.md +256 -0
  16. package/resource/doc/roomkit/vue/features/device-detection.md +388 -0
  17. package/resource/doc/roomkit/vue/features/device-state.md +480 -0
  18. package/resource/doc/roomkit/vue/features/free-beauty-panel.md +238 -0
  19. package/resource/doc/roomkit/vue/features/room-chat.md +427 -0
  20. package/resource/doc/roomkit/vue/features/room-participant-state.md +407 -0
  21. package/resource/doc/roomkit/vue/features/room-state.md +291 -0
  22. package/resource/doc/roomkit/vue/features/room-view.md +338 -0
  23. package/resource/doc/roomkit/vue/features/schedule-room.md +349 -0
  24. package/resource/doc/roomkit/vue/features/screen-share.md +333 -0
  25. package/resource/doc/roomkit/vue/features/virtual-background.md +281 -0
  26. package/resource/doc/roomkit/vue/features/workflow.md +553 -0
  27. package/resource/doc/roomkit/vue/integration.md +479 -0
  28. package/resource/doc/roomkit/vue/workflow.md +487 -0
  29. package/resource/doc/tuicallkit/react/api.md +16 -0
  30. package/resource/doc/tuicallkit/vue/api.md +16 -0
  31. package/tools/chat/get-web-chat-integration.js +31 -14
  32. package/tools/chat/get-web-chat-integration.js.map +1 -1
  33. package/tools/definitions/get_web_chat_uikit_integration_def.js +18 -11
  34. package/tools/definitions/get_web_chat_uikit_integration_def.js.map +1 -1
  35. package/tools/definitions/get_web_live_uikit_integration_def.js +1 -1
  36. package/tools/definitions/get_web_room_feature_detail_def.js +95 -0
  37. package/tools/definitions/get_web_room_feature_detail_def.js.map +1 -0
  38. package/tools/definitions/get_web_room_uikit_integration_def.js +44 -0
  39. package/tools/definitions/get_web_room_uikit_integration_def.js.map +1 -0
  40. package/tools/definitions/present_framework_choice_def.js +1 -1
  41. package/tools/definitions/record_result_def.js +1 -1
  42. package/tools/definitions/record_result_def.js.map +1 -1
  43. package/tools/index.js +4 -4
  44. package/tools/index.js.map +1 -1
  45. package/tools/live/get-web-live-uikit-integration.js +1 -1
  46. package/tools/room/get-web-room-feature-detail.js +68 -0
  47. package/tools/room/get-web-room-feature-detail.js.map +1 -0
  48. package/tools/room/get-web-room-integration.js +43 -0
  49. package/tools/room/get-web-room-integration.js.map +1 -0
  50. package/utils/generate-structured-result.js +2 -2
  51. package/utils/generate-structured-result.js.map +1 -1
  52. package/utils/report-cls-client.js +1 -1
  53. package/utils/report-es-client.js +1 -1
  54. package/resource/doc/chatuikit/react/chat_window_integration.md +0 -83
  55. package/resource/doc/chatuikit/vue/chat_window_integration.md +0 -131
  56. package/resource/doc/roomkit/vue/states/device-state.md +0 -316
  57. package/resource/doc/roomkit/vue/states/login-state.md +0 -51
  58. package/resource/doc/roomkit/vue/states/room-list-state.md +0 -287
  59. package/resource/doc/roomkit/vue/states/room-participant-state.md +0 -307
  60. package/tools/chat/get-web-chat-window-integration.js +0 -28
  61. package/tools/chat/get-web-chat-window-integration.js.map +0 -1
  62. package/tools/definitions/get_web_chat_window_integration_def.js +0 -26
  63. package/tools/definitions/get_web_chat_window_integration_def.js.map +0 -1
  64. package/tools/definitions/get_web_room_state_detail_def.js +0 -19
  65. package/tools/definitions/get_web_room_state_detail_def.js.map +0 -1
  66. package/tools/room/get-web-room-state-detail.js +0 -31
  67. package/tools/room/get-web-room-state-detail.js.map +0 -1
@@ -0,0 +1,480 @@
1
+ 本文档指导您如何使用 Atomicx 组件和 `useDeviceState` Hook 来管理会议中的音视频设备(摄像头、麦克风、扬声器)状态,以及如何获取本地网络质量信息。
2
+
3
+ ## 功能介绍
4
+ - **设备枚举与切换:**支持实时获取系统可用设备列表,并实现无缝切换。
5
+
6
+ - **状态精细化控制:**提供开启/关闭、采集静音、音量调节及实时音量监测能力。
7
+
8
+ - **错误诊断:**实时反馈硬件冲突、系统权限缺失等异常状态。
9
+
10
+ - **网络质量监控:**提供包含延迟、丢包率在内的多维度网络信息。
11
+
12
+
13
+ ## 前提条件
14
+ - 用户已经通过 [useLoginState](https://web.sdk.qcloud.com/trtc/live/web/doc/zh/index.html#module-LoginState) 完成登录鉴权,请参考 [接入概览](https://write.woa.com/document/197379797539790848)。
15
+
16
+ - 若在 `iframe` 中集成,需在标签中声明权限。
17
+
18
+ ``` typescript
19
+ <iframe allow="microphone; camera;"></iframe>
20
+ ```
21
+
22
+ ## 实现摄像头管理
23
+
24
+ 您可以通过 [useDeviceState](https://web.sdk.qcloud.com/trtc/live/web/doc/zh/index.html#module-DeviceState) 来控制本地摄像头的开关、切换设备,并监听采集状态和错误。
25
+
26
+ ### 步骤1:开启/关闭摄像头
27
+
28
+ 通过调用 [openLocalCamera](https://web.sdk.qcloud.com/trtc/live/web/doc/zh/index.html#openLocalCamera) 和 [closeLocalCamera](https://web.sdk.qcloud.com/trtc/live/web/doc/zh/index.html#closeLocalCamera) 方法来控制摄像头的开关。
29
+ ``` typescript
30
+ import { useDeviceState, DeviceStatus } from 'tuikit-atomicx-vue3/room';
31
+ const { cameraStatus, openLocalCamera, closeLocalCamera } = useDeviceState();
32
+ const toggleCamera = async () => {
33
+ if (cameraStatus.value === DeviceStatus.On) {
34
+ await closeLocalCamera();
35
+ } else {
36
+ await openLocalCamera();
37
+ }
38
+ };
39
+ ```
40
+
41
+ ### 步骤2:获取/切换摄像头设备
42
+
43
+ #### 桌面端获取和切换摄像头示例
44
+
45
+ 您可以通过 [cameraList](https://web.sdk.qcloud.com/trtc/live/web/doc/zh/index.html#cameraList) 获取所有可用的摄像头设备,使用 [setCurrentCamera](https://web.sdk.qcloud.com/trtc/live/web/doc/zh/index.html#setCurrentCamera) 方法切换当前使用的摄像头。
46
+ ``` typescript
47
+ import { useDeviceState } from 'tuikit-atomicx-vue3/room';
48
+ const { cameraList, currentCamera, getCameraList, setCurrentCamera } = useDeviceState();
49
+
50
+ // 获取摄像头列表
51
+ await getCameraList();
52
+
53
+ // 遍历并显示可用摄像头
54
+ cameraList.value.forEach((camera) => {
55
+ console.log(`摄像头: ${camera.deviceName} (${camera.deviceId})`);
56
+ });
57
+
58
+ // 切换到指定摄像头
59
+ const switchCamera = async (deviceId: string) => {
60
+ try {
61
+ // 切换设备(如果摄像头已开启,会自动使用新设备重新采集)
62
+ await setCurrentCamera({ deviceId });
63
+ console.log('摄像头切换成功');
64
+ } catch (error) {
65
+ console.error('摄像头切换失败:', error);
66
+ // 切换失败时会保持使用原设备
67
+ }
68
+ };
69
+
70
+ // 监听当前摄像头变化
71
+ watch(currentCamera, (camera) => {
72
+ if (camera) {
73
+ console.log('当前使用摄像头:', camera.deviceName);
74
+ }
75
+ });
76
+ ```
77
+
78
+ > **说明:**
79
+ >
80
+
81
+ > 调用 [setCurrentCamera](https://web.sdk.qcloud.com/trtc/live/web/doc/zh/index.html#setCurrentCamera) 切换设备时,如果摄像头已开启,Atomicx 会自动停止当前设备的采集,并使用新设备重新开始采集,视频流会无缝切换。如果切换失败,会保持使用原设备。
82
+ >
83
+
84
+
85
+ #### 移动端切换摄像头示例
86
+
87
+ 移动端使用 [switchCamera](https://web.sdk.qcloud.com/trtc/live/web/doc/zh/index.html#switchCamera) 切换前后置摄像头。
88
+ ``` typescript
89
+ import { useDeviceState } from 'tuikit-atomicx-vue3/room';
90
+ const { isFrontCamera, switchCamera } = useDeviceState();
91
+
92
+ // 判断是否为移动端
93
+ const isMobile = /Android|webOS|iPhone|iPad|iPod/i.test(navigator.userAgent);
94
+
95
+ // 切换前后置摄像头(仅移动端支持)
96
+ const toggleCamera = async () => {
97
+ if (!isMobile) {
98
+ console.warn('前后置摄像头切换仅在移动端支持');
99
+ return;
100
+ }
101
+
102
+ // 切换到相反的摄像头
103
+ await switchCamera({ isFrontCamera: !isFrontCamera.value });
104
+ console.log(`已切换到${isFrontCamera.value ? '前置' : '后置'}摄像头`);
105
+ };
106
+ ```
107
+
108
+ ### 步骤3:处理摄像头采集错误
109
+
110
+ 当摄像头采集发生错误时,您可以通过 [cameraLastError](https://web.sdk.qcloud.com/trtc/live/web/doc/zh/index.html#cameraLastError) 属性获取错误信息。
111
+
112
+ > 注意:
113
+ >
114
+
115
+ > 常见的摄像头错误包括 `NoSystemPermission` (无系统权限) 和 `OccupiedError`(设备被占用)。您应基于此属性向用户展示明确的错误提示。
116
+ >
117
+
118
+ ``` typescript
119
+ import { useDeviceState, DeviceError } from 'tuikit-atomicx-vue3/room';
120
+ const { cameraLastError } = useDeviceState();
121
+
122
+ // 监听摄像头错误
123
+ watch(cameraLastError, (error) => {
124
+ switch (error) {
125
+ case DeviceError.NoSystemPermission:
126
+ console.error('摄像头权限被拒绝,请在系统设置中开启摄像头权限');
127
+ break;
128
+ case DeviceError.NoDeviceDetected:
129
+ console.error('未检测到摄像头设备');
130
+ break;
131
+ case DeviceError.OccupiedError:
132
+ console.error('摄像头被其他应用占用');
133
+ break;
134
+ case DeviceError.NotSupportCapture:
135
+ console.error('当前浏览器不支持摄像头采集');
136
+ break;
137
+ default:
138
+ break;
139
+ }
140
+ });
141
+ ```
142
+
143
+ ## 实现麦克风管理
144
+
145
+ 您可以通过 [useDeviceState](https://web.sdk.qcloud.com/trtc/live/web/doc/zh/index.html#module-DeviceState) 来控制本地麦克风的开关、静音、音量调节和实时音量显示,并监听采集状态和错误。
146
+
147
+ ### 步骤1:开启/关闭麦克风
148
+ ``` typescript
149
+ import { useDeviceState, DeviceStatus } from 'tuikit-atomicx-vue3/room';
150
+ const { microphoneStatus, openLocalMicrophone, closeLocalMicrophone } = useDeviceState();
151
+ const toggleMicrophone = async () => {
152
+ if (microphoneStatus.value === DeviceStatus.On) {
153
+ await closeLocalMicrophone();
154
+ } else {
155
+ await openLocalMicrophone();
156
+ }
157
+ };
158
+ ```
159
+
160
+ ### 步骤2:获取/切换麦克风设备
161
+
162
+ #### 桌面端浏览器获取/切换麦克风示例
163
+
164
+ 您可以通过 [microphoneList](https://web.sdk.qcloud.com/trtc/live/web/doc/zh/index.html#microphoneList) 获取所有可用的麦克风设备,使用 [setCurrentMicrophone](https://web.sdk.qcloud.com/trtc/live/web/doc/zh/index.html#setCurrentMicrophone) 方法切换当前使用的麦克风。
165
+ ``` typescript
166
+ import { useDeviceState } from 'tuikit-atomicx-vue3/room';
167
+
168
+ const {
169
+ microphoneList,
170
+ currentMicrophone,
171
+ getMicrophoneList,
172
+ setCurrentMicrophone
173
+ } = useDeviceState();
174
+
175
+ // 获取麦克风列表
176
+ await getMicrophoneList();
177
+
178
+ // 遍历并显示可用麦克风
179
+ microphoneList.value.forEach((mic) => {
180
+ console.log(`麦克风: ${mic.deviceName} (${mic.deviceId})`);
181
+ });
182
+
183
+ // 切换到指定麦克风
184
+ const switchMicrophone = async (deviceId: string) => {
185
+ await setCurrentMicrophone({ deviceId });
186
+ };
187
+
188
+ // 监听当前麦克风变化
189
+ watch(currentMicrophone, (mic) => {
190
+ if (mic) {
191
+ console.log('当前使用麦克风:', mic.deviceName);
192
+ }
193
+ });
194
+ ```
195
+
196
+ ### 步骤3:设置采集音量
197
+
198
+ 您可以使用 [setCaptureVolume](https://web.sdk.qcloud.com/trtc/live/web/doc/zh/index.html#setCaptureVolume) 方法来调整本地麦克风的采集音量。
199
+ ``` typescript
200
+ import { useDeviceState } from 'tuikit-atomicx-vue3/room';
201
+ const { captureVolume, setCaptureVolume } = useDeviceState();
202
+
203
+ // 设置采集音量为 50%
204
+ await setCaptureVolume(50);
205
+
206
+ // 监听采集音量变化
207
+ watch(captureVolume, (volume) => {
208
+ console.log('当前采集音量:', volume);
209
+ });
210
+ ```
211
+
212
+ ### 步骤4:显示实时音量
213
+
214
+ [currentMicVolume](https://web.sdk.qcloud.com/trtc/live/web/doc/zh/index.html#currentMicVolume) 属性会实时更新本地麦克风的采集音量,可用于音量条的动态显示。
215
+ ``` typescript
216
+ <template>
217
+ <div class="mic-volume">
218
+ <label>麦克风音量</label>
219
+ <div class="volume-bar-container">
220
+ <div
221
+ class="volume-bar"
222
+ :style="{ width: `${currentMicVolume}%` }"
223
+ />
224
+ </div>
225
+ <span>{{ currentMicVolume }}</span>
226
+ </div>
227
+ </template>
228
+
229
+ <script setup lang="ts">
230
+ import { useDeviceState } from 'tuikit-atomicx-vue3/room';
231
+ const { currentMicVolume } = useDeviceState();
232
+ </script>
233
+
234
+ <style scoped>
235
+ .volume-bar-container {
236
+ width: 200px;
237
+ height: 8px;
238
+ background-color: #e0e0e0;
239
+ border-radius: 4px;
240
+ overflow: hidden;
241
+ }
242
+
243
+ .volume-bar {
244
+ height: 100%;
245
+ background-color: #4caf50;
246
+ transition: width 0.1s ease;
247
+ }
248
+ </style>
249
+ ```
250
+
251
+ ### 步骤5:处理麦克风采集错误
252
+
253
+ 当麦克风采集发生错误时,您可以通过 [microphoneLastError](https://web.sdk.qcloud.com/trtc/live/web/doc/zh/index.html#microphoneLastError) 数据获取错误信息。
254
+ ``` typescript
255
+ import { useDeviceState, DeviceError } from 'tuikit-atomicx-vue3/room';
256
+ const { microphoneLastError } = useDeviceState();
257
+
258
+ // 监听麦克风错误
259
+ watch(microphoneLastError, (error) => {
260
+ switch (error) {
261
+ case DeviceError.NoSystemPermission:
262
+ console.error('麦克风权限被拒绝,请在系统设置中开启麦克风权限');
263
+ break;
264
+ case DeviceError.NoDeviceDetected:
265
+ console.error('未检测到麦克风设备');
266
+ break;
267
+ case DeviceError.OccupiedError:
268
+ console.error('麦克风被其他应用占用');
269
+ break;
270
+ case DeviceError.NotSupportCapture:
271
+ console.error('当前浏览器不支持麦克风采集');
272
+ break;
273
+ default:
274
+ break;
275
+ }
276
+ });
277
+ ```
278
+
279
+ ## 实现扬声器管理
280
+
281
+ 扬声器(播放设备)主要涉及切换设备和设置播放音量。
282
+
283
+ ### 步骤1:获取/切换扬声器设备
284
+
285
+ 您可以通过 [speakerList](https://web.sdk.qcloud.com/trtc/live/web/doc/zh/index.html#speakerList) 获取所有可用的扬声器设备,使用 [setCurrentSpeaker](https://web.sdk.qcloud.com/trtc/live/web/doc/zh/index.html#setCurrentSpeaker) 方法切换当前使用的扬声器。
286
+ ``` typescript
287
+ import { useDeviceState } from 'tuikit-atomicx-vue3/room';
288
+ const {
289
+ speakerList,
290
+ currentSpeaker,
291
+ getSpeakerList,
292
+ setCurrentSpeaker
293
+ } = useDeviceState();
294
+
295
+ // 获取扬声器列表
296
+ await getSpeakerList();
297
+
298
+ // 遍历并显示可用扬声器
299
+ speakerList.value.forEach((speaker) => {
300
+ console.log(`扬声器: ${speaker.deviceName} (${speaker.deviceId})`);
301
+ });
302
+
303
+ // 切换到指定扬声器
304
+ const switchSpeaker = async (deviceId: string) => {
305
+ await setCurrentSpeaker({ deviceId });
306
+ };
307
+
308
+ // 监听当前扬声器变化
309
+ watch(currentSpeaker, (speaker) => {
310
+ if (speaker) {
311
+ console.log('当前使用扬声器:', speaker.deviceName);
312
+ }
313
+ });
314
+ ```
315
+
316
+ ### 步骤2:设置播放音量
317
+
318
+ 您可以使用 [setOutputVolume](https://web.sdk.qcloud.com/trtc/live/web/doc/zh/index.html#setOutputVolume) 方法来调整扬声器的播放音量。
319
+ ``` typescript
320
+ import { useDeviceState } from 'tuikit-atomicx-vue3/room';
321
+ const { outputVolume, setOutputVolume } = useDeviceState();
322
+
323
+ // 设置播放音量为 60%
324
+ await setOutputVolume(60);
325
+
326
+ // 监听播放音量变化
327
+ watch(outputVolume, (volume) => {
328
+ console.log('当前播放音量:', volume);
329
+ });
330
+ ```
331
+
332
+ ## 实现网络质量监控
333
+
334
+ 使用 [useDeviceState](https://web.sdk.qcloud.com/trtc/live/web/doc/zh/index.html#module-DeviceState) 中的 [networkInfo](https://web.sdk.qcloud.com/trtc/live/web/doc/zh/index.html#networkInfo) 数据,您可以实时监控本地用户的网络质量。
335
+
336
+ > **说明:**
337
+ >
338
+
339
+ > 仅当本地用户通过 [joinRoom](https://web.sdk.qcloud.com/trtc/live/web/doc/zh/index.html#joinRoom)加入房间并打开麦克风或摄像头时,[networkInfo](https://web.sdk.qcloud.com/trtc/live/web/doc/zh/index.html#networkInfo) 中才可以拿到有效数据。
340
+ >
341
+
342
+ ``` typescript
343
+ <template>
344
+ <div class="network-indicator" @click="showDetails = !showDetails">
345
+ <TUIIcon v-if="networkIcon" :icon="networkIcon" />
346
+ <span class="network-text">{{ networkText }}</span>
347
+ <div v-if="showDetails" class="network-details">
348
+ <div>延迟: {{ networkInfo?.delay }}ms</div>
349
+ <div>上行丢包: {{ networkInfo?.upLoss }}%</div>
350
+ <div>下行丢包: {{ networkInfo?.downLoss }}%</div>
351
+ </div>
352
+ </div>
353
+ </template>
354
+
355
+ <script setup lang="ts">
356
+ import { computed, ref } from 'vue';
357
+ import {
358
+ IconNetworkStability,
359
+ IconNetworkFluctuation,
360
+ IconNetworkLag,
361
+ IconNetworkDisconnected,
362
+ IconArrowStrokeUp,
363
+ } from '@tencentcloud/uikit-base-component-vue3';
364
+ import { useDeviceState, NetworkQuality } from 'tuikit-atomicx-vue3/room';
365
+
366
+ const { networkInfo } = useDeviceState();
367
+ const showDetails = ref(false);
368
+
369
+ // 网络质量图标
370
+ const networkIcon = computed(() => {
371
+ if (!networkInfo.value) return '';
372
+ switch (networkInfo.value.quality) {
373
+ case NetworkQuality.Excellent:
374
+ case NetworkQuality.Good:
375
+ return IconNetworkStability;
376
+ case NetworkQuality.Poor:
377
+ return IconNetworkFluctuation;
378
+ case NetworkQuality.Bad:
379
+ case NetworkQuality.VeryBad:
380
+ return IconNetworkLag;
381
+ case NetworkQuality.Down:
382
+ return IconNetworkDisconnected;
383
+ default:
384
+ return '';
385
+ }
386
+ });
387
+
388
+ // 网络质量文本
389
+ const networkText = computed(() => {
390
+ if (!networkInfo.value) return '未知';
391
+ switch (networkInfo.value.quality) {
392
+ case NetworkQuality.Excellent:
393
+ return '优秀';
394
+ case NetworkQuality.Good:
395
+ return '良好';
396
+ case NetworkQuality.Poor:
397
+ return '一般';
398
+ case NetworkQuality.Bad:
399
+ return '差';
400
+ case NetworkQuality.VeryBad:
401
+ return '很差';
402
+ case NetworkQuality.Down:
403
+ return '断开';
404
+ default:
405
+ return '未知';
406
+ }
407
+ });
408
+ </script>
409
+
410
+ <style scoped>
411
+
412
+ .network-indicator {
413
+ position: relative;
414
+ display: flex;
415
+ align-items: center;
416
+ gap: 8px;
417
+ padding: 8px 12px;
418
+ border-radius: 4px;
419
+ cursor: pointer;
420
+ }
421
+
422
+ .network-details {
423
+ position: absolute;
424
+ top: 100%;
425
+ left: 0;
426
+ margin-top: 4px;
427
+ padding: 8px;
428
+ background: white;
429
+ border-radius: 4px;
430
+ box-shadow: 0 2px 8px rgba(0,0,0,0.15);
431
+ font-size: 12px;
432
+ white-space: nowrap;
433
+ z-index: 2;
434
+ }
435
+ </style>
436
+ ```
437
+
438
+ ## API 文档
439
+ <table>
440
+ <tr>
441
+ <td rowspan="1" colSpan="1" >**State/Component**</td>
442
+
443
+ <td rowspan="1" colSpan="1" >**功能描述**</td>
444
+
445
+ <td rowspan="1" colSpan="1" >**API 文档**</td>
446
+ </tr>
447
+
448
+ <tr>
449
+ <td rowspan="1" colSpan="1" >**useDeviceState**</td>
450
+
451
+ <td rowspan="1" colSpan="1" >包含音视频设备状态,音视频设备列表及操作接口。</td>
452
+
453
+ <td rowspan="1" colSpan="1" >[API 文档](https://web.sdk.qcloud.com/trtc/live/web/doc/zh/index.html#module-DeviceState)</td>
454
+ </tr>
455
+ </table>
456
+
457
+
458
+ ## 常见问题
459
+
460
+ ### 如果用户的电脑无麦克风或扬声器设备,是否可以进入音视频房间?
461
+
462
+ 可以进入房间。 用户在缺少麦克风、扬声器或摄像头的情况下,依然可以调用 `joinRoom` 接口成功进入音视频房间。但在这种状态下,用户将面临以下交互异常。
463
+
464
+ **功能限制:**
465
+ - **无法开启媒体采集:**由于系统底层无法驱动相关硬件,调用 [openLocalMicrophone](https://web.sdk.qcloud.com/trtc/live/web/doc/zh/index.html#openLocalMicrophone) 或 [openLocalCamera](https://web.sdk.qcloud.com/trtc/live/web/doc/zh/index.html#openLocalCamera) 接口时将触发异步错误。此时,[microphoneLastError](https://web.sdk.qcloud.com/trtc/live/web/doc/zh/index.html#microphoneLastError) 或 [cameraLastError](https://web.sdk.qcloud.com/trtc/live/web/doc/zh/index.html#cameraLastError) 属性将返回 `DeviceError.NoDeviceDetected`(未检测到设备)。
466
+
467
+ - **采集端受限:**无法通过本端设备采集并传输声音(需麦克风)或影像(需摄像头)。
468
+
469
+ - **播放端受限:**由于缺少扬声器设备,用户将无法听到房间内其他参会者的音频。
470
+
471
+
472
+ **仍然可以使用的功能:**
473
+
474
+
475
+ 仅观看模式:用户依然可以观看远端参会者分享的视频流或屏幕共享画面。
476
+
477
+
478
+ ### 如何实现设备热插拔检测?
479
+
480
+ Atomicx 已经内置了设备热插拔检测功能,当媒体设备插拔时,设备列表和当前设备数据会自动更新。