@tencentcloud/sdk-mcp 1.0.3 → 1.0.5

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 (119) hide show
  1. package/@tencent/aegis-node-sdk/lib/packages/core/src/constant/config.d.ts +14 -14
  2. package/@tencent/aegis-node-sdk/lib/packages/core/src/constant/global.d.ts +1 -1
  3. package/@tencent/aegis-node-sdk/lib/packages/core/src/constant/index.d.ts +9 -9
  4. package/@tencent/aegis-node-sdk/lib/packages/core/src/constant/report-ignore.d.ts +2 -2
  5. package/@tencent/aegis-node-sdk/lib/packages/core/src/core.d.ts +85 -85
  6. package/@tencent/aegis-node-sdk/lib/packages/core/src/hooks/afterRequestHooks.d.ts +3 -3
  7. package/@tencent/aegis-node-sdk/lib/packages/core/src/hooks/beforeRequestHooks.d.ts +9 -9
  8. package/@tencent/aegis-node-sdk/lib/packages/core/src/hooks/modifyRequestHooks.d.ts +3 -3
  9. package/@tencent/aegis-node-sdk/lib/packages/core/src/index.d.ts +9 -9
  10. package/@tencent/aegis-node-sdk/lib/packages/core/src/interface/config.d.ts +62 -62
  11. package/@tencent/aegis-node-sdk/lib/packages/core/src/interface/env.d.ts +11 -11
  12. package/@tencent/aegis-node-sdk/lib/packages/core/src/interface/index.d.ts +4 -4
  13. package/@tencent/aegis-node-sdk/lib/packages/core/src/interface/log.d.ts +130 -130
  14. package/@tencent/aegis-node-sdk/lib/packages/core/src/interface/send.d.ts +34 -34
  15. package/@tencent/aegis-node-sdk/lib/packages/core/src/pipes/format.d.ts +2 -2
  16. package/@tencent/aegis-node-sdk/lib/packages/core/src/pipes/index.d.ts +18 -18
  17. package/@tencent/aegis-node-sdk/lib/packages/core/src/pipes/length-limit.d.ts +8 -8
  18. package/@tencent/aegis-node-sdk/lib/packages/core/src/pipes/pv.d.ts +8 -8
  19. package/@tencent/aegis-node-sdk/lib/packages/core/src/pipes/remove-payload.d.ts +2 -2
  20. package/@tencent/aegis-node-sdk/lib/packages/core/src/pipes/repeat-limit.d.ts +4 -4
  21. package/@tencent/aegis-node-sdk/lib/packages/core/src/pipes/report.d.ts +10 -10
  22. package/@tencent/aegis-node-sdk/lib/packages/core/src/pipes/sample.d.ts +3 -3
  23. package/@tencent/aegis-node-sdk/lib/packages/core/src/pipes/throttle.d.ts +3 -3
  24. package/@tencent/aegis-node-sdk/lib/packages/core/src/pipes/trace/index.d.ts +34 -34
  25. package/@tencent/aegis-node-sdk/lib/packages/core/src/pipes/trace/jwt.d.ts +12 -12
  26. package/@tencent/aegis-node-sdk/lib/packages/core/src/pipes/trace/ot-js.d.ts +14 -14
  27. package/@tencent/aegis-node-sdk/lib/packages/core/src/pipes/trace/uuid.d.ts +2 -2
  28. package/@tencent/aegis-node-sdk/lib/packages/core/src/pipes/whitelist.d.ts +12 -12
  29. package/@tencent/aegis-node-sdk/lib/packages/core/src/pipes/write-before.d.ts +3 -3
  30. package/@tencent/aegis-node-sdk/lib/packages/core/src/plugin.d.ts +33 -33
  31. package/@tencent/aegis-node-sdk/lib/packages/core/src/util/destroy.d.ts +2 -2
  32. package/@tencent/aegis-node-sdk/lib/packages/core/src/util/event-emitter.d.ts +18 -18
  33. package/@tencent/aegis-node-sdk/lib/packages/core/src/util/index.d.ts +60 -60
  34. package/@tencent/aegis-node-sdk/lib/packages/node-sdk/src/index.d.ts +15 -15
  35. package/@tencent/aegis-node-sdk/lib/packages/node-sdk/src/interface/selector.d.ts +5 -5
  36. package/@tencent/aegis-node-sdk/lib/packages/node-sdk/src/pipes/batch-report-pipe.d.ts +6 -6
  37. package/@tencent/aegis-node-sdk/lib/packages/node-sdk/src/protocol/protocol_base.d.ts +18 -18
  38. package/@tencent/aegis-node-sdk/lib/packages/node-sdk/src/protocol/protocol_http.d.ts +12 -12
  39. package/@tencent/aegis-node-sdk/lib/packages/node-sdk/src/selector/ip_selector.d.ts +10 -10
  40. package/@tencent/aegis-node-sdk/lib/packages/node-sdk/src/selector/polaris_selector.d.ts +20 -20
  41. package/@tencent/aegis-node-sdk/lib/packages/node-sdk/src/selector/selector_base.d.ts +27 -27
  42. package/@tencent/aegis-node-sdk/lib/packages/node-sdk/src/util/eval_require.d.ts +2 -2
  43. package/mcp.json +9 -9
  44. package/package.json +1 -1
  45. package/resource/doc/chatuikit/android/client_api_android.md +1377 -0
  46. package/resource/doc/chatuikit/android/integrate_tuichat_only_android.md +382 -0
  47. package/resource/doc/chatuikit/android/integrate_tuikit_android.md +612 -0
  48. package/resource/doc/chatuikit/android/ui_api_android.md +418 -0
  49. package/resource/doc/chatuikit/faq/freq_qa.md +86 -0
  50. package/resource/doc/chatuikit/faq/sdk_qa.md +117 -0
  51. package/resource/doc/chatuikit/faq/vue_qa.md +344 -0
  52. package/resource/doc/chatuikit/faq/web_qa.md +118 -0
  53. package/resource/doc/chatuikit/flutter/client_api_Flutter.md +939 -0
  54. package/resource/doc/chatuikit/flutter/integrate_tuikit_Flutter.md +1432 -0
  55. package/resource/doc/chatuikit/iOS/client_api_iOS.md +1371 -0
  56. package/resource/doc/chatuikit/iOS/integrate_tuichat_only_iOS.md +993 -0
  57. package/resource/doc/chatuikit/iOS/integrate_tuikit_iOS.md +1427 -0
  58. package/resource/doc/chatuikit/iOS/ui_api_iOS.md +526 -0
  59. package/resource/doc/chatuikit/react/integrate_tuichat_only_react.md +185 -0
  60. package/resource/doc/chatuikit/react/integrate_tuichat_react.md +212 -0
  61. package/resource/doc/chatuikit/vue/integrate_tuichat_only_vue.md +149 -0
  62. package/resource/doc/chatuikit/vue/integrate_tuichat_vue.md +248 -0
  63. package/resource/doc/rtcengine/faq/web.md +303 -0
  64. package/resource/doc/rtcengine/web/.gitkeep +0 -0
  65. package/resource/doc/rtcengine/web/api_RTCEngine.md +2363 -0
  66. package/resource/doc/rtcengine/web/how_to_integrated_web_rtc_engine.md +540 -0
  67. package/resource/doc/rtcengine/web/how_to_run_web_rtc_engine_demo.md +97 -0
  68. package/server.js +81 -27
  69. package/server.js.map +1 -1
  70. package/@tencent/polaris/node_modules/axios/CHANGELOG.md +0 -891
  71. package/@tencent/polaris/node_modules/axios/LICENSE +0 -19
  72. package/@tencent/polaris/node_modules/axios/README.md +0 -908
  73. package/@tencent/polaris/node_modules/axios/SECURITY.md +0 -5
  74. package/@tencent/polaris/node_modules/axios/UPGRADE_GUIDE.md +0 -168
  75. package/@tencent/polaris/node_modules/axios/dist/axios.js +0 -2277
  76. package/@tencent/polaris/node_modules/axios/dist/axios.map +0 -1
  77. package/@tencent/polaris/node_modules/axios/dist/axios.min.js +0 -4
  78. package/@tencent/polaris/node_modules/axios/dist/axios.min.map +0 -1
  79. package/@tencent/polaris/node_modules/axios/index.d.ts +0 -221
  80. package/@tencent/polaris/node_modules/axios/index.js +0 -1
  81. package/@tencent/polaris/node_modules/axios/lib/adapters/README.md +0 -37
  82. package/@tencent/polaris/node_modules/axios/lib/adapters/http.js +0 -388
  83. package/@tencent/polaris/node_modules/axios/lib/adapters/xhr.js +0 -212
  84. package/@tencent/polaris/node_modules/axios/lib/axios.js +0 -57
  85. package/@tencent/polaris/node_modules/axios/lib/cancel/Cancel.js +0 -19
  86. package/@tencent/polaris/node_modules/axios/lib/cancel/CancelToken.js +0 -119
  87. package/@tencent/polaris/node_modules/axios/lib/cancel/isCancel.js +0 -5
  88. package/@tencent/polaris/node_modules/axios/lib/core/Axios.js +0 -155
  89. package/@tencent/polaris/node_modules/axios/lib/core/InterceptorManager.js +0 -54
  90. package/@tencent/polaris/node_modules/axios/lib/core/README.md +0 -8
  91. package/@tencent/polaris/node_modules/axios/lib/core/buildFullPath.js +0 -20
  92. package/@tencent/polaris/node_modules/axios/lib/core/createError.js +0 -18
  93. package/@tencent/polaris/node_modules/axios/lib/core/dispatchRequest.js +0 -87
  94. package/@tencent/polaris/node_modules/axios/lib/core/enhanceError.js +0 -43
  95. package/@tencent/polaris/node_modules/axios/lib/core/mergeConfig.js +0 -99
  96. package/@tencent/polaris/node_modules/axios/lib/core/settle.js +0 -25
  97. package/@tencent/polaris/node_modules/axios/lib/core/transformData.js +0 -22
  98. package/@tencent/polaris/node_modules/axios/lib/defaults.js +0 -134
  99. package/@tencent/polaris/node_modules/axios/lib/env/README.md +0 -3
  100. package/@tencent/polaris/node_modules/axios/lib/env/data.js +0 -3
  101. package/@tencent/polaris/node_modules/axios/lib/helpers/README.md +0 -7
  102. package/@tencent/polaris/node_modules/axios/lib/helpers/bind.js +0 -11
  103. package/@tencent/polaris/node_modules/axios/lib/helpers/buildURL.js +0 -70
  104. package/@tencent/polaris/node_modules/axios/lib/helpers/combineURLs.js +0 -14
  105. package/@tencent/polaris/node_modules/axios/lib/helpers/cookies.js +0 -53
  106. package/@tencent/polaris/node_modules/axios/lib/helpers/deprecatedMethod.js +0 -24
  107. package/@tencent/polaris/node_modules/axios/lib/helpers/isAbsoluteURL.js +0 -14
  108. package/@tencent/polaris/node_modules/axios/lib/helpers/isAxiosError.js +0 -13
  109. package/@tencent/polaris/node_modules/axios/lib/helpers/isURLSameOrigin.js +0 -68
  110. package/@tencent/polaris/node_modules/axios/lib/helpers/normalizeHeaderName.js +0 -12
  111. package/@tencent/polaris/node_modules/axios/lib/helpers/parseHeaders.js +0 -53
  112. package/@tencent/polaris/node_modules/axios/lib/helpers/spread.js +0 -27
  113. package/@tencent/polaris/node_modules/axios/lib/helpers/toFormData.js +0 -55
  114. package/@tencent/polaris/node_modules/axios/lib/helpers/validator.js +0 -82
  115. package/@tencent/polaris/node_modules/axios/lib/utils.js +0 -349
  116. package/@tencent/polaris/node_modules/axios/package.json +0 -86
  117. package/@tencent/polaris/node_modules/axios/tsconfig.json +0 -14
  118. package/@tencent/polaris/node_modules/axios/tslint.json +0 -6
  119. package/resource/doc/tuicallkit/vue/api_TUICallObserver.md +0 -926
