@tencentcloud/sdk-mcp 1.3.3 → 1.3.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 (108) hide show
  1. package/package.json +1 -1
  2. package/resource/doc/chatuikit/android/features/theme.md +363 -0
  3. package/resource/doc/chatuikit/android/workflow.md +0 -0
  4. package/resource/doc/chatuikit/{android/client_api_android.md → faq/android_sdk/client-api.md} +0 -1
  5. package/resource/doc/chatuikit/faq/{native_sdk/faq.md → common/product.md} +8 -0
  6. package/resource/doc/chatuikit/faq/flutter_sdk/faq.md +54 -0
  7. package/resource/doc/chatuikit/faq/web_sdk/faq.md +1 -1
  8. package/resource/doc/chatuikit/flutter/features/theme.md +379 -0
  9. package/resource/doc/chatuikit/flutter/workflow.md +816 -0
  10. package/resource/doc/chatuikit/iOS/features/theme.md +416 -0
  11. package/resource/doc/chatuikit/iOS/workflow.md +0 -0
  12. package/resource/doc/chatuikit/react/components/chat-setting.md +124 -0
  13. package/resource/doc/chatuikit/react/components/contact-list.md +1331 -0
  14. package/resource/doc/chatuikit/react/components/search.md +885 -0
  15. package/resource/doc/chatuikit/vue/components/chat-setting.md +88 -0
  16. package/resource/doc/chatuikit/vue/components/contact-list.md +679 -0
  17. package/resource/doc/chatuikit/vue/components/search.md +1384 -0
  18. package/resource/doc/livekit/live/android/workflow.md +137 -4
  19. package/resource/doc/livekit/live/flutter/live-audience-list.md +337 -0
  20. package/resource/doc/livekit/live/flutter/live-audio-effect.md +739 -0
  21. package/resource/doc/livekit/live/flutter/live-barrage.md +578 -0
  22. package/resource/doc/livekit/live/flutter/live-base-beauty.md +484 -0
  23. package/resource/doc/livekit/live/flutter/live-co-guest-interaction.md +606 -0
  24. package/resource/doc/livekit/live/flutter/live-gift.md +812 -0
  25. package/resource/doc/livekit/live/flutter/live-host-interaction.md +1113 -0
  26. package/resource/doc/livekit/live/flutter/live-integration.md +1029 -0
  27. package/resource/doc/livekit/live/flutter/live-live-list.md +861 -0
  28. package/resource/doc/livekit/live/ios/live-audience-list.md +335 -0
  29. package/resource/doc/livekit/live/ios/live-audio-effect.md +373 -0
  30. package/resource/doc/livekit/live/ios/live-barrage.md +529 -0
  31. package/resource/doc/livekit/live/ios/live-base-beauty.md +237 -0
  32. package/resource/doc/livekit/live/ios/live-co-guest-interaction.md +483 -0
  33. package/resource/doc/livekit/live/ios/live-gift.md +785 -0
  34. package/resource/doc/livekit/live/ios/live-host-interaction.md +743 -0
  35. package/resource/doc/livekit/live/ios/live-integration.md +822 -0
  36. package/resource/doc/livekit/live/ios/live-live-list.md +535 -0
  37. package/resource/doc/livekit/live/ios/workflow.md +352 -0
  38. package/resource/doc/rtcengine/faq/web/web.md +2 -2
  39. package/resource/doc/rtcengine/web/how_to_integrated_web_sdk.md +2 -2
  40. package/resource/doc/rtcengine/web/plugin/20-advanced-customized-capture-rendering.md +84 -0
  41. package/resource/doc/rtcengine/web/plugin/21-advanced-auto-play-policy.md +86 -0
  42. package/resource/doc/rtcengine/web/plugin/22-advanced-audio-mixer.md +220 -0
  43. package/resource/doc/rtcengine/web/plugin/23-advanced-support-detection.md +217 -0
  44. package/resource/doc/rtcengine/web/plugin/24-advanced-network-quality.md +137 -0
  45. package/resource/doc/rtcengine/web/plugin/25-advanced-device-change.md +97 -0
  46. package/resource/doc/rtcengine/web/plugin/26-advanced-publish-cdn-stream.md +453 -0
  47. package/resource/doc/rtcengine/web/plugin/27-advanced-small-stream.md +180 -0
  48. package/resource/doc/rtcengine/web/plugin/28-advanced-beauty.md +349 -0
  49. package/resource/doc/rtcengine/web/plugin/29-advanced-water-mark.md +149 -0
  50. package/resource/doc/rtcengine/web/plugin/30-advanced-cross-room-link.md +96 -0
  51. package/resource/doc/rtcengine/web/plugin/31-advanced-plugins-overview.md +405 -0
  52. package/resource/doc/rtcengine/web/plugin/34-advanced-proxy.md +244 -0
  53. package/resource/doc/rtcengine/web/plugin/35-advanced-ai-denoiser.md +84 -0
  54. package/resource/doc/rtcengine/web/plugin/36-advanced-virtual-background.md +202 -0
  55. package/resource/doc/rtcengine/web/plugin/37-advanced-voice-changer.md +98 -0
  56. package/resource/doc/rtcengine/web/plugin/38-advanced-basic-beauty.md +95 -0
  57. package/resource/doc/rtcengine/web/plugin/39-advanced-video-decoder.md +33 -0
  58. package/resource/doc/rtcengine/web/plugin/40-advanced-video-mixer.md +380 -0
  59. package/resource/doc/rtcengine/web/plugin/41-advanced-small-stream-auto-switcher.md +91 -0
  60. package/resource/doc/rtcengine/web/plugin/42-advanced-realtime-transcriber.md +314 -0
  61. package/resource/doc/rtcengine/web/plugin/43-advanced-face-detection.md +180 -0
  62. package/tools/chat/get-native-chat-feature-detail.js +30 -0
  63. package/tools/chat/get-native-chat-feature-detail.js.map +1 -0
  64. package/tools/chat/get-native-chat-integration.js +30 -12
  65. package/tools/chat/get-native-chat-integration.js.map +1 -1
  66. package/tools/common/get-faq.js +2 -4
  67. package/tools/common/get-faq.js.map +1 -1
  68. package/tools/definitions/get_native_chat_feature_detail_def.js +32 -0
  69. package/tools/definitions/get_native_chat_feature_detail_def.js.map +1 -0
  70. package/tools/definitions/get_native_chat_uikit_integration_def.js +18 -6
  71. package/tools/definitions/get_native_chat_uikit_integration_def.js.map +1 -1
  72. package/tools/definitions/{get_native_live_extra_features_def.js → get_native_live_uikit_extra_features_def.js} +3 -3
  73. package/tools/definitions/get_native_live_uikit_extra_features_def.js.map +1 -0
  74. package/tools/definitions/{get_native_live_interaction_def.js → get_native_live_uikit_interaction_def.js} +3 -3
  75. package/tools/definitions/get_native_live_uikit_interaction_def.js.map +1 -0
  76. package/tools/definitions/get_web_chat_uikit_component_detail_def.js +46 -7
  77. package/tools/definitions/get_web_chat_uikit_component_detail_def.js.map +1 -1
  78. package/tools/definitions/record_prompt_def.js +41 -10
  79. package/tools/definitions/record_prompt_def.js.map +1 -1
  80. package/tools/definitions/record_result_def.js +1 -1
  81. package/tools/index.js +6 -4
  82. package/tools/index.js.map +1 -1
  83. package/tools/live/{get_native_live_extra_features.js → get_native_live_uikit_extra_features.js} +4 -4
  84. package/tools/live/get_native_live_uikit_extra_features.js.map +1 -0
  85. package/tools/live/{get_native_live_interaction.js → get_native_live_uikit_interaction.js} +4 -4
  86. package/tools/live/get_native_live_uikit_interaction.js.map +1 -0
  87. package/tools/rtcengine/get-trtc-web-sdk-faq.js +1 -1
  88. package/tools/rtcengine/get-trtc-web-sdk-plugin.js +45 -0
  89. package/tools/rtcengine/get-trtc-web-sdk-plugin.js.map +1 -0
  90. package/utils/handle-component-name.js +0 -16
  91. package/utils/handle-component-name.js.map +1 -1
  92. package/utils/report-cls-client.js +1 -1
  93. package/utils/report-es-client.js +1 -1
  94. package/resource/doc/chatuikit/android/integrate_tuichat_only_android.md +0 -382
  95. package/resource/doc/chatuikit/android/ui_api_android.md +0 -418
  96. package/resource/doc/chatuikit/iOS/integrate_tuichat_only_iOS.md +0 -993
  97. package/resource/doc/chatuikit/iOS/ui_api_iOS.md +0 -526
  98. package/tools/definitions/get_native_live_extra_features_def.js.map +0 -1
  99. package/tools/definitions/get_native_live_interaction_def.js.map +0 -1
  100. package/tools/live/get_native_live_extra_features.js.map +0 -1
  101. package/tools/live/get_native_live_interaction.js.map +0 -1
  102. /package/resource/doc/chatuikit/android/{integrate_tuikit_android.md → integration.md} +0 -0
  103. /package/resource/doc/chatuikit/{flutter/client_api_Flutter.md → faq/flutter_sdk/client-api.md} +0 -0
  104. /package/resource/doc/chatuikit/{iOS/client_api_iOS.md → faq/ios_sdk/client-api.md} +0 -0
  105. /package/resource/doc/chatuikit/flutter/{integrate_tuikit_Flutter.md → integration.md} +0 -0
  106. /package/resource/doc/chatuikit/iOS/{integrate_tuikit_iOS.md → integration.md} +0 -0
  107. /package/resource/doc/chatuikit/react/components/{chatheader.md → chat-header.md} +0 -0
  108. /package/resource/doc/chatuikit/vue/components/{chatheader.md → chat-header.md} +0 -0
