@tencentcloud/sdk-mcp 1.0.4 → 1.0.6

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tencentcloud/sdk-mcp",
3
- "version": "1.0.4",
3
+ "version": "1.0.6",
4
4
  "description": "Tencent Cloud MCP Server for SDK",
5
5
  "main": "index.js",
6
6
  "bin": "index.js",
@@ -0,0 +1,303 @@
1
+ # Tutorial: 自动播放受限处理建议
2
+
3
+ ## 简介
4
+
5
+ 浏览器为了防止网页自动播放音视频对用户造成干扰,对音视频的自动播放功能做了限制:**在用户与网页产生交互(例如点击、触摸页面等)之前,网页将被禁止播放带有声音的媒体。在 iOS 10+ 中,如果开启了省电模式,[无声音的媒体也会被禁止播放](https://discussions.apple.com/thread/254541299?sortBy=best)。**
6
+
7
+ 受上述浏览器自动播放策略影响,在使用 TRTC Web SDK 时,可能会出现播放无声的问题。最常见的场景是:您的产品设计中,支持用户刷新页面后,无需用户点击,可自动进房拉流播放。
8
+
9
+ 本文主要介绍**如何解决因自动播放策略限制,导致播放失败**的问题。
10
+
11
+ ## 方案一:使用 SDK 提供的自动播放弹窗
12
+
13
+ 默认情况下,当出现自动播放失败时,SDK 会弹窗引导用户与页面产生交互。当产生交互后,SDK 会主动调用接口恢复播放。
14
+
15
+ - 优点:业务侧无需做任何处理,简单高效。
16
+ - 缺点:SDK 提供的弹窗不一定符合业务产品设计要求,此时可考虑使用方案二。
17
+
18
+ SDK 提供的弹窗适配桌面端和移动端浏览器,样式如下:
19
+
20
+ ![桌面端弹窗](./assets/autoplay-dialog-pc-cn.png)
21
+ ![移动端弹窗](./assets/autoplay-dialog-cn.png)
22
+
23
+ - SDK 会根据 [navigator.language](https://developer.mozilla.org/en-US/docs/Web/API/Navigator/language) 的值来切换中英文弹窗提示。
24
+ - 当用户点击"确认"时,SDK 自动调用相关接口来恢复播放。
25
+ - 为尽可能保证弹窗处于最上层展示,其 z-index 值为 1500。
26
+
27
+ ## 方案二:自定义处理自动播放限制
28
+
29
+ 如果您希望完全控制自动播放失败时的用户体验,可以按照以下步骤来实现:
30
+
31
+ ### 步骤 1:关闭 SDK 默认弹窗
32
+
33
+ 在调用 [TRTC.enterRoom](./TRTC.html#enterRoom) 接口时,将 `enableAutoPlayDialog` 参数设置为 `false`:
34
+
35
+ ```javascript
36
+ await trtc.enterRoom({
37
+ // ... 其他参数
38
+ enableAutoPlayDialog: false
39
+ });
40
+ ```
41
+
42
+ ### 步骤 2:监听自动播放失败事件(必做)
43
+
44
+ 监听 [AUTOPLAY_FAILED](./module-EVENT.html#.AUTOPLAY_FAILED) 事件来处理自动播放失败的情况。SDK 会自动监听用户的点击行为,在用户点击后自动恢复播放。
45
+
46
+ ```javascript
47
+ trtc.on(TRTC.EVENT.AUTOPLAY_FAILED, event => {
48
+ // 在此处添加您的自定义处理逻辑
49
+ // 例如:显示自定义提示框,引导用户点击页面
50
+ });
51
+ ```
52
+
53
+ ### 步骤 3:主动恢复播放(可选)
54
+
55
+ > 从版本 5.9.0 开始支持
56
+
57
+ 在某些特殊场景下(如在 iframe 中或使用特定前端框架时),您可能需要主动调用恢复播放方法。此时可以使用事件中提供的 `resume` 方法:
58
+
59
+ ```javascript
60
+ trtc.on(TRTC.EVENT.AUTOPLAY_FAILED, (event) => {
61
+ showCustomDialog(event);
62
+ });
63
+
64
+ function showCustomDialog(event) {
65
+ const { userId, resume } = event;
66
+ // 受限的用户 id 为 userId,resume 是恢复这个用户播放的函数
67
+ // 需要显示一个自定义按钮,提示 userId 播放受限,在按钮点击回调里调用 'resume()'
68
+ }
69
+ ```
70
+
71
+ ### 重要提示
72
+
73
+ 1. 某些浏览器可能在每次播放前都会检查用户交互状态,因此可能多次触发自动播放失败事件。
74
+
75
+ 2. 在 iOS 微信浏览器和小程序 webview 中有特殊要求:
76
+ - 首次播放远端流时,必须在用户点击事件的回调函数中直接调用播放接口
77
+ - 不能使用 setTimeout 等异步方式调用播放接口,否则会导致播放失败
78
+
79
+ ## Webview 中关闭自动播放策略限制
80
+
81
+ 在 Android 和 iOS Webview 中的默认自动播放策略可能和浏览器中的不一致,您可以参考如下文档,在您的 App 中关闭自动播放限制。
82
+
83
+ - Android Webview 关闭自动播放限制:调用 [setMediaPlaybackRequiresUserGesture(false)](https://developer.android.com/reference/android/webkit/WebSettings#setMediaPlaybackRequiresUserGesture(boolean)) 关闭自动播放限制。
84
+ - iOS Webview 关闭自动播放限制:[设置 mediaTypesRequiringUserActionForPlayback 为 WKAudiovisualMediaTypeNone](https://developer.apple.com/documentation/webkit/wkwebviewconfiguration/1851524-mediatypesrequiringuseractionfor)
85
+
86
+ # Tutorial: 应对防火墙受限
87
+
88
+ ## 功能描述
89
+
90
+ 本文主要介绍应对防火墙受限的最佳实践。例如在企业内网这类有防火墙的网络环境中,往往由于防火墙的原因,无法正常使用 TRTC Web SDK。这种情况下,有两种解决方案:
91
+
92
+ - 方案一:监听 SDK 错误,引导更换网络 或者 配置防火墙白名单。
93
+ - 方案二:使用 Nginx + coturn 代理方案。
94
+
95
+ > TRTC Web SDK 默认使用 UDP 与 TRTC 服务器进行媒体通信,并且有内置的 Turn Server,支持以 UDP or TCP 中转媒体数据。
96
+ > 正常在公网下,用户无需搭建任何代理,SDK 会按直连、Turn Server UDP、Turn Server TCP 的顺序尝试建立媒体连接。
97
+ > 若明确知道用户将在内网防火墙内使用,则可能会遇到无法建立媒体连接,此时则需要搭建代理。
98
+
99
+ ## 前提条件
100
+
101
+ - 方案二需要搭建两个服务器,Nginx + Turn Server,您可以联系贵公司的运维同学协助帮忙搭建。Nginx 代理服务器用于代理转发 TRTC Web SDK 的 Websocket 信令数据包;Turn Server 用于转发音视频数据包。
102
+
103
+ ## 实现流程
104
+
105
+ ### 方案一
106
+
107
+ > 该方案适用于:您无法确定用户的网络是否会受防火墙限制,此时可以监听 SDK 错误,引导用户更换网络 or 检查防火墙。
108
+
109
+ 当您调用 startLocalVideo, startLocalAudio, startRemoteVideo 等 API 时,SDK 内部会建立媒体连接通道,用于传输音视频数据。当遇到防火墙受限时,SDK 可能无法建立连接,此时 SDK 会抛出防火墙受限的错误,并继续进行重试。
110
+
111
+ 您可以参照如下代码示例,监听该错误,并引导用户更换网络 or 检查网络防火墙,对 TRTC Web SDK 使用到的域名和端口开白名单。参考:[TRTC Web SDK 域名和端口白名单](https://cloud.tencent.com/document/product/647/34399#webrtc-.E9.9C.80.E8.A6.81.E9.85.8D.E7.BD.AE.E5.93.AA.E4.BA.9B.E7.AB.AF.E5.8F.A3.E6.88.96.E5.9F.9F.E5.90.8D.E4.B8.BA.E7.99.BD.E5.90.8D.E5.8D.95.EF.BC.9F)。
112
+
113
+ ```javascript
114
+ trtc.on(TRTC.EVENT.ERROR, error => {
115
+ // 用户网络防火墙受限,会导致无法正常进行音视频通话。
116
+ // 此时引导用户更换网络 or 检查网络防火墙设置。
117
+ if (error.code === TRTC.ERROR_CODE.OPERATION_FAILED && error.extraCode === 5501) {
118
+ }
119
+ });
120
+ ```
121
+
122
+ ### 方案二
123
+
124
+ > 该方案适用于:您确定用户的网络是受防火墙限制的,此时需要搭建代理服务器来解决。
125
+
126
+ | 方案 | 适用场景 | 网络要求 |
127
+ |------|----------|----------|
128
+ | 2-A | 用户网络可以访问特定的外网代理服务器 | 代理服务器搭建在外网,内网防火墙需开通白名单,允许内网用户访问外网的代理服务器。 |
129
+ | 2-B | 用户网络只能访问内网代理服务器 | 代理服务器搭建在内网,内网防火墙需开通白名单,允许内网代理服务器访问外网。 |
130
+
131
+ ![2-A 方案示例图](./assets/proxy-1.png)
132
+ 2-A 方案示例图
133
+
134
+ ![2-B 方案示例图](./assets/proxy-2.png)
135
+ 2-B 方案示例图
136
+
137
+ ### 设置代理服务器
138
+
139
+ 当您搭建好 Nginx 和 Turn server 后,可以参考如下示例,设置代理服务器。
140
+
141
+ ```javascript
142
+ const trtc = TRTC.create();
143
+ await trtc.enterRoom({
144
+ ...,
145
+ proxy: {
146
+ // 设置 Websocket 代理,用于中转 SDK 与 TRTC 后台的信令数据包。
147
+ websocketProxy: 'wss://proxy.example.com/ws/',
148
+ // 设置 turn server,用于中转 SDK 与 TRTC 后台的媒体数据包。14.3.3.3:3478 为 turn server 的 ip 及端口。
149
+ turnServer: { url: '14.3.3.3:3478', username: 'turn', credential: 'turn', credentialType: 'password' },
150
+ // 默认 SDK 会直连 TRTC 服务器,如果连不上,则会尝试连 TURN server。你可以指定 'relay' 来强制连接 TURN server。
151
+ iceTransportPolicy: 'all',
152
+ // SDK 默认会向 yun.tim.qq.com 域名上报日志,但若该域名在您的内网无法访问,您需要给该域名开白名单或者配置以下日志代理。
153
+ // 设置日志上报代理,日志是排查问题的关键数据,请务必设置该代理。
154
+ loggerProxy: 'https://proxy.example.com/logger/',
155
+ }
156
+ })
157
+ ```
158
+
159
+ ### 2-A 方案
160
+
161
+ #### 搭建 Nginx 服务器
162
+
163
+ 1. **部署 Nginx 服务器**
164
+
165
+ 参考互联网中搜索到的 Nginx 服务器部署教程进行搭建部署。如果企业已有部署 Nginx 服务,可以不用部署直接进行配置。
166
+
167
+ 2. **配置 Nginx 服务器**
168
+
169
+ ```sh
170
+ vi /etc/nginx/nginx.conf
171
+ ```
172
+
173
+ ```nginx
174
+ http {
175
+ server {
176
+ # nginx 服务器的访问域名
177
+ server_name proxy.example.com;
178
+ # nginx 服务器的访问端口
179
+ listen 443;
180
+ ssl on;
181
+ location /ws/ { # 对应 setProxyServer 中的 websocketProxy 参数
182
+ proxy_pass https://signaling.rtc.qq.com/; # TRTC 的服务器
183
+ proxy_http_version 1.1;
184
+ proxy_set_header Upgrade $http_upgrade;
185
+ proxy_set_header Connection "upgrade";
186
+ }
187
+ location /logger/ { # 对应 setProxyServer 中的 loggerProxy 参数
188
+ proxy_pass https://yun.tim.qq.com/;
189
+ }
190
+ #域名对应的 SSL 证书,HTTPS 用,用户自行申请
191
+ ssl_certificate ./crt/1_proxy.trtcapi.com_bundle.crt;
192
+ ssl_certificate_key ./crt/2_proxy.trtcapi.com.key;
193
+ }
194
+ }
195
+ ```
196
+
197
+ 3. **执行重新加载 Nginx**
198
+
199
+ ```sh
200
+ sudo nginx -s reload
201
+ ```
202
+
203
+ 4. **确认公司防火墙允许访问 Nginx 服务器 IP 及端口**
204
+
205
+ #### 搭建 Turn 服务器
206
+
207
+ 您可以在互联网中搜索 turn server 搭建教程进行搭建;也可以使用如下在 `Centos 中搭建 turn server `的脚本进行搭建。
208
+
209
+ 1. **在 Linux 服务器中,创建脚本文件 `turn.sh`,脚本内容如下:**
210
+
211
+ ```sh
212
+ #!/usr/bin/env bash
213
+ # current file name is turn.sh
214
+ # ref:
215
+ # https://gabrieltanner.org/blog/turn-server STEP 3 testing turn server
216
+ # https://medium.com/av-transcode/what-is-webrtc-and-how-to-setup-stun-turn-server-for-webrtc-communication-63314728b9d0
217
+ # as super-user
218
+ # usage: current_program <external-ip>
219
+ set -x
220
+ set -e
221
+ ip a
222
+ pwd
223
+ whoami
224
+ display_usage() {
225
+ echo "This script must be run with super-user privileges."
226
+ echo -e "\nUsage: $0 <external-ip> \ne.g. $0 154.8.246.205"
227
+ }
228
+ # if less than two arguments supplied, display usage
229
+ if [ $# -lt 1 ]
230
+ then
231
+ display_usage
232
+ exit 1
233
+ fi
234
+ if [[ $1 =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
235
+ echo "get external ip $1"
236
+ else
237
+ echo "wrong external ip $1 , must not have whitespace, tab and other char"
238
+ exit 2
239
+ fi
240
+ yum install -y coturn
241
+ # $1 is <external-ip>
242
+ cat <<EOF > /etc/coturn/turnserver.conf
243
+ external-ip=$1
244
+ listening-port=3478
245
+ lt-cred-mech
246
+ max-port=65535
247
+ min-port=20000
248
+ no-dtls
249
+ no-tls
250
+ realm=tencent
251
+ user=turn:turn
252
+ verbose
253
+ EOF
254
+ ```
255
+
256
+ 2. **增加可执行权限**
257
+
258
+ ```sh
259
+ chmod +x turn.sh
260
+ ```
261
+
262
+ 3. **以 root 身份执行脚本,`sudo ./turn.sh <服务器外网IP>`, 例如:**
263
+
264
+ ```sh
265
+ sudo ./turn.sh 14.3.3.3
266
+ ```
267
+
268
+ 4. **启动 turn server**
269
+
270
+ ```sh
271
+ systemctl start coturn
272
+ # 检测 turn 是否启动成功
273
+ ps aux | grep coturn
274
+ # 若要重启服务,则执行
275
+ service coturn restart
276
+ ```
277
+
278
+ 5. **配置 turn 服务器的防火墙,打开入站端口 3478(TCP & UDP),及上述配置中 min ~ max port 之间的出站端口(UDP)。**
279
+
280
+ 6. **配置公司内网防火墙,允许访问 turn 服务器的 IP,及打开出站端口 3478(TCP & UDP)。**
281
+
282
+ 7. **测试 turn server**
283
+
284
+ 使用该[测试页面](https://webrtc.github.io/samples/src/content/peerconnection/trickle-ice/),测试搭建好的 turn server 是否能够正常连通访问。如下截图中 done 说明 turn 能正常访问。
285
+
286
+ ![turn测试结果](./assets/turn-test.png)
287
+
288
+ ### 2-B 方案
289
+
290
+ 2-B 方案搭建 Nginx 代理的方式,与 2-A 方案相同。主要有两处区别:
291
+
292
+ 1. 搭建 turn server 时,配置文件中的 external-ip 字段需填写服务器在您企业内网的地址。
293
+
294
+ ```sh
295
+ # 2-A 方案中启动脚本填的是服务器外网地址,例如外网地址为 14.3.3.3
296
+ sudo ./turn.sh 14.3.3.3
297
+ # 2-B 方案中启动脚本填的是服务器在企业内网地址,例如内网地址为 10.0.0.4
298
+ sudo ./turn.sh 10.0.0.4
299
+ ```
300
+
301
+ 2. 防火墙配置:
302
+ - 对于 Nginx 服务器,需要在公司内网防火墙配置域名白名单,允许 Nginx 服务器访问 TRTC 的相关域名,参考:[TRTC Web SDK 域名和端口白名单](https://cloud.tencent.com/document/product/647/34399#webrtc-.E9.9C.80.E8.A6.81.E9.85.8D.E7.BD.AE.E5.93.AA.E4.BA.9B.E7.AB.AF.E5.8F.A3.E6.88.96.E5.9F.9F.E5.90.8D.E4.B8.BA.E7.99.BD.E5.90.8D.E5.8D.95.EF.BC.9F)
303
+ - 对于 Turn Server,需要允许 Turn Server 能够访问外网。
File without changes