@@ -0,0 +1,540 @@
1
+ # Tutorial: 开始集成音视频通话
2
+
3
+ ## 前提条件
4
+
5
+ 1. [注册腾讯云](https://cloud.tencent.com/document/product/378/17985)账号,[创建实时音视频应用](https://console.cloud.tencent.com/trtc/app)。
6
+ 2. [获取临时 userSig](https://console.cloud.tencent.com/trtc/usersigtool) ,或者部署 [userSig 签发服务](https://cloud.tencent.com/document/product/647/17275?from_cn_redirect=1#formal)。
7
+ 3. 为了体验完整的 TRTC 能力,建议开发时使用 `http://localhost` ,生产环境用 `https://[域名]` 访问页面,参考文档[页面访问协议说明](./tutorial-05-info-browser.html#h2-3)。
8
+ 4. 为了避免防火墙安全策略限制正常的 TRTC 数据传输,需要参考文档[应对防火墙策略](./tutorial-05-info-browser.html#h2-4)进行设置。
9
+ 5. 为了保证通话体验,建议在正式开始音视频通话前,进行设备检测和浏览器兼容性检测,可以参考文档[浏览器兼容信息](./tutorial-05-info-browser.html#h2-2),[通话前环境与设备检测](tutorial-23-advanced-support-detection.html)。
10
+
11
+ ## 集成 SDK
12
+
13
+ SDK 提供了 UMD、ES Module 类型的模块,以及 TypeScript Type Definition 文件,满足在不同类型项目中集成。
14
+
15
+ ### NPM 集成
16
+
17
+ 1. 您可以在项目中使用 [npm](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm) 安装 [trtc-sdk-v5](https://www.npmjs.com/package/trtc-sdk-v5)。
18
+
19
+ ```javascript
20
+ npm install trtc-sdk-v5 --save
21
+ ```
22
+
23
+ 2. 在项目脚本里导入模块。
24
+
25
+ ```javascript
26
+ import TRTC from 'trtc-sdk-v5';
27
+ ```
28
+
29
+ ### Script 集成
30
+
31
+ 1. 在您的 Web 页面中添加如下代码即可:
32
+
33
+ ```html
34
+ <script src="trtc.js"></script>
35
+ ```
36
+
37
+ **资源下载**
38
+
39
+ - [单击下载 SDK 及示例代码](https://web.sdk.qcloud.com/trtc/webrtc/v5/download/webrtc_v5_latest.zip)
40
+ - [GitHub 仓库地址](https://github.com/LiteAVSDK/TRTC_Web)
41
+
42
+ ## SDK 使用逻辑概览
43
+
44
+ **基本概念**
45
+
46
+ 您在使用 TRTC Web SDK 时,会接触到以下概念:
47
+
48
+ - [TRTC](TRTC.html) 类,其实例代表一个本地客户端。TRTC 的对象方法提供了加入通话房间、预览本地摄像头、发布本地摄像头和麦克风、播放远端音视频等功能。
49
+
50
+ **实现音视频通话基本逻辑**
51
+
52
+ 1. 调用 [TRTC.create()](TRTC.html#.create) 方法创建 [trtc](TRTC.html) 对象。
53
+ 2. 调用 [trtc.enterRoom()](TRTC.html#enterRoom) 进入房间,进入后其他用户会收到 [TRTC.EVENT.REMOTE_USER_ENTER](module-EVENT.html#.REMOTE_USER_ENTER) 进房事件。
54
+ 3. 在进入房间后,可以开启摄像头和麦克风并发布到房间。
55
+ - 调用 [TRTC.startLocalVideo()](TRTC.html#startLocalVideo) 开启摄像头并发布到房间。
56
+ - 调用 [TRTC.startLocalAudio()](TRTC.html#startLocalAudio) 开启麦克风并发布到房间。
57
+ 4. 当一个远端用户发布了音视频后,SDK 默认情况下会自动播放远端音频。您需要通过如下方式来播放远端视频:
58
+ - 在进房前监听 [TRTC.EVENT.REMOTE_VIDEO_AVAILABLE](module-EVENT.html#.REMOTE_VIDEO_AVAILABLE) 事件,就能收到所有远端用户的发布视频事件。
59
+ - 在事件回调函数中,调用 [trtc.startRemoteVideo()](TRTC.html#startRemoteVideo) 方法播放远端视频。
60
+
61
+ 下图展示了实现音视频通话全过程的基础 API 调用流程:
62
+ ![TRTC SDK调用序列图](assets/trtc-sdk-call-sequence-cn.png)
63
+
64
+ ## 创建 TRTC 对象
65
+
66
+ 通过 [TRTC.create()](TRTC.html#.create) 方法创建 [TRTC](TRTC.html) 对象
67
+
68
+ ```javascript
69
+ const trtc = TRTC.create();
70
+ ```
71
+
72
+ ## 进入房间
73
+
74
+ 调用 [trtc.enterRoom()](TRTC.html#enterRoom) 进入房间。通常在`开始通话`按钮的点击回调里进行调用。
75
+ 关键参数:
76
+
77
+ - `scene`: 实时音视频通话模式,设置为 'rtc'。
78
+ - `sdkAppId`: 您在腾讯云创建的音视频应用的 sdkAppId。
79
+ - `userId`: 用户 ID,由您指定。
80
+ - `userSig`: 用户签名,参考[获取临时 userSig](https://console.cloud.tencent.com/trtc/usersigtool),或者部署 [userSig 签发服务](https://cloud.tencent.com/document/product/647/17275?from_cn_redirect=1#formal)。
81
+ - `roomId`:房间 ID,由您指定,通常是生成唯一的房间ID。
82
+ 更详细的参数说明参考接口文档 [trtc.enterRoom()](TRTC.html#enterRoom)。
83
+
84
+ ```javascript
85
+ try {
86
+ await trtc.enterRoom({ roomId: 8888, scene:'rtc', sdkAppId, userId, userSig });
87
+ console.log('进房成功');
88
+ } catch (error) {
89
+ console.error('进房失败 ' + error);
90
+ }
91
+ ```
92
+
93
+ ## 开启摄像头、麦克风
94
+
95
+ ### 开启摄像头
96
+
97
+ 使用 [trtc.startLocalVideo()](TRTC.html#startLocalVideo) 方法开启摄像头,并发布到房间。
98
+
99
+ ```javascript
100
+ // 为了预览摄像头画面,您需在 DOM 中放置一个 HTMLElement,可以是一个 div 标签,假设其 id 为 local-video。
101
+ const view = 'local-video';
102
+ await trtc.startLocalVideo({ view });
103
+ ```
104
+
105
+ ### 开启麦克风
106
+
107
+ 使用 [trtc.startLocalAudio()](TRTC.html#startLocalAudio) 方法开启麦克风,并发布到房间。
108
+
109
+ ```javascript
110
+ await trtc.startLocalAudio();
111
+ ```
112
+
113
+ ## 播放远端音视频
114
+
115
+ ### 播放远端音频
116
+
117
+ 默认情况下,SDK 会自动播放远端音频,您无需调用 API 来播放远端音频。
118
+
119
+ - 需要注意的是:如果用户在进房前没有与页面产生过交互,自动播放音频可能会因为【浏览器的自动播放策略限制】而失败,您需参考[自动播放受限处理建议](./tutorial-21-advanced-auto-play-policy.html)进行处理。
120
+ - 若您不希望 SDK 自动播放音频,您可以在 [trtc.enterRoom()](TRTC.html#enterRoom) 时设置 autoReceiveAudio = false 关闭自动拉流及自动播放音频。
121
+ - 监听 [TRTC.EVENT.REMOTE_AUDIO_AVAILABLE](module-EVENT.html#.REMOTE_AUDIO_AVAILABLE) 事件,记录有远端音频的 userId,在需要播放音频时,调用 [trtc.muteRemoteAudio(userId, false)](TRTC.html#muteRemoteAudio) 方法。
122
+
123
+ ### 播放远端视频
124
+
125
+ 在进房前监听 [TRTC.EVENT.REMOTE_VIDEO_AVAILABLE](module-EVENT.html#.REMOTE_VIDEO_AVAILABLE) 事件,在收到该事件时,通过 [trtc.startRemoteVideo()](TRTC.html#startRemoteVideo) 播放远端视频流。
126
+
127
+ ```javascript
128
+ trtc.on(TRTC.EVENT.REMOTE_VIDEO_AVAILABLE, ({ userId, streamType }) => {
129
+ // 为了播放视频画面,您需在 DOM 中放置一个 HTMLElement,可以是一个 div 标签,假设其 id 为 `${userId}_${streamType}`
130
+ const view = `${userId}_${streamType}`;
131
+ trtc.startRemoteVideo({ userId, streamType, view });
132
+ });
133
+ ```
134
+
135
+ ## 退出房间
136
+
137
+ 调用 [trtc.exitRoom()](TRTC.html#exitRoom) 方法退出房间,结束音视频通话。
138
+
139
+ ```javascript
140
+ await trtc.exitRoom();
141
+ // 退房成功后,若后续无需使用 trtc 实例,则可以调用 trtc.destroy 方法销毁实例,及时释放相关资源。销毁后的 trtc 实例无法继续使用,需要重新创建新的实例。
142
+ trtc.destroy();
143
+ ```
144
+
145
+ **处理被踢**
146
+
147
+ 除了用户主动退出房间之外,用户也有可能因为如下原因被踢出房间,此时 SDK 会抛出 [KICKED_OUT](module-EVENT.html#.KICKED_OUT) 事件,这时不需要调用 `trtc.exitRoom()` 退房,SDK 自动进入退房状态。
148
+
149
+ 1. `kick`:两个相同 userId 的用户进入相同房间,前一个进房的用户会被踢出。同名用户同时进入同一房间是不允许的行为,可能会导致双方音视频通话异常,应避免出现这种情况。
150
+ 2. `banned`:通过服务端的 [RemoveUser](https://cloud.tencent.com/document/api/647/40496) | [RemoveUserByStrRoomId](https://cloud.tencent.com/document/api/647/50426) 接口将某个用户踢出某个 TRTC 房间,该用户会收到被踢事件,reason 为 `banned` 。
151
+ 3. `room_disband`:通过服务端的 [DismissRoom](https://cloud.tencent.com/document/api/647/50089) | [DismissRoomByStrRoomId](https://cloud.tencent.com/document/api/647/37088)接口将某个 TRTC 房间解散,解散房间之后,该房间的所有用户都会收到被踢事件,reason 为 `room_disband`。
152
+
153
+ ```javascript
154
+ trtc.on(TRTC.EVENT.KICKED_OUT, error => {
155
+ console.error(`kicked out, reason:${error.reason}, message:${error.message}`);
156
+ // error.reason 有以下几种情况
157
+ // 'kick' 由于相同 userId 进相同房间,导致先进入的用户被踢。
158
+ // 'banned' 被管理员移出房间
159
+ // 'room_disband' 管理员解散了房间
160
+ });
161
+ ```
162
+
163
+ # 实现互动直播连麦
164
+
165
+ ## 主播端
166
+
167
+ 主播端实现音视频通话的流程与 [TRTC.TYPE.SCENE_RTC](module-TYPE.html#.SCENE_RTC) 场景的实现流程基本一致。参考:[开始集成音视频通话](./tutorial-11-basic-video-call.html)。
168
+
169
+ 主要差异在于进房时,设置的 screne 和 role 参数不同。参考如下示例代码:
170
+
171
+ ```javascript
172
+ await trtc.enterRoom({ sdkAppId, userId, userSig, roomId, scene: TRTC.TYPE.SCENE_LIVE, role: TRTC.TYPE.ROLE_ANCHOR });
173
+ ```
174
+
175
+ ## 观众端
176
+
177
+ ### 以观众身份进房
178
+
179
+ 设置 role 参数为 TRTC.TYPE.ROLE_AUDIENCE。
180
+
181
+ ```javascript
182
+ await trtc.enterRoom({ roomId, sdkAppId, userId, userSig, scene: TRTC.TYPE.SCENE_LIVE, role: TRTC.TYPE.ROLE_AUDIENCE })
183
+ ```
184
+
185
+ ### 播放远端音频
186
+
187
+ 默认情况下,SDK 会自动播放远端音频,您无需调用 API 来播放远端音频。
188
+
189
+ - 需要注意的是:如果用户在进房前没有与页面产生过交互,自动播放音频可能会因为【浏览器的自动播放策略限制】而失败,您需参考[自动播放受限处理建议](./tutorial-21-advanced-auto-play-policy.html)进行处理。
190
+ - 若您不希望 SDK 自动播放音频,您可以在 [trtc.enterRoom()](TRTC.html#enterRoom) 时设置 autoReceiveAudio = false 关闭自动拉流及自动播放音频。
191
+ - 监听 [TRTC.EVENT.REMOTE_AUDIO_AVAILABLE](module-EVENT.html#.REMOTE_AUDIO_AVAILABLE) 事件,记录有远端音频的 userId,在需要播放音频时,调用 [trtc.muteRemoteAudio(userId, false)](TRTC.html#muteRemoteAudio) 方法。
192
+
193
+ ### 播放远端视频
194
+
195
+ 在进房前监听 [TRTC.EVENT.REMOTE_VIDEO_AVAILABLE](module-EVENT.html#.REMOTE_VIDEO_AVAILABLE) 事件,在收到该事件时,通过 [trtc.startRemoteVideo()](TRTC.html#startRemoteVideo) 播放远端视频流。
196
+
197
+ ```javascript
198
+ trtc.on(TRTC.EVENT.REMOTE_VIDEO_AVAILABLE, ({ userId, streamType }) => {
199
+ // 为了播放视频画面,您需在 DOM 中放置一个 HTMLElement,可以是一个 div 标签,假设其 id 为 `${userId}_${streamType}`
200
+ const view = `${userId}_${streamType}`;
201
+ trtc.startRemoteVideo({ userId, streamType, view });
202
+ });
203
+ ```
204
+
205
+ ### 上麦与主播连麦互动
206
+
207
+ 观众角色没有发布音视频的权限,因此观众若想与主播连麦互动,需要先使用 [switchRole](TRTC.html#switchRole) 切换成主播角色,再发布音视频流。
208
+
209
+ ```javascript
210
+ // 切换成主播上麦
211
+ await trtc.switchRole(TRTC.TYPE.ROLE_ANCHOR);
212
+ // 上麦后开启麦克风
213
+ await trtc.startLocalAudio();
214
+ // 上麦后开启摄像头
215
+ await trtc.startLocalVideo();
216
+ // 连麦结束后,调用 exitRoom 退房结束连麦。
217
+ await trtc.exitRoom();
218
+ ```
219
+
220
+ ## 切换摄像头
221
+
222
+ ```javascript
223
+ // 打开摄像头,默认是摄像头列表中第一个摄像头。
224
+ await trtc.startLocalVideo();
225
+ const cameraList = await TRTC.getCameraList();
226
+ // 切换到第二个摄像头
227
+ if (cameraList[1]) {
228
+ await trtc.updateLocalVideo({ option: { cameraId: cameraList[1].deviceId }});
229
+ }
230
+ // 移动端
231
+ // 切换前置摄像头
232
+ await trtc.updateLocalVideo({ option: { useFrontCamera: true }});
233
+ // 切换后置摄像头
234
+ await trtc.updateLocalVideo({ option: { useFrontCamera: false }});
235
+ ```
236
+
237
+ ## 切换麦克风
238
+
239
+ ```javascript
240
+ // 打开麦克风,默认麦克风列表中第一个麦克风。
241
+ await trtc.startLocalAudio();
242
+ const microphoneList = await TRTC.getMicrophoneList();
243
+ // 切换到第二个麦克风
244
+ if (microphoneList[1]) {
245
+ await trtc.updateLocalAudio({ option: { microphoneId: microphoneList[1].deviceId }});
246
+ }
247
+ ```
248
+
249
+ # Tutorial: 屏幕分享
250
+
251
+ ## 功能描述
252
+
253
+ 本文主要介绍如何在 TRTC Web SDK 实现屏幕分享功能。
254
+
255
+ ## 实现流程
256
+
257
+ 1. **【推流端】开启屏幕分享**
258
+
259
+ ```javascript
260
+ const trtcA = TRTC.create();
261
+ await trtcA.enterRoom({
262
+ scene: 'rtc',
263
+ sdkAppId: 140000000, // 填写您的 sdkAppId
264
+ userId: 'userA', // 填写您的 userId
265
+ userSig: 'userA_sig', // 填写 userId 对应的 userSig
266
+ roomId: 6969
267
+ })
268
+ await trtcA.startScreenShare();
269
+ ```
270
+
271
+ 2. **【拉流端】播放屏幕分享**
272
+
273
+ ```javascript
274
+ const trtcB = TRTC.create();
275
+ trtcB.on(TRTC.EVENT.REMOTE_VIDEO_AVAILABLE, ({ userId, streamType }) => {
276
+ // 主路视频流,一般是推摄像头的那路流
277
+ if (streamType === TRTC.TYPE.STREAM_TYPE_MAIN) {
278
+ // 1. 在页面中放置一个 id 为 `${userId}_main` 的 div 标签,用于在 div 标签内播放主路流。业务侧可自定义 div 标签的 id,此处只是举例说明。
279
+ // 2. 播放主路视频流
280
+ trtcB.startRemoteVideo({ userId, streamType, view: `${userId}_main` });
281
+ } else {
282
+ // 辅路视频流,一般是推屏幕分享的那路流。
283
+ // 1. 在页面中放置一个 id 为 `${userId}_screen` 的 div 标签,用于在 div 标签内播放屏幕分享。业务侧可自定义 div 标签的 id,此处只是举例说明。
284
+ // 2. 播放屏幕分享
285
+ trtcB.startRemoteVideo({ userId, streamType, view: `${userId}_screen` });
286
+ }
287
+ });
288
+ await trtcB.enterRoom({
289
+ scene: 'rtc',
290
+ sdkAppId: 140000000, // 填写您的 sdkAppId
291
+ userId: 'userB', // 填写您的 userId
292
+ userSig: 'userB_sig', // 填写 userId 对应的 userSig
293
+ roomId: 6969
294
+ })
295
+ ```
296
+
297
+ 3. **同时推摄像头 + 屏幕分享**
298
+
299
+ ```javascript
300
+ await trtcA.startLocalVideo();
301
+ await trtcA.startScreenShare();
302
+ ```
303
+
304
+ 4. **屏幕分享 + 系统音频**
305
+
306
+ 采集系统音频支持 Chrome M74+
307
+
308
+ - 在 Windows 和 Chrome OS 上,可以采集整个系统的音频。
309
+ - 在 Linux 和 Mac 上,只能采集某个页面的音频。
310
+ - 其它 Chrome 版本、其它系统、其它浏览器均不支持。
311
+
312
+ ```javascript
313
+ await trtcA.startScreenShare({ option: { systemAudio: true }});
314
+ ```
315
+
316
+ 在弹出的对话框中勾选`分享音频`,系统音频会与本地麦克风混音后发布,房间内其他用户会收到 TRTC.EVENT.REMOTE_AUDIO_AVALIABLE 事件
317
+
318
+ ![系统音频分享对话框](https://main.qcloudimg.com/raw/4e990a612028480c9c36419d96ea64b7.png)
319
+
320
+ 5. **停止屏幕分享**
321
+
322
+ ```javascript
323
+ // 停止屏幕分享采集及发布
324
+ await trtcA.stopScreenShare();
325
+ // 房间内的其他用户会收到 TRTC.EVENT.REMOTE_VIDEO_UNAVAILABLE 事件,streamType 是 TRTC.TYPE.STREAM_TYPE_SUB。
326
+ trtcB.on(TRTC.EVENT.REMOTE_VIDEO_UNAVAILABLE, ({ userId, streamType }) => {
327
+ if (streamType === TRTC.TYPE.STREAM_TYPE_SUB) {
328
+ }
329
+ })
330
+ ```
331
+
332
+ 另外用户还可能会通过浏览器自带的按钮停止屏幕分享,因此屏幕分享流需要监听屏幕分享停止事件,并进行相应的处理。
333
+
334
+ ![屏幕分享停止按钮](./assets/screen-sharing-stop.png)
335
+
336
+ ```javascript
337
+ // 监听屏幕分享停止事件
338
+ trtcA.on(TRTC.EVENT.SCREEN_SHARE_STOPPED, () => {
339
+ console.log('screen sharing was stopped');
340
+ });
341
+ ```
342
+
343
+ ## 在 Electron 中屏幕分享
344
+
345
+ > 建议优先使用 [TRTC Electron SDK](https://cloud.tencent.com/document/product/647/38551)
346
+
347
+ 因为 Electron 未实现浏览器支持的 WebRTC 标准的 `getDisplayMedia` 接口,所以如果网页中包含了 WebRTC 屏幕分享相关的逻辑,将无法在 Electron 中像普通浏览器一样正常使用 [TRTC Web SDK](https://cloud.tencent.com/document/product/647/17249) 进行屏幕分享。如果只想使用 [TRTC Web SDK](https://cloud.tencent.com/document/product/647/17249),请参考以下方案。
348
+
349
+ 实现屏幕分享,需要使用到 Electron 的 API:`desktopCapturer.getSources({ types: ['window', 'screen'] })`
350
+
351
+ 1. 主进程 `main.js` 监听页面加载完成后,通过 `desktopCapturer.getSources` 获取屏幕分享源列表,并将屏幕分享源列表发送给渲染进程
352
+ 2. 渲染进程监听主进程事件,从而获取屏幕分享源列表
353
+ 3. 创建屏幕分享流并通过 [TRTC Web SDK](https://cloud.tencent.com/document/product/647/17249) 进行推流
354
+ 1. 通过 `navigator.mediaDevices.getUserMedia()` 从系统 API 获取屏幕分享的 `MediaStream`
355
+ 2. 在 `TRTC.startScreenShare()` 的`option`参数中传入自定义采集的 videoTrack,推屏幕分享流
356
+
357
+ ```javascript
358
+ // 【1】main.js 主进程获取屏幕分享源列表
359
+ const { app, BrowserWindow, desktopCapturer, systemPreferences } = require('electron');
360
+ function createWindow () {
361
+ const win = new BrowserWindow({
362
+ // ...
363
+ });
364
+ win.loadFile('./src/index.html');
365
+ win.webContents.on("did-finish-load", async () => {
366
+ if (win) {
367
+ const sources = await desktopCapturer.getSources({
368
+ types: ["window", "screen"],
369
+ });
370
+ win.webContents.send("SEND_SCREEN_SHARE_SOURCES", sources);
371
+ }
372
+ });
373
+ }
374
+ // 【2】渲染进程监听主进程事件拿到屏幕分享源列表
375
+ const { ipcRenderer } = require('electron');
376
+ let shareSourceList = [];
377
+ ipcRenderer.on('SEND_SCREEN_SHARE_SOURCES', async (event, sources) => {
378
+ const selectContainer = window.document.getElementById('screen-share-select');
379
+ shareSourceList = sources;
380
+ sources.forEach(obj => {
381
+ const optionElement = document.createElement('option');
382
+ optionElement.innerText = `${obj.name}`;
383
+ selectContainer.appendChild(optionElement);
384
+ });
385
+ })
386
+ // 【3】渲染进程推屏幕分享
387
+ async function startScreenShare() {
388
+ const selectContainer = document.getElementById('screen-share-select');
389
+ const selectValue = selectContainer.options[selectContainer.selectedIndex].value;
390
+ const [ source ] = shareSourceList.filter(obj => obj.name === `${selectValue}`);
391
+ try {
392
+ const stream = await navigator.mediaDevices.getUserMedia({
393
+ audio: false,
394
+ video: {
395
+ mandatory: {
396
+ chromeMediaSource: 'desktop',
397
+ chromeMediaSourceId: source.id, // 屏幕分享源 id
398
+ minWidth: 1280,
399
+ maxWidth: 1280,
400
+ minHeight: 720,
401
+ maxHeight: 720
402
+ }
403
+ }
404
+ });
405
+ const trtc = TRTC.create();
406
+ await trtc.enterRoom({
407
+ // ...
408
+ });
409
+ await trtc.startScreenShare({
410
+ option: {
411
+ videoTrack: stream.getVideoTracks()[0],
412
+ }
413
+ })
414
+ } catch (error) {
415
+ console.error('start screen share error = ', error)
416
+ }
417
+ }
418
+ ```
419
+
420
+ ## 注意事项
421
+
422
+ 1. [什么是主流,辅流?](module-TYPE.html#.STREAM_TYPE_MAIN)
423
+ 2. SDK 默认使用 `1080p` 参数配置来采集屏幕分享,具体参考接口:[startScreenShare](TRTC.html#startScreenShare)
424
+
425
+ ## 常见问题
426
+
427
+ 1. **Safari 屏幕分享出现报错 `getDisplayMedia must be called from a user gesture handler`**
428
+
429
+ 这是因为 Safari 限制了 `getDisplayMedia` 屏幕采集的接口,必须在用户点击事件的回调函数执行的 1 秒内才可以调用。
430
+
431
+ 参考:[webkit issue](https://bugs.webkit.org/show_bug.cgi?id=198040)。
432
+
433
+ ```javascript
434
+ // good
435
+ async function onClick() {
436
+ // 建议在 onClick 执行时,先执行采集逻辑
437
+ await trtcA.startScreenShare();
438
+ await trtcA.enterRoom({
439
+ roomId: 123123,
440
+ sdkAppId: 140000000, // 填写您的 sdkAppId
441
+ userId: 'userA', // 填写您的 userId
442
+ userSig: 'userA_sig', // 填写 userId 对应的 userSig });
443
+ });
444
+ // bad
445
+ async function onClick() {
446
+ await trtcA.enterRoom({
447
+ roomId: 123123,
448
+ sdkAppId: 140000000, // 填写您的 sdkAppId
449
+ userId: 'userA', // 填写您的 userId
450
+ userSig: 'userA_sig', // 填写 userId 对应的 userSig });
451
+ })
452
+ // 进房可能耗时超过 1s,可能会采集失败
453
+ await trtcA.startScreenShare();
454
+ }
455
+ ```
456
+
457
+ 2. **macOS Monterey(12.2.1), 在 Electron 环境下使用屏幕分享需在主进程中请求设备权限**
458
+
459
+ ```javascript
460
+ async function checkAndApplyDeviceAccessPrivilege() {
461
+ const cameraPrivilege = systemPreferences.getMediaAccessStatus('camera');
462
+ console.log(
463
+ `checkAndApplyDeviceAccessPrivilege before apply cameraPrivilege: ${cameraPrivilege}`
464
+ );
465
+ if (cameraPrivilege !== 'granted') {
466
+ await systemPreferences.askForMediaAccess('camera');
467
+ }
468
+ const micPrivilege = systemPreferences.getMediaAccessStatus('microphone');
469
+ console.log(
470
+ `checkAndApplyDeviceAccessPrivilege before apply micPrivilege: ${micPrivilege}`
471
+ );
472
+ if (micPrivilege !== 'granted') {
473
+ await systemPreferences.askForMediaAccess('microphone');
474
+ }
475
+ const screenPrivilege = systemPreferences.getMediaAccessStatus('screen');
476
+ console.log(
477
+ `checkAndApplyDeviceAccessPrivilege before apply screenPrivilege: ${screenPrivilege}`
478
+ );
479
+ }
480
+ ```
481
+
482
+ 3. **Mac Chrome 在已授权屏幕录制的情况下屏幕分享失败,出现 "NotAllowedError: Permission denied by system" 或者 "NotReadableError: Could not start video source" 错误信息,[Chrome bug](https://bugs.chromium.org/p/chromium/issues/detail?id=1306876)。解决方案:打开【设置】> 点击【安全性与隐私】> 点击【隐私】> 点击【屏幕录制】> 关闭 Chrome 屏幕录制授权 > 重新打开 Chrome 屏幕录制授权 > 关闭 Chrome 浏览器 > 重新打开 Chrome 浏览器。**
483
+
484
+ 4. **[WebRTC 屏幕分享已知问题及规避方案](./tutorial-02-info-webrtc-issues.html#h2-9)**
485
+
486
+
487
+ # Tutorial: 设置本地视频属性
488
+
489
+ 本文主要介绍如何在视频通话或互动直播中设置视频属性,开发者可以根据具体业务需求调整视频画面的清晰度和流畅度,获得更好的用户体验。视频属性包括分辨率、帧率和码率。
490
+
491
+ ## 实现方式
492
+
493
+ 通过 trtc 对象的 [startLocalVideo()](TRTC.html#startLocalVideo) 或 [updateLocalVideo()](TRTC.html#updateLocalVideo) 方法设置视频属性:
494
+
495
+ - 指定一个预定义的 Profile,每个 Profile 对应着一套推荐的分辨率、帧率和码率。
496
+
497
+ ```javascript
498
+ // 启动时指定视频属性
499
+ await trtc.startLocalVideo({
500
+ option: { profile: '480p' }
501
+ });
502
+ // 通话过程中动态调整视频属性
503
+ await trtc.updateLocalVideo({
504
+ option: { profile: '360p' }
505
+ });
506
+ ```
507
+
508
+ - 指定自定义分辨率、帧率和码率
509
+
510
+ ```javascript
511
+ // 启动时指定视频属性
512
+ await trtc.startLocalVideo({
513
+ option: { profile: { width: 640, height: 480, frameRate: 15, bitrate: 900 /* kpbs */} }
514
+ });
515
+ // 通话过程中动态调整视频属性
516
+ await trtc.updateLocalVideo({
517
+ option: { profile: { width: 640, height: 360, frameRate: 15, bitrate: 800 /* kpbs */} }
518
+ });
519
+ ```
520
+
521
+ ## 视频属性 Profile 列表
522
+
523
+ | 视频 Profile | 分辨率(宽 x 高) | 帧率(fps) | 码率(kbps) | 备注 |
524
+ |-------------|-----------------|-----------|------------|------|
525
+ | 120p | 160 x 120 | 15 | 200 | |
526
+ | 120p_2 | 160 x 120 | 15 | 100 | v5.1.1+ 支持 |
527
+ | 180p | 320 x 180 | 15 | 350 | |
528
+ | 180p_2 | 320 x 180 | 15 | 150 | v5.1.1+ 支持 |
529
+ | 240p | 320 x 240 | 15 | 400 | |
530
+ | 240p_2 | 320 x 240 | 15 | 200 | v5.1.1+ 支持 |
531
+ | 360p | 640 x 360 | 15 | 800 | |
532
+ | 360p_2 | 640 x 360 | 15 | 400 | v5.1.1+ 支持 |
533
+ | 480p | 640 x 480 | 15 | 900 | |
534
+ | 480p_2 | 640 x 480 | 15 | 500 | 默认值,v5.1.1+ 支持 |
535
+ | 720p | 1280 x 720 | 15 | 1500 | |
536
+ | 1080p | 1920 x 1080 | 15 | 2000 | |
537
+ | 1440p | 2560 x 1440 | 30 | 4860 | |
538
+ | 4K | 3840 x 2160 | 30 | 9000 | |
539
+
540
+ - 由于设备和浏览器的限制,视频分辨率不一定能够完全匹配,在这种情况下,浏览器会自动调整分辨率使其接近 Profile 对应的分辨率
@@ -0,0 +1,97 @@
1
+ # Tutorial: 快速跑通 Demo
2
+
3
+ 本文主要介绍如何快速跑通腾讯云 TRTC Web demo。
4
+
5
+ ## 前提条件
6
+
7
+ 您已 [注册腾讯云](https://cloud.tencent.com/document/product/378/17985) 账号,并完成 [实名认证](https://cloud.tencent.com/document/product/378/3629)。
8
+
9
+ ## 操作步骤
10
+
11
+ ### 步骤1:创建新的应用
12
+
13
+ 登录[实时音视频控制台](https://console.cloud.tencent.com/trtc/quickstart),创建一个 TRTC 应用。
14
+
15
+ ### 步骤2:下载 SDK 和 Demo 源码
16
+
17
+ 1. 下载 Web 端 SDK 及配套的 Demo 源码。
18
+ 2. 下载完成后,单击 **“已下载,下一步”**。
19
+
20
+ ![下载 SDK 和 Demo 源码](https://qcloudimg.tencent-cloud.cn/raw/694a75aa29fa7ae11cb14f3948bbf386.png)
21
+
22
+ ### 步骤3:获取 SDKAppId 和 密钥(SDKSecretKey)
23
+
24
+ 1. 进入修改配置页,获取 `SDKAppID` 和 `密钥`。
25
+ 2. 复制粘贴 SDKAppId 和 密钥(SDKSecretKey)完成后,单击 **已复制粘贴,下一步** 即创建成功。
26
+
27
+ ![获取 SDKAppId 和 密钥](https://qcloudimg.tencent-cloud.cn/raw/1aa752664de9fa0dfaf163a8092b9b40.png)
28
+
29
+ ### 步骤4:运行 Demo
30
+
31
+ TRTC Web 目前提供以下几种基础 Demo,您可以选择您熟悉的项目框架进行运行体验:
32
+
33
+ 1. `quick-demo-js` 为 TRTC Web 快速运行 Demo (原生 Js 版本),集成了 TRTC Web SDK 的基础音视频通话、设备选择等功能,使用原生 Js 开发,可直接在浏览器中运行。快速体验可访问 [quick-demo-js 在线体验地址](https://web.sdk.qcloud.com/trtc/webrtc/v5/demo/quick-demo-js/index.html)。
34
+ 2. `quick-demo-vue2-js` 为 TRTC Web 快速运行 Demo (Vue2 版本),集成了 TRTC Web SDK 的基础音视频通话、设备选择等功能,使用 Vue2 + JavaScript 开发,需要您安装 Node 环境,按下方说明运行体验。快速体验可访问 [quick-demo-vue2-js 在线体验地址](https://web.sdk.qcloud.com/trtc/webrtc/v5/demo/quick-demo-vue2-js/index.html)。
35
+ 3. `quick-demo-vue3-ts` 为 TRTC Web 快速运行 Demo (Vue3 版本),集成了 TRTC Web SDK 的基础音视频通话、设备选择等功能,使用 Vue3 + TypeScript 开发,需要您安装 Node 环境,按下方说明运行体验。快速体验可访问 [quick-demo-vue3-ts 在线体验地址](https://web.sdk.qcloud.com/trtc/webrtc/v5/demo/quick-demo-vue3-ts/index.html)。
36
+
37
+ > **注意:**
38
+ > - 本地体验 Demo 可以直接在本地搭建静态服务(本地计算机需要接入互联网),通过 `http://localhost:端口` 访问,打开两个页面即可进行通话。
39
+ > - 部署到公网体验,需要通过 HTTPS 协议,即 `https://域名/xxx` 访问,原因可参考文档[页面访问协议限制说明](./tutorial-05-info-browser.html#h2-3)。
40
+ > - 目前桌面端 Chrome 浏览器支持 TRTC Web SDK 的相关特性比较完整,因此建议使用 Chrome 浏览器进行体验,参考文档[浏览器兼容信息](./tutorial-05-info-browser.html#h2-2)。
41
+
42
+ #### Demo 1:quick-demo-js
43
+
44
+ 1. 在下载的源码中找到并使用浏览器打开 `TRTC_Web/quick-demo-js/index.html` 文件。
45
+ 2. 在浏览器打开的页面中填写 [步骤三](#step3) 获取的 SDKAppId 和 SDKSecretKey。
46
+ ![填写 SDKAppId 和 SDKSecretKey](https://qcloudimg.tencent-cloud.cn/raw/58138291297d6bb58141b750f028ea4c.png)
47
+ 3. 功能体验
48
+ - 点击【Enter Room】按钮进入房间
49
+ - 点击【Start Local Audio/Video】按钮,可采集麦克风或摄像头
50
+ - 点击【Stop Local Audio/Video】按钮,可终止采集麦克风或摄像头
51
+ - 点击【Start Share Screen】按钮开始屏幕分享
52
+ - 点击【Stop Share Screen】按钮取消屏幕分享
53
+ 4. 加入房间后您可以通过分享邀请链接与被邀请人一起体验 TRTC Web 语音及视频互通功能。
54
+
55
+ #### Demo 2:quick-demo-vue2-js
56
+
57
+ 1. 在下载的源码中找到并进入到 `TRTC_Web/quick-demo-vue2-js/` 目录下。
58
+ ```shell
59
+ cd quick-demo-vue2-js
60
+ ```
61
+ 2. 本地运行 Demo,在终端执行以下命令,将会自动安装依赖并运行 demo
62
+ ```shell
63
+ npm start
64
+ ```
65
+ 默认浏览器会自动打开 http://localhost:8080/ 地址。
66
+ 3. 在浏览器打开的页面中填写 [步骤三](#step3) 获取的 SDKAppId 和 SDKSecretKey。
67
+ ![填写 SDKAppId 和 SDKSecretKey](https://qcloudimg.tencent-cloud.cn/raw/b7accfeba1614a6a1e43089887425406.png)
68
+ 4. 功能体验
69
+ - 点击【进入房间】按钮进入房间
70
+ - 点击【采集麦克风/摄像头】按钮,可采集麦克风或摄像头
71
+ - 点击【终止采集麦克风/摄像头】按钮,可终止采集麦克风或摄像头
72
+ - 点击【开始共享屏幕】按钮开始屏幕分享
73
+ - 点击【停止共享屏幕】按钮取消屏幕分享
74
+ 5. 加入房间后您可以通过分享邀请链接与被邀请人一起体验 TRTC Web 语音及视频互通功能。
75
+
76
+ #### Demo 3:quick-demo-vue3-ts
77
+
78
+ 1. 在下载的源码中找到并进入到 `TRTC_Web/quick-demo-vue3-ts/` 目录下。
79
+ 2. 本地运行 Demo
80
+ ```shell
81
+ npm start
82
+ ```
83
+ 默认浏览器会自动打开 http://localhost:3000/ 地址。
84
+ 3. 在浏览器打开的页面中填写 [步骤三](#step3) 获取的 SDKAppId 和 SDKSecretKey。
85
+ ![填写 SDKAppId 和 SDKSecretKey](https://qcloudimg.tencent-cloud.cn/raw/d4547af08134896170e89a49dec7a43a.png)
86
+ 4. 功能体验
87
+ - 输入 userId 和 roomId
88
+ - 点击【Enter Room】按钮进入房间
89
+ - 点击【Start Local Audio/Video】按钮,可采集麦克风或摄像头
90
+ - 点击【Stop Local Audio/Video】按钮,可终止采集麦克风或摄像头
91
+ - 点击【Start Share Screen】按钮开始屏幕分享
92
+ - 点击【Stop Share Screen】按钮取消屏幕分享
93
+ 5. 加入房间后您可以通过分享邀请链接与被邀请人一起体验 TRTC Web 语音及视频互通功能。
94
+
95
+ > **注意:**
96
+ > - 本文使用的生成 UserSig 的方案是在客户端中配置 SECRETKEY,该方法中 SECRETKEY 很容易被反编译逆向破解,一旦您的密钥泄露,攻击者就可以盗用您的腾讯云流量,因此**该方法仅适合本地跑通 Demo 和功能调试**。
97
+ > - 正确的 UserSig 签发方式是将 UserSig 的计算代码集成到您的服务端,并提供面向 App 的接口,在需要 UserSig 时由您的 App 向业务服务器发起请求获取动态 UserSig。更多详情请参见 [服务端生成 UserSig](https://cloud.tencent.com/document/product/647/17275#Server)。