@@ -0,0 +1,453 @@
1
+ ## 功能描述
2
+
3
+ 本文主要描述如何使用 CDNStreaming 插件,实现云端混流、转推 CDN、回推混流到 TRTC 房间的功能。
4
+
5
+ ## 前提条件
6
+
7
+ 1. [TRTC SDK](https://www.npmjs.com/package/trtc-sdk-v5) 版本需要 >= 5.1。
8
+
9
+ 2. 开通腾讯 [云直播](https://console.cloud.tencent.com/live) 服务。应国家相关部门的要求,直播播放必须配置播放域名,具体操作请参考 [域名管理](https://console.cloud.tencent.com/live/livestat)。
10
+
11
+ 3. 在 [实时音视频控制台](https://console.cloud.tencent.com/trtc) 左侧导航栏选择【应用管理】,单击目标应用所在行的【配置】,打开【启用旁路推流】的开关。
12
+
13
+ - "全局自动旁路"模式下,TRTC 所有上行音视频流都会被自动转推到腾讯云 CDN。
14
+ - "指定流旁路"模式下,您可以通过该插件或者 [服务端 REST API](https://cloud.tencent.com/document/product/647/84721) 将指定音视频流推送到 CDN 且指定播放地址。
15
+
16
+ <div align="center">
17
+ <img src="assets/relayed-push.png" />
18
+ </div>
19
+
20
+ ## 快速开始
21
+
22
+ ### 安装与注册
23
+
24
+ ```js
25
+ import TRTC from 'trtc-sdk-v5';
26
+ import { CDNStreaming, PublishMode } from 'trtc-sdk-v5/plugins/cdn-streaming';
27
+
28
+ const trtc = TRTC.create({ plugins: [CDNStreaming] });
29
+ ```
30
+
31
+ ### 插件模式概览
32
+
33
+ 本插件提供四种推流转码模式:
34
+
35
+ | 模式 | PublishMode | 说明 |
36
+ |------|-------------|------|
37
+ | A | `PublishMainStreamToCDN` | 转推摄像头麦克风流到 CDN |
38
+ | B | `PublishSubStreamToCDN` | 转推屏幕分享流到 CDN |
39
+ | C | `PublishMixStreamToCDN` | 混合多路流并转推到 CDN |
40
+ | D | `PublishMixStreamToRoom` | 混合多路流并回推到 TRTC 房间 |
41
+
42
+ 对于每一种模式,均满足以下生命周期:
43
+
44
+ - `trtc.startPlugin('CDNStreaming', options)` - 启动插件
45
+ - `trtc.updatePlugin('CDNStreaming', options)` - 更新参数(0 或 N 次)
46
+ - `trtc.stopPlugin('CDNStreaming', options)` - 停止插件
47
+
48
+ 详细的 `options` 参数可见 [CDNStreamingOptions](./global.html#CDNStreamingOptions)。
49
+
50
+ ## 转推单流到 CDN
51
+
52
+ 将摄像头流(模式 A)或屏幕分享流(模式 B)转推到腾讯云 CDN。
53
+
54
+ ### 步骤 1:选择旁路推流方式
55
+
56
+ 在 [实时音视频控制台](https://console.cloud.tencent.com/trtc) 选择旁路推流方式:
57
+
58
+ **全局自动旁路模式:**
59
+
60
+ TRTC 房间里的摄像头流、屏幕分享流将**自动**被推流到腾讯云 CDN,播放地址格式如下:
61
+
62
+ `http://[播放域名]/live/[streamId].flv`
63
+
64
+ - `[播放域名]`:云直播中配置的播放域名,查看已有的域名请参考 [域名管理](https://console.cloud.tencent.com/live/livestat)
65
+ - 摄像头流的 `[streamId]` 默认值为 `${sdkAppId}_${roomId}_${userId}_main`
66
+ - 屏幕分享流的 `[streamId]` 默认值为 `${sdkAppId}_${roomId}_${userId}_aux`
67
+ - 当 roomId 或 userId 包含特殊字符时,streamId 使用 MD5:`${sdkAppId}_${md5(${roomId}_${userId}_main)}`
68
+
69
+ **手动旁路模式:**
70
+
71
+ 房间里的流**不会**被自动推流到腾讯云 CDN,请继续步骤 2 手动开启推流。
72
+
73
+ ### 步骤 2:开启转推
74
+
75
+ ```javascript
76
+ // 开启摄像头流转推
77
+ const options = {
78
+ target: {
79
+ publishMode: PublishMode.PublishMainStreamToCDN
80
+ }
81
+ }
82
+ try {
83
+ await trtc.startPlugin('CDNStreaming', options);
84
+ } catch (error) {
85
+ console.error('CDNStreaming start failed', error);
86
+ }
87
+ ```
88
+
89
+ 播放地址:`http://[播放域名]/live/${sdkAppId}_${roomId}_${userId}_main.flv`
90
+
91
+ ### 步骤 3:修改 StreamId(可选)
92
+
93
+ ```javascript
94
+ // 自定义播放地址
95
+ const options = {
96
+ target: {
97
+ publishMode: PublishMode.PublishMainStreamToCDN,
98
+ streamId: 'stream001'
99
+ }
100
+ }
101
+ try {
102
+ await trtc.updatePlugin('CDNStreaming', options);
103
+ } catch (error) {
104
+ console.error('CDNStreaming update failed', error);
105
+ }
106
+ ```
107
+
108
+ 新播放地址:`http://[播放域名]/live/stream001.flv`
109
+
110
+ ### 步骤 4:停止转推
111
+
112
+ ```javascript
113
+ const options = {
114
+ target: {
115
+ publishMode: PublishMode.PublishMainStreamToCDN,
116
+ }
117
+ }
118
+ try {
119
+ await trtc.stopPlugin('CDNStreaming', options);
120
+ } catch (error) {
121
+ console.error('CDNStreaming stop failed', error);
122
+ }
123
+ ```
124
+
125
+ 可通过 [流管理界面](https://console.cloud.tencent.com/live/streammanage) 查看目前的流状态。
126
+
127
+ ## 转推混流到 CDN
128
+
129
+ 将房间内多路音视频流混合为一路并转推到 CDN。
130
+
131
+ 其他端实现方式可参考 [云端混流转码](https://cloud.tencent.com/document/product/647/16827)。
132
+
133
+ ### 工作原理
134
+
135
+ 本插件会向腾讯云的转码服务器发送一条指令,将房间里的多路音视频流混合为一路。您可以通过以下参数自定义:
136
+ - `encoding`:输出流质量(分辨率、码率、帧率)
137
+ - `mix`:混流布局配置
138
+
139
+ <img src="https://qcloudimg.tencent-cloud.cn/raw/780b843f7f5f4a06dcd9ff0dc13b2621.png" style="width: 1000px">
140
+
141
+ ### 使用流程示例
142
+
143
+ 1. 调用 `startPlugin`,混流布局如图 A 所示
144
+ 2. 调用 `updatePlugin` 新增屏幕分享,混流布局如图 B 所示
145
+ 3. 不需要混流时调用 `stopPlugin`
146
+
147
+ <img src="https://qcloudimg.tencent-cloud.cn/raw/3069d75fab45d643ec940f8705d65b7b.png" style="width: 600px">
148
+
149
+ ### 配置说明
150
+
151
+ 1. 将 `target.publishMode` 设置为 `PublishMode.PublishMixStreamToCDN`
152
+
153
+ 2. 配置 `encoding` 参数设置输出质量:videoWidth、videoHeight、videoBitrate、videoFramerate、videoGOP、audioSampleRate、audioBitrate、audioChannels
154
+
155
+ 3. 配置 `mix.backgroundColor` 和 `mix.backgroundImage` 设置背景
156
+ > 背景图需要在 "[实时音视频控制台](https://console.cloud.tencent.com/trtc) > 应用管理 > 功能配置 > 素材管理" 中上传。上传成功后获取"图片ID",将其转换为字符串设置到 backgroundImage(如 "63")。
157
+
158
+ 4. 配置 `mix.audioMixUserList` 设置音频混流(为空时默认混流全部用户音频)
159
+
160
+ 5. 配置 `mix.videoLayoutList` 设置视频布局
161
+
162
+ > 坐标系说明:原点 (0, 0) 位于输出画布的**左上角**,单位为像素。locationX/locationY 是每路流的左上角位置;width/height 是布局区域大小。坐标和尺寸与 encoding.videoWidth/videoHeight 相关联——如果更改分辨率,需要相应地缩放布局参数以避免错位。
163
+ >
164
+ > 完整参数详情请参考 [CDNStreamingOptions](./global.html#CDNStreamingOptions)。
165
+
166
+ ### 开启混流
167
+
168
+ ```javascript
169
+ let options = {
170
+ target: {
171
+ publishMode: PublishMode.PublishMixStreamToCDN,
172
+ streamId: 'mix-stream',
173
+ },
174
+ encoding: {
175
+ videoWidth: 1280,
176
+ videoHeight: 720,
177
+ videoBitrate: 1500,
178
+ videoFramerate: 15,
179
+ },
180
+ mix: {
181
+ audioMixUserList: [
182
+ { userId: 'current_user_id' }
183
+ ],
184
+ videoLayoutList: [
185
+ {
186
+ fixedVideoUser: { userId: 'current_user_id' },
187
+ width: 640,
188
+ height: 480,
189
+ locationX: 0,
190
+ locationY: 0,
191
+ fixedVideoStreamType: TRTC.TYPE.STREAM_TYPE_MAIN,
192
+ zOrder: 1
193
+ },
194
+ ]
195
+ }
196
+ };
197
+ try {
198
+ await trtc.startPlugin('CDNStreaming', options);
199
+ } catch (error) {
200
+ console.error('CDNStreaming start failed', error);
201
+ }
202
+ ```
203
+
204
+ 播放地址:`http://[播放域名]/live/mix-stream.flv`
205
+
206
+ ### 更新布局
207
+
208
+ ```javascript
209
+ // 添加屏幕分享到混流
210
+ let options = {
211
+ target: {
212
+ publishMode: PublishMode.PublishMixStreamToCDN,
213
+ streamId: 'mix-stream',
214
+ },
215
+ encoding: {
216
+ videoWidth: 1280,
217
+ videoHeight: 720,
218
+ videoBitrate: 1500,
219
+ videoFramerate: 15,
220
+ },
221
+ mix: {
222
+ audioMixUserList: [
223
+ { userId: 'current_user_id' }
224
+ ],
225
+ videoLayoutList: [
226
+ {
227
+ fixedVideoUser: { userId: 'current_user_id' },
228
+ width: 640,
229
+ height: 480,
230
+ locationX: 0,
231
+ locationY: 0,
232
+ fixedVideoStreamType: TRTC.TYPE.STREAM_TYPE_MAIN,
233
+ zOrder: 1
234
+ },
235
+ {
236
+ fixedVideoUser: { userId: 'current_user_id' },
237
+ width: 640,
238
+ height: 480,
239
+ locationX: 640,
240
+ locationY: 0,
241
+ fixedVideoStreamType: TRTC.TYPE.STREAM_TYPE_SUB,
242
+ zOrder: 1
243
+ },
244
+ ]
245
+ }
246
+ }
247
+ try {
248
+ await trtc.updatePlugin('CDNStreaming', options);
249
+ } catch (error) {
250
+ console.error('CDNStreaming update failed', error);
251
+ }
252
+ ```
253
+
254
+ ### 停止混流
255
+
256
+ ```javascript
257
+ let options = {
258
+ target: {
259
+ publishMode: PublishMode.PublishMixStreamToCDN,
260
+ }
261
+ }
262
+ try {
263
+ await trtc.stopPlugin('CDNStreaming', options);
264
+ } catch (error) {
265
+ console.error('CDNStreaming stop failed', error);
266
+ }
267
+ ```
268
+
269
+ ## 推流到指定 CDN
270
+
271
+ 将流推送到任意云服务商的 CDN。
272
+
273
+ ### 步骤 1:获取 CDN 推流地址
274
+
275
+ 在任意云服务商获取 CDN 推流地址 url。
276
+
277
+ ### 步骤 2:获取 bizId 和 appId
278
+
279
+ 在 [实时音视频控制台](https://console.cloud.tencent.com/trtc)【应用管理-配置-旁路转推配置】查看:
280
+ - 默认推流域名的前 6 个数字是 `bizId`
281
+ - 应用的 SDKAppId 是 `appId`
282
+
283
+ <div align="center">
284
+ <img src="assets/stream-manager.png" style="width: 600px">
285
+ </div>
286
+
287
+ ### 步骤 3:开始推流
288
+
289
+ ```javascript
290
+ let options = {
291
+ target: {
292
+ publishMode: PublishMode.PublishMainStreamToCDN,
293
+ appId: 0, // 你的 appId
294
+ bizId: 0, // 你的 bizId
295
+ url: '' // 你的 CDN 推流地址
296
+ }
297
+ };
298
+ try {
299
+ await trtc.startPlugin('CDNStreaming', options);
300
+ } catch (error) {
301
+ console.error('CDNStreaming start customCDN failed', error);
302
+ }
303
+ ```
304
+
305
+ ### 停止推流
306
+
307
+ ```javascript
308
+ let options = {
309
+ target: {
310
+ publishMode: PublishMode.PublishMainStreamToCDN,
311
+ }
312
+ }
313
+ try {
314
+ await trtc.stopPlugin('CDNStreaming', options);
315
+ } catch (error) {
316
+ console.error('CDNStreaming stop customCDN failed ', error);
317
+ }
318
+ ```
319
+
320
+ ## 回推混流到 TRTC 房间
321
+
322
+ 将混流以机器人身份推送到指定 TRTC 房间。
323
+
324
+ > **注意:**
325
+ > - 此功能会自动在当前房间进入一个 userId 为 `mcu_robot_${roomId}_${userId}` 的拉流机器人,房间内其他 userId 要避免相同导致互踢
326
+ > - 此功能混流会有转码费用
327
+ > - audioMixUserList 为空时默认混所有人,若不需要混流可传入不存在的 userId
328
+ > - 完整参数详情请参考 [CDNStreamingOptions](./global.html#CDNStreamingOptions)
329
+
330
+ ### 开启回推
331
+
332
+ ```javascript
333
+ // 3333 房间的用户 user_123 发起该任务
334
+ // 混流将以 push_back_user_321 机器人身份发布到 4444 房间
335
+ let options = {
336
+ target: {
337
+ publishMode: PublishMode.PublishMixStreamToRoom,
338
+ robotUser: {
339
+ userId: 'push_back_user_321', // 建议动态生成
340
+ roomId: 4444,
341
+ }
342
+ },
343
+ encoding: {
344
+ videoWidth: 1280,
345
+ videoHeight: 720,
346
+ videoBitrate: 1500,
347
+ videoFramerate: 15,
348
+ },
349
+ mix: {
350
+ audioMixUserList: [
351
+ { userId: 'user_123', roomId: 3333 }
352
+ ],
353
+ videoLayoutList: [
354
+ {
355
+ fixedVideoUser: { userId: 'user_123', roomId: 3333 },
356
+ width: 640,
357
+ height: 480,
358
+ locationX: 0,
359
+ locationY: 0,
360
+ fixedVideoStreamType: TRTC.TYPE.STREAM_TYPE_MAIN,
361
+ zOrder: 1
362
+ },
363
+ {
364
+ fixedVideoUser: { userId: 'user_123', roomId: 3333 },
365
+ width: 640,
366
+ height: 480,
367
+ locationX: 640,
368
+ locationY: 0,
369
+ fixedVideoStreamType: TRTC.TYPE.STREAM_TYPE_SUB,
370
+ zOrder: 1
371
+ },
372
+ ]
373
+ }
374
+ };
375
+ try {
376
+ await trtc.startPlugin('CDNStreaming', options);
377
+ } catch (error) {
378
+ console.error('CDNStreaming start push stream to room failed', error);
379
+ }
380
+ ```
381
+
382
+ ### 更新布局
383
+
384
+ ```javascript
385
+ let options = {
386
+ target: {
387
+ publishMode: PublishMode.PublishMixStreamToRoom
388
+ },
389
+ mix: {
390
+ videoLayoutList: [
391
+ {
392
+ fixedVideoUser: { userId: 'user_123', roomId: 3333 },
393
+ width: 640,
394
+ height: 480,
395
+ locationX: 640,
396
+ locationY: 0,
397
+ fixedVideoStreamType: TRTC.TYPE.STREAM_TYPE_MAIN,
398
+ zOrder: 1
399
+ }
400
+ ]
401
+ }
402
+ };
403
+ try {
404
+ await trtc.updatePlugin('CDNStreaming', options);
405
+ } catch (error) {
406
+ console.error('CDNStreaming update push stream to room failed', error);
407
+ }
408
+ ```
409
+
410
+ ### 停止回推
411
+
412
+ ```javascript
413
+ let options = {
414
+ target: {
415
+ publishMode: PublishMode.PublishMixStreamToRoom,
416
+ }
417
+ }
418
+ try {
419
+ await trtc.stopPlugin('CDNStreaming', options);
420
+ } catch (error) {
421
+ console.error('CDNStreaming stop push stream to room failed ', error);
422
+ }
423
+ ```
424
+
425
+ ## API 说明
426
+
427
+ 对于 `startPlugin('CDNStreaming', options)` 与 `updatePlugin('CDNStreaming', options)`,参数类型可见 [CDNStreamingOptions](./global.html#CDNStreamingOptions)。
428
+
429
+ 对于 `stopPlugin('CDNStreaming', options)`,参数只需要填入 `options.target.publishMode` 字段即可。
430
+
431
+ ## 注意事项
432
+
433
+ 1. 录制混合后的音频流,请参考 [云端录制](https://cloud.tencent.com/document/product/647/50768#3158718a-df0d-4590-b3d4-a4796d4c6561)。
434
+
435
+ 2. 云端混流转码需要对输入 MCU 集群的音视频流进行解码后重新编码输出,将产生额外的服务成本,因此 TRTC 将向使用 MCU 集群进行云端混流转码的用户收取额外的增值费用。云端混流转码费用根据**转码输出的分辨率大小**和**转码时长**进行计费,转码输出的分辨率越高、转码输出的时间越长,费用越高。详情请参见 [云端混流转码计费说明](https://cloud.tencent.com/document/product/647/49446)。
436
+
437
+ 3. 音视频时长计费说明,参考 [计费说明](https://cloud.tencent.com/document/product/647/44248)。
438
+
439
+ 4. 退出房间后不会继续计费,但在重新进房时会自动继续开启,若想直接终止转推 CDN 和混流,请执行 stopPlugin 对应的 publishMode。
440
+
441
+ ## 常见问题
442
+
443
+ Q. 无法停止推流?
444
+
445
+ 请检查是否在控制台开启了"全局自动旁路",该模式下无法通过接口停止。
446
+
447
+ Q. 如何查看目前所有的流?
448
+
449
+ 可通过 [流管理界面](https://console.cloud.tencent.com/live/streammanage) 查看目前的流状态。
450
+
451
+ Q. 屏幕分享模糊?
452
+
453
+ SDK 默认使用 `1080p` 参数配置来采集屏幕分享,具体参考接口:{@link TRTC#startScreenShare startScreenShare}
@@ -0,0 +1,180 @@
1
+ ## 功能描述
2
+
3
+ 在多人视频通话场景中,随着推流用户的增加,对于拉流的用户来说,带宽流量消耗及设备性能消耗都会随之上升,如果不做优化,在中低端机型的体验会大打折扣。
4
+
5
+ 本文主要介绍多人视频场景的最佳实践,通过使用 大小流 + 只拉可视区域的视频流 功能,以降低带宽消耗及保障最佳的通话体验。
6
+
7
+ ## 开启大小流
8
+
9
+ 大小流是指在开启摄像头时,同时编码两路视频流,一路是正常分辨率的视频(称为大流),另一路是低分辨率的视频(称为小流)。在拉流端可以选择拉大流或者拉小流,以达到节省流量的目的。
10
+
11
+ 适用场景:大小流适用于多人视频通话场景,一般在多人通话场景的页面中,页面布局会有一个大画面 + n个小画面,位于大画面的视频拉大流,位于小画面内的视频拉小流。该功能会少量增加上行带宽,但可以大大节省下行带宽。
12
+
13
+ ### 实现步骤
14
+
15
+ #### 1. 推流端开启大小流
16
+
17
+ 在 [startLocalVideo](./TRTC.html#startLocalVideo) 时,填写 small 参数,可以开启小流编码。
18
+
19
+ ```js
20
+ await trtc.startLocalVideo({ option: { small: '120p' }});
21
+ ```
22
+
23
+ 自 v5.3.0+ 支持动态开关小流
24
+
25
+ ```js
26
+ await trtc.startLocalVideo();
27
+
28
+ // 动态开启小流
29
+ await trtc.updateLocalVideo({ option: { small: '120p' }});
30
+
31
+ // 动态关闭小流
32
+ await trtc.updateLocalVideo({ option: { small: false }});
33
+ ```
34
+
35
+ #### 2. 拉流端选择拉大流或小流
36
+
37
+ 在 [startRemoteVideo](./TRTC.html#startRemoteVideo) 时,填写 small 参数,可以拉小流,否则默认订阅大流。
38
+
39
+ 拉小流时,不需要提前判断远端用户是否有推小流,若远端没有推小流,则 SDK 会自动拉大流。后续若该远端用户推小流了,SDK 会自动切换到拉小流。
40
+
41
+ ```js
42
+ trtc.on(TRTC.EVENT.REMOTE_VIDEO_AVAILABLE, ({ userId, streamType }) => {
43
+ trtc.startRemoteVideo({
44
+ view: '', // 传入视频容器的 elementId 或者 element 实例对象。
45
+ userId,
46
+ streamType,
47
+ option: { small: true }
48
+ });
49
+ })
50
+ ```
51
+
52
+ 在 [updateRemoteVideo](./TRTC.html#updateRemoteVideo) 时,填写 small 参数,可以切换指定 userId 的大小流。常用于实现这样的功能:用户点击“小画面”时,切换到“大画面”播放;用户点击“大画面”时,切换到“小画面”播放。
53
+
54
+ ```js
55
+ // 用户点击“小画面”时,切换到“大画面”播放
56
+ await trtc.updateRemoteVideo({
57
+ view: '', // 传入“大画面”视频容器的 elementId 或者 element 实例对象。
58
+ userId: '', // 传入远端用户的 userId
59
+ streamType: TRTC.TYPE.STREAM_TYPE_MAIN,
60
+ option: { small: false }
61
+ })
62
+ // 用户点击“大画面”时,切换到“小画面”播放。
63
+ await trtc.updateRemoteVideo({
64
+ view: '', // 传入“小画面”视频容器的 elementId 或者 element 实例对象。
65
+ userId: '', // 传入远端用户的 userId
66
+ streamType: TRTC.TYPE.STREAM_TYPE_MAIN,
67
+ option: { small: true }})
68
+ ```
69
+
70
+ #### 3. 开启【自动切换小流】插件(可选)
71
+
72
+ 使用该插件 SDK 版本需 >= 5.11.0。
73
+
74
+ 该插件通常用在带宽受限的场景,如带宽不足,导致大流卡顿,则自动切换到小流,会降低分辨率但保证流畅度。
75
+
76
+ 默认的切换策略为:
77
+ - 当网络持续 10s 内延迟大于 200ms 或 丢包率大于 20%,并且帧率波动较大时,则切换到小流
78
+ - 当网络持续 20s 内延迟小于 100ms 且 丢包率小于 10% 时,并且帧率恢复正常时,则切回到大流
79
+ - 只允许自动切换到小流 2 次,超过 2 次后,则不再自动切换到小流
80
+
81
+ 引入并注册插件:
82
+
83
+ ```js
84
+ import SmallStreamAutoSwitcher from 'trtc-sdk-v5/plugins/small-stream-auto-switcher';
85
+ const trtc = TRTC.create({ plugins: [SmallStreamAutoSwitcher] });
86
+ ```
87
+
88
+ 插件使用:
89
+
90
+ ```js
91
+ // 启动插件
92
+ await trtc.startPlugin('SmallStreamAutoSwitcher');
93
+
94
+ // 关闭插件
95
+ await trtc.stopPlugin('SmallStreamAutoSwitcher');
96
+ ```
97
+
98
+ #### 注意事项
99
+
100
+ 1. TRTC 的视频流有主流(主路视频流)和辅流(辅路视频流)之分。主流包括了大流和小流,辅流一般用于屏幕分享。
101
+ 2. 拉流时,主流默认拉大流,通过 small 参数可以指定拉小流。支持同时拉大流 + 辅流,小流 + 辅流,不支持同时拉大流 + 小流。大流和小流在同一个视频容器内播放。
102
+ 3. 只有推流端开启了小流,拉流端将远端流切换成小流才会生效。若没有小流,则 SDK 会自动拉大流。
103
+ 4. 切换大小流成功目前没有事件通知。
104
+ 5. 设置的小流分辨率不可以比大流的分辨率还要大,否则设置无效,保持原来的小流分辨率(默认 120p)。
105
+ 6. 设置小流分辨率后,实际编码的分辨率会按照大流的长宽比例进行修改,保持和大流的长宽比例一致。
106
+
107
+ ## 开启【只拉可视区域的视频流】功能
108
+
109
+ 通常来说,多人视频场景下,由于页面空间有限,拉流端不会将所有的视频都展示在页面上。因此,对于那些不需要在页面上展示的远端视频,就可以不用拉流。只有 view 可视时,才拉视频流。以达到节省流量和降低性能开销的目的。
110
+
111
+ 而实现这个功能,并不是一件容易的事情。在 v5.4.0 版本开始,SDK 内置了该功能,您只需要在 [startRemoteVideo](./TRTC.html#startRemoteVideo) 时,设置 `receiveWhenViewVisible` 及 `viewRoot` 参数,即可开启该功能,非常方便快捷。SDK 会自动判断您在 startRemoteVideo 时传入的 view 的可视状态,当 view 可视时拉流,当 view 不视时,停止拉流。
112
+
113
+ ### 代码示例
114
+
115
+ 假设您用于播放视频的 DOM 结构如下
116
+
117
+ ```html
118
+ <div id='view-list'>
119
+ <div id='view1_main'></div>
120
+ <div id='view2_main'></div>
121
+ <div id='view3_main'></div>
122
+ </div>
123
+ ```
124
+
125
+ ```js
126
+ trtc.on(TRTC.EVENT.REMOTE_VIDEO_AVAILABLE, ({ userId, streamType }) => {
127
+ trtc.startRemoteVideo({
128
+ view: 'view1_main',
129
+ userId,
130
+ streamType,
131
+ option: {
132
+ small: true,
133
+ receiveWhenViewVisible: true, // 开启【只订阅可视区域的视频流】功能
134
+ viewRoot: document.getElementById('view-list') // 传入所有 view list 的第一级父级元素,用于计算 view 和 viewRoot 的参考关系,判断 view 是否处于可视状态。默认值是 document.body
135
+ }
136
+ });
137
+ })
138
+ ```
139
+
140
+ ### 增加 Loading 效果
141
+
142
+ 开启该功能后,在用户滚动视频列表时:
143
+
144
+ - view 从可视变为不可视时,SDK 会停止拉流。
145
+ - view 从不可视变为可视时,SDK 会恢复拉流。
146
+
147
+ 由于恢复拉流到视频播放成功,是异步的过程,在这个过程中会出现黑屏,一般为了更好的交互体验,建议您在这个异步过程中,给视频区域增加 Loading 的效果。您可以参考如下代码判断是否要展示 Loading。
148
+
149
+ ```js
150
+ let isLoading = true;
151
+
152
+ // 监听视频播放状态,根据视频播放状态来判断是否显示 Loading 效果。
153
+ trtc.on(TRTC.EVENT.VIDEO_PLAY_STATE_CHANGED, ({ userId, streamType, state }) => {
154
+ // '' 代表本地的视频播放状态,此处需要非本地视频流(远端)的播放状态。
155
+ if (userId === '') return;
156
+
157
+ // 远端视频播放成功,则停止 Loading 效果
158
+ isLoading = state !== 'PLAYING';
159
+
160
+ // 通过 userId 和 streamType 判断是哪个远端用户的主流/辅流 播放状态变更。
161
+ });
162
+ await trtc.startRemoteVideo({ ... });
163
+
164
+
165
+ // 停止远端视频后,停止远端 Loading 效果。
166
+ trtc.stopRemoteVideo()
167
+ isLoading = false;
168
+ ```
169
+
170
+ ## 常见问题
171
+
172
+ 1. SDK 如何判断 view 是否处于可视状态。
173
+
174
+ 当 view 有任意像素点出现在 viewRoot 区域时,即认为 view 是可视的;同时当 view 所有像素点都不在 viewRoot 区域时,则认为 view 是不可视的。
175
+
176
+ 2. 大小流需要考虑浏览器兼容性吗?
177
+
178
+ 虽然在部分浏览器下不支持开启大小流(例如 iOS 系统的所有浏览器、Chrome 63 以下版本),但是开启大小流是没有副作用的,如果环境不支持,SDK 只会使用大流,通话可以正常进行。您无需写额外的 if else 判断。
179
+
180
+ 您可以调用 {@link TRTC.isSupported TRTC.isSupported} 获取 checkResult.detail.isSmallStreamSupported 来判断当前环境是否支持开启大小流。