trtc-cloud-js-sdk 1.0.13 → 2.0.0

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 (143) hide show
  1. package/.eslintrc.js +88 -0
  2. package/.prettierrc +5 -0
  3. package/CHANGELOG.md +58 -0
  4. package/build/jsdoc/clean-doc.js +12 -0
  5. package/build/jsdoc/fix-doc.js +141 -0
  6. package/build/jsdoc/jsdoc.json +42 -0
  7. package/build/package-bundle.js +29 -0
  8. package/build/rollup.config.dev.js +88 -0
  9. package/build/rollup.config.prod.js +93 -0
  10. package/build/rollup.js +359 -0
  11. package/build/template/npm-package/package.json +24 -0
  12. package/coverage/Chrome 103.0.5060 (Mac OS X 10.15.7)/base.css +213 -0
  13. package/coverage/Chrome 103.0.5060 (Mac OS X 10.15.7)/index.html +80 -0
  14. package/coverage/Chrome 103.0.5060 (Mac OS X 10.15.7)/prettify.css +1 -0
  15. package/coverage/Chrome 103.0.5060 (Mac OS X 10.15.7)/prettify.js +1 -0
  16. package/coverage/Chrome 103.0.5060 (Mac OS X 10.15.7)/sort-arrow-sprite.png +0 -0
  17. package/coverage/Chrome 103.0.5060 (Mac OS X 10.15.7)/sorter.js +158 -0
  18. package/examples/apiExample/.env +2 -0
  19. package/examples/apiExample/README.md +70 -0
  20. package/examples/apiExample/package-lock.json +30915 -0
  21. package/examples/apiExample/package.json +51 -0
  22. package/examples/apiExample/public/audio.js +195 -0
  23. package/examples/apiExample/public/audio.js.map +7 -0
  24. package/examples/apiExample/public/av_processing.js +1 -0
  25. package/examples/apiExample/public/basic/av_processing.wasm +0 -0
  26. package/examples/apiExample/public/basic/worker.js +10434 -0
  27. package/examples/apiExample/public/favicon.ico +0 -0
  28. package/examples/apiExample/public/index.html +47 -0
  29. package/examples/apiExample/public/logo192.png +0 -0
  30. package/examples/apiExample/public/logo512.png +0 -0
  31. package/examples/apiExample/public/manifest.json +25 -0
  32. package/examples/apiExample/public/robots.txt +3 -0
  33. package/examples/apiExample/src/App.css +37 -0
  34. package/examples/apiExample/src/App.js +25 -0
  35. package/examples/apiExample/src/api/http.js +127 -0
  36. package/examples/apiExample/src/api/nav.js +44 -0
  37. package/examples/apiExample/src/components/BasicInfoComponent.css +16 -0
  38. package/examples/apiExample/src/components/BasicInfoComponent.js +27 -0
  39. package/examples/apiExample/src/config/gen-test-user-sig.js +64 -0
  40. package/examples/apiExample/src/config/lib-generate-test-usersig.min.js +7052 -0
  41. package/examples/apiExample/src/config/nav.js +136 -0
  42. package/examples/apiExample/src/home.js +16 -0
  43. package/examples/apiExample/src/index.css +21 -0
  44. package/examples/apiExample/src/index.js +12 -0
  45. package/examples/apiExample/src/logo.svg +1 -0
  46. package/examples/apiExample/src/page/basic/screen-share/index.css +52 -0
  47. package/examples/apiExample/src/page/basic/screen-share/index.js +223 -0
  48. package/examples/apiExample/src/page/basic/setDevice/index.js +262 -0
  49. package/examples/apiExample/src/page/basic/setDevice/index.scss +93 -0
  50. package/examples/apiExample/src/page/basic/video-call/index.js +521 -0
  51. package/examples/apiExample/src/page/basic/video-call/index.scss +93 -0
  52. package/examples/apiExample/src/page/basic/video-call-init/index.js +382 -0
  53. package/examples/apiExample/src/page/basic/video-call-init/index.scss +93 -0
  54. package/examples/apiExample/src/page/basic/video-live/index.css +37 -0
  55. package/examples/apiExample/src/page/basic/video-live/index.js +188 -0
  56. package/examples/apiExample/src/page/layout.js +22 -0
  57. package/examples/apiExample/src/page/layout.scss +76 -0
  58. package/examples/apiExample/src/utils/utils.js +35 -0
  59. package/examples/jsExample/assets/css/bootstrap-material-design.css +12169 -0
  60. package/examples/jsExample/assets/css/bootstrap-material-design.min.css +8 -0
  61. package/examples/jsExample/assets/css/common.css +48 -0
  62. package/examples/jsExample/assets/icon/iconfont.js +1 -0
  63. package/examples/jsExample/assets/js/bootstrap-material-design.js +6939 -0
  64. package/examples/jsExample/assets/js/bootstrap-material-design.js.map +1 -0
  65. package/examples/jsExample/assets/js/bootstrap-material-design.min.js +1 -0
  66. package/examples/jsExample/assets/js/graph.js +695 -0
  67. package/examples/jsExample/assets/js/jquery-3.2.1.min.js +4 -0
  68. package/examples/jsExample/assets/js/jquery-3.2.1.slim.min.js +4 -0
  69. package/examples/jsExample/assets/js/lib-generate-test-usersig.min.js +2 -0
  70. package/examples/jsExample/assets/js/popper.js +2442 -0
  71. package/examples/jsExample/index.html +57 -0
  72. package/examples/jsExample/rtc/css/common.css +82 -0
  73. package/examples/jsExample/rtc/index.html +107 -0
  74. package/examples/jsExample/rtc/js/index.js +142 -0
  75. package/examples/vueDemo/LICENSE +21 -0
  76. package/examples/vueDemo/README.md +144 -0
  77. package/examples/vueDemo/README_EN.md +136 -0
  78. package/examples/vueDemo/av_processing.wasm +0 -0
  79. package/examples/vueDemo/index.html +23 -0
  80. package/examples/vueDemo/package-lock.json +1375 -0
  81. package/examples/vueDemo/package.json +36 -0
  82. package/examples/vueDemo/src/App.vue +12 -0
  83. package/examples/vueDemo/src/api/index.js +59 -0
  84. package/examples/vueDemo/src/assets/css/color-dark.css +28 -0
  85. package/examples/vueDemo/src/assets/css/icon.css +4 -0
  86. package/examples/vueDemo/src/assets/css/main.css +177 -0
  87. package/examples/vueDemo/src/assets/img/img.jpg +0 -0
  88. package/examples/vueDemo/src/assets/img/login-bg.jpg +0 -0
  89. package/examples/vueDemo/src/components/Header.vue +172 -0
  90. package/examples/vueDemo/src/components/Sidebar.vue +117 -0
  91. package/examples/vueDemo/src/components/Tags.vue +174 -0
  92. package/examples/vueDemo/src/components/tendency.vue +206 -0
  93. package/examples/vueDemo/src/components/trtc/main-menu.vue +50 -0
  94. package/examples/vueDemo/src/components/trtc/nav-bar.vue +53 -0
  95. package/examples/vueDemo/src/components/trtc/show-screen-capture.vue +118 -0
  96. package/examples/vueDemo/src/components/trtc/trtc-state-check.vue +117 -0
  97. package/examples/vueDemo/src/config/gen-test-user-sig.js +67 -0
  98. package/examples/vueDemo/src/config/lib-generate-test-usersig.min.js +7052 -0
  99. package/examples/vueDemo/src/main.js +11 -0
  100. package/examples/vueDemo/src/plugins/element.js +17 -0
  101. package/examples/vueDemo/src/router/index.js +73 -0
  102. package/examples/vueDemo/src/store/sidebar.js +17 -0
  103. package/examples/vueDemo/src/store/tags.js +48 -0
  104. package/examples/vueDemo/src/utils/i18n.js +24 -0
  105. package/examples/vueDemo/src/utils/request.js +34 -0
  106. package/examples/vueDemo/src/utils/utils.js +35 -0
  107. package/examples/vueDemo/src/views/Home.vue +46 -0
  108. package/examples/vueDemo/src/views/I18n.vue +40 -0
  109. package/examples/vueDemo/src/views/Icon.vue +229 -0
  110. package/examples/vueDemo/src/views/basic/trtc.vue +194 -0
  111. package/examples/vueDemo/src/views/feature/index.vue +259 -0
  112. package/examples/vueDemo/src/views/github/index.vue +243 -0
  113. package/examples/vueDemo/src/views/improve/live-index.vue +256 -0
  114. package/examples/vueDemo/src/views/improve/live-room-anchor.vue +689 -0
  115. package/examples/vueDemo/src/views/improve/live-room-audience.vue +383 -0
  116. package/examples/vueDemo/src/views/sdkAppId/index.vue +284 -0
  117. package/examples/vueDemo/vite.config.js +18 -0
  118. package/examples/vueDemo/worker.js +22 -0
  119. package/karma.conf.js +99 -0
  120. package/package.json +57 -7
  121. package/scripts/publish.js +86 -0
  122. package/src/Camera.ts +80 -0
  123. package/src/Mic.ts +145 -0
  124. package/src/common/IError.ts +6 -0
  125. package/src/common/ITRTCCloud.ts +68 -0
  126. package/src/common/constants.ts +116 -0
  127. package/src/common/trtc-code.ts +43 -0
  128. package/src/common/trtc-define.ts +1007 -0
  129. package/src/common/trtc-event.ts +29 -0
  130. package/src/index.ts +1672 -0
  131. package/src/utils/environment.js +297 -0
  132. package/src/utils/raf.js +131 -0
  133. package/src/utils/time.js +22 -0
  134. package/src/utils/utils.ts +71 -0
  135. package/src/utils/uuid.js +12 -0
  136. package/test/unit/env.test.js +25 -0
  137. package/test/unit/get-user-media.test.js +40 -0
  138. package/test/unit/ice-parser.test.js +23 -0
  139. package/test/unit/sdp.test.js +45 -0
  140. package/test/unit/signal.test.js +78 -0
  141. package/tsconfig.json +32 -0
  142. package/trtc-cloud-js-sdk.js +0 -1
  143. /package/{README.md → build/template/npm-package/README.md} +0 -0
@@ -0,0 +1,136 @@
1
+ import VideoCall from '../page/basic/video-call';
2
+ import SetDevice from '../page/basic/setDevice';
3
+
4
+ // import AudioCall from '../page/basic/audio-call';
5
+ import VideoLive from '../page/basic/video-live';
6
+ // import AudioLive from '../page/basic/audio-live';
7
+ import ScreenShare from '../page/basic/screen-share';
8
+ // import DeviceTest from '../page/basic/device-test';
9
+ // import VideoQuality from '../page/advanced/video-quality';
10
+ // import MediaStreamMix from '../page/advanced/media-stream-mix';
11
+ // import BigSmallStream from '../page/advanced/big-small-stream';
12
+ // import Beauty from '../page/advanced/beauty-sdk-inner';
13
+ // import ConnectOtherRoom from '../page/advanced/connect-other-room';
14
+ // import SwitchRole from '../page/advanced/switch-role';
15
+ // import CallStatistics from '../page/advanced/call-statistics';
16
+ // import VolumeControl from '../page/advanced/volume-control';
17
+ // import RenderControl from '../page/advanced/render-control';
18
+
19
+ const navList = [
20
+ {
21
+ name: '设备设置',
22
+ path: '/basic/setDevice',
23
+ pageContent: SetDevice,
24
+ },
25
+ {
26
+ name: '视频通话',
27
+ path: '/basic/video-call',
28
+ pageContent: VideoCall,
29
+ },
30
+ // {
31
+ // name: '视频互动直播',
32
+ // path: '/basic/video-live',
33
+ // pageContent: VideoLive,
34
+ // },
35
+ // {
36
+ // name: '语音互动直播',
37
+ // path: "/basic/audio-live",
38
+ // pageContent: AudioLive
39
+ // },
40
+ {
41
+ name: '屏幕分享',
42
+ path: '/basic/screen-share',
43
+ pageContent: ScreenShare,
44
+ },
45
+ ];
46
+ export default navList;
47
+
48
+ // const navConfig = {
49
+ // basic: {
50
+ // name: '基础示例',
51
+ // content: [
52
+ // {
53
+ // name: '视频通话',
54
+ // path: "basic/video-call",
55
+ // pageContent: VideoCall
56
+ // },
57
+ // {
58
+ // name: '语音通话',
59
+ // path: "basic/audio-call",
60
+ // pageContent: AudioCall
61
+ // },
62
+ // {
63
+ // name: '屏幕分享',
64
+ // path: "basic/screen-share",
65
+ // pageContent: ScreenShare
66
+ // },
67
+ // {
68
+ // name: '视频互动直播',
69
+ // path: "basic/video-live",
70
+ // pageContent: VideoLive
71
+ // },
72
+ // {
73
+ // name: '语音互动直播',
74
+ // path: "basic/audio-live",
75
+ // pageContent: AudioLive
76
+ // },
77
+ // {
78
+ // name: '设备检测',
79
+ // path: "basic/device-test",
80
+ // pageContent: DeviceTest
81
+ // }
82
+ // ]
83
+ // },
84
+ // advanced: {
85
+ // name: '高级特性',
86
+ // content: [
87
+ // {
88
+ // name: '画质设定',
89
+ // path: "advanced/video-quality",
90
+ // pageContent: VideoQuality
91
+ // },
92
+ // {
93
+ // name: '混流编码与CDN直播',
94
+ // path: "advanced/media-stream-mix",
95
+ // pageContent: MediaStreamMix
96
+ // },
97
+ // {
98
+ // name: '大小画面',
99
+ // path: "advanced/big-small-stream",
100
+ // pageContent: BigSmallStream
101
+ // },
102
+ // {
103
+ // name: '渲染控制',
104
+ // path: "advanced/render-control",
105
+ // pageContent: RenderControl
106
+ // },
107
+ // {
108
+ // name: '内置美颜',
109
+ // path: "advanced/beauty",
110
+ // pageContent: Beauty
111
+ // },
112
+ // {
113
+ // name: '跨房连麦',
114
+ // path: "advanced/connect-other-room",
115
+ // pageContent: ConnectOtherRoom
116
+ // },
117
+ // {
118
+ // name: '切换角色',
119
+ // path: "advanced/switch-role",
120
+ // pageContent: SwitchRole
121
+ // },
122
+ // {
123
+ // name: '通话统计',
124
+ // path: "advanced/call-statistics",
125
+ // pageContent: CallStatistics
126
+ // },
127
+ // {
128
+ // name: '音量控制',
129
+ // path: "advanced/volume-control",
130
+ // pageContent: VolumeControl
131
+ // }
132
+ // ]
133
+ // }
134
+ // }
135
+
136
+ // export default navConfig;
@@ -0,0 +1,16 @@
1
+ import navList from './config/nav';
2
+ import { Link } from 'react-router-dom';
3
+
4
+ export default function Home() {
5
+ return (
6
+ <div>
7
+ <div className="custom-container container">
8
+ {navList.map((obj, idx) => (
9
+ <Link to={obj.path} key={`${obj.path}-${idx}`} className="link-item">
10
+ <span>{obj.name}</span>
11
+ </Link>
12
+ ))}
13
+ </div>
14
+ </div>
15
+ );
16
+ }
@@ -0,0 +1,21 @@
1
+ body {
2
+ margin: 0;
3
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',
4
+ 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue',
5
+ sans-serif;
6
+ -webkit-font-smoothing: antialiased;
7
+ -moz-osx-font-smoothing: grayscale;
8
+ }
9
+
10
+ code {
11
+ font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New',
12
+ monospace;
13
+ }
14
+
15
+ .custom-container {
16
+ display: flex;
17
+ flex-direction: column;
18
+ }
19
+ .link-item {
20
+ margin-top: 20px;
21
+ }
@@ -0,0 +1,12 @@
1
+ import React from 'react';
2
+ import ReactDOM from 'react-dom';
3
+ import './index.css';
4
+ import App from './App';
5
+ // import { BrowserRouter } from 'react-router-dom';
6
+
7
+ ReactDOM.render(
8
+ <React.StrictMode>
9
+ <App />
10
+ </React.StrictMode>,
11
+ document.getElementById('root'),
12
+ );
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 841.9 595.3"><g fill="#61DAFB"><path d="M666.3 296.5c0-32.5-40.7-63.3-103.1-82.4 14.4-63.6 8-114.2-20.2-130.4-6.5-3.8-14.1-5.6-22.4-5.6v22.3c4.6 0 8.3.9 11.4 2.6 13.6 7.8 19.5 37.5 14.9 75.7-1.1 9.4-2.9 19.3-5.1 29.4-19.6-4.8-41-8.5-63.5-10.9-13.5-18.5-27.5-35.3-41.6-50 32.6-30.3 63.2-46.9 84-46.9V78c-27.5 0-63.5 19.6-99.9 53.6-36.4-33.8-72.4-53.2-99.9-53.2v22.3c20.7 0 51.4 16.5 84 46.6-14 14.7-28 31.4-41.3 49.9-22.6 2.4-44 6.1-63.6 11-2.3-10-4-19.7-5.2-29-4.7-38.2 1.1-67.9 14.6-75.8 3-1.8 6.9-2.6 11.5-2.6V78.5c-8.4 0-16 1.8-22.6 5.6-28.1 16.2-34.4 66.7-19.9 130.1-62.2 19.2-102.7 49.9-102.7 82.3 0 32.5 40.7 63.3 103.1 82.4-14.4 63.6-8 114.2 20.2 130.4 6.5 3.8 14.1 5.6 22.5 5.6 27.5 0 63.5-19.6 99.9-53.6 36.4 33.8 72.4 53.2 99.9 53.2 8.4 0 16-1.8 22.6-5.6 28.1-16.2 34.4-66.7 19.9-130.1 62-19.1 102.5-49.9 102.5-82.3zm-130.2-66.7c-3.7 12.9-8.3 26.2-13.5 39.5-4.1-8-8.4-16-13.1-24-4.6-8-9.5-15.8-14.4-23.4 14.2 2.1 27.9 4.7 41 7.9zm-45.8 106.5c-7.8 13.5-15.8 26.3-24.1 38.2-14.9 1.3-30 2-45.2 2-15.1 0-30.2-.7-45-1.9-8.3-11.9-16.4-24.6-24.2-38-7.6-13.1-14.5-26.4-20.8-39.8 6.2-13.4 13.2-26.8 20.7-39.9 7.8-13.5 15.8-26.3 24.1-38.2 14.9-1.3 30-2 45.2-2 15.1 0 30.2.7 45 1.9 8.3 11.9 16.4 24.6 24.2 38 7.6 13.1 14.5 26.4 20.8 39.8-6.3 13.4-13.2 26.8-20.7 39.9zm32.3-13c5.4 13.4 10 26.8 13.8 39.8-13.1 3.2-26.9 5.9-41.2 8 4.9-7.7 9.8-15.6 14.4-23.7 4.6-8 8.9-16.1 13-24.1zM421.2 430c-9.3-9.6-18.6-20.3-27.8-32 9 .4 18.2.7 27.5.7 9.4 0 18.7-.2 27.8-.7-9 11.7-18.3 22.4-27.5 32zm-74.4-58.9c-14.2-2.1-27.9-4.7-41-7.9 3.7-12.9 8.3-26.2 13.5-39.5 4.1 8 8.4 16 13.1 24 4.7 8 9.5 15.8 14.4 23.4zM420.7 163c9.3 9.6 18.6 20.3 27.8 32-9-.4-18.2-.7-27.5-.7-9.4 0-18.7.2-27.8.7 9-11.7 18.3-22.4 27.5-32zm-74 58.9c-4.9 7.7-9.8 15.6-14.4 23.7-4.6 8-8.9 16-13 24-5.4-13.4-10-26.8-13.8-39.8 13.1-3.1 26.9-5.8 41.2-7.9zm-90.5 125.2c-35.4-15.1-58.3-34.9-58.3-50.6 0-15.7 22.9-35.6 58.3-50.6 8.6-3.7 18-7 27.7-10.1 5.7 19.6 13.2 40 22.5 60.9-9.2 20.8-16.6 41.1-22.2 60.6-9.9-3.1-19.3-6.5-28-10.2zM310 490c-13.6-7.8-19.5-37.5-14.9-75.7 1.1-9.4 2.9-19.3 5.1-29.4 19.6 4.8 41 8.5 63.5 10.9 13.5 18.5 27.5 35.3 41.6 50-32.6 30.3-63.2 46.9-84 46.9-4.5-.1-8.3-1-11.3-2.7zm237.2-76.2c4.7 38.2-1.1 67.9-14.6 75.8-3 1.8-6.9 2.6-11.5 2.6-20.7 0-51.4-16.5-84-46.6 14-14.7 28-31.4 41.3-49.9 22.6-2.4 44-6.1 63.6-11 2.3 10.1 4.1 19.8 5.2 29.1zm38.5-66.7c-8.6 3.7-18 7-27.7 10.1-5.7-19.6-13.2-40-22.5-60.9 9.2-20.8 16.6-41.1 22.2-60.6 9.9 3.1 19.3 6.5 28.1 10.2 35.4 15.1 58.3 34.9 58.3 50.6-.1 15.7-23 35.6-58.4 50.6zM320.8 78.4z"/><circle cx="420.9" cy="296.5" r="45.7"/><path d="M520.5 78.1z"/></g></svg>
@@ -0,0 +1,52 @@
1
+ .video-view-preview {
2
+ /* padding: 1rem 2rem; */
3
+ display: flex;
4
+ flex-direction: column;
5
+ justify-content: center;
6
+ }
7
+
8
+ .video-wrapper {
9
+ flex: 0 0 auto;
10
+ padding: 0 0.5rem;
11
+
12
+ }
13
+
14
+ .user-desc {
15
+ margin-bottom: 1rem;
16
+ }
17
+ .user-type {
18
+ font-weight: bold;
19
+ }
20
+ .video-wrapper-container {
21
+ display: flex;
22
+ flex-wrap: wrap;
23
+ }
24
+ #localVideoWrapper,
25
+ .remoteVideoWrapper {
26
+ width: 320px;
27
+ height: 184px;
28
+ box-shadow: 2px 2px 18px 4px #c0c0c0;
29
+ background-color: lightblue;
30
+ margin-right: 20px;
31
+ border-radius: 8px;
32
+ margin-bottom: 1rem;
33
+ }
34
+
35
+ .local-statistic,
36
+ .remote-statistic {
37
+ margin-top: 1rem;
38
+ }
39
+
40
+ .config-form {
41
+ margin: 1rem 0;
42
+ }
43
+
44
+ .form-line {
45
+ padding: 0.5rem 0.25rem;
46
+ }
47
+ .external-operate-container {
48
+ display: flex;
49
+ margin-top: 12px;
50
+ justify-content: center;
51
+ }
52
+
@@ -0,0 +1,223 @@
1
+ /* eslint-disable no-unused-vars */
2
+ import React, { useState, useEffect } from 'react';
3
+ import { Button } from '@material-ui/core';
4
+ import './index.css';
5
+ import BasicInfoComponent from '../../../components/BasicInfoComponent';
6
+ import TRTCCloud, {
7
+ TRTCAppScene, TRTCParams, TRTCVideoStreamType
8
+ } from 'trtc-cloud-js-sdk';
9
+ import genTestUserSig from '../../../config/gen-test-user-sig';
10
+ import { validParams } from '../../../utils/utils';
11
+ const trtc = new TRTCCloud();
12
+ let preRemoteUserIdList = [];
13
+
14
+ export default function ScreenShare() {
15
+ const [userId, setUserId] = useState('TRTCCloud_' + parseInt(Math.random() * 100000));
16
+ const [roomId, setRoomId] = useState('91095');
17
+ const [remoteUserIdList, setRemoteUserIdList] = useState([]);
18
+ const [isMuteAllRemoteAudio, setIsMuteAllRemoteAudio] = useState(false);
19
+ let info = {};
20
+ let sdkAppId = 0 || info.sdkAppId;
21
+ let userSignature = '';
22
+ const LOG_PREFIX = '[Screen Share]';
23
+ console.log(`${LOG_PREFIX} TRTC version:`, trtc.getSDKVersion());
24
+
25
+ useEffect(() => {
26
+ try {
27
+ remoteUserIdList.forEach(async (userId) => {
28
+ const domElement = document.getElementById(userId);
29
+ await trtc.startRemoteView(userId, domElement, TRTCVideoStreamType.TRTCVideoStreamTypeBig);
30
+ });
31
+ } catch (error) {
32
+ console.error(`${LOG_PREFIX} remoteUserIdList useEffect error: ${JSON.stringify(error)}`);
33
+ }
34
+ }, [remoteUserIdList]);
35
+
36
+ function onEnterRoom(elapsed) {
37
+ console.log(`${LOG_PREFIX} onEnterRoom: elapsed: ${elapsed}`);
38
+ if (elapsed < 0) {
39
+ return;
40
+ }
41
+ }
42
+
43
+ function onExitRoom(reason) {
44
+ console.log(`${LOG_PREFIX} onExitRoom: reason: ${reason}`);
45
+ }
46
+
47
+ function onError(errCode, errMsg) {
48
+ console.log(`${LOG_PREFIX} onError: errCode: ${errCode}, errMsg: ${errMsg}`);
49
+ }
50
+
51
+ function onRemoteUserEnterRoom(userId) {
52
+ console.warn(`${LOG_PREFIX} onRemoteUserEnterRoom: userId: ${userId}`);
53
+ }
54
+
55
+ function onRemoteUserLeaveRoom(userId, reason) {
56
+ console.log(`${LOG_PREFIX} onRemoteUserLeaveRoom: userId: ${userId}, ${reason}`);
57
+ }
58
+
59
+ function onUserVideoAvailable(userId, available) {
60
+ console.warn(`${LOG_PREFIX} onUserVideoAvailable: userId: ${userId}, available: ${available}`);
61
+ if (available) {
62
+ if (preRemoteUserIdList.indexOf(userId) === -1) {
63
+ preRemoteUserIdList = [...preRemoteUserIdList, userId];
64
+ }
65
+ } else {
66
+ preRemoteUserIdList = preRemoteUserIdList.filter(str => str !== userId);
67
+ }
68
+ setRemoteUserIdList(preRemoteUserIdList);
69
+ }
70
+
71
+ function onFirstVideoFrame(userId, streamType, width, height) {
72
+ console.log(`${LOG_PREFIX} onFirstVideoFrame: userId: ${userId} streamType: ${streamType} width: ${width} height: ${height}`);
73
+ if (userId) {
74
+ // 远程用户(remote user)
75
+ } else {
76
+ // 本地用户(local user)
77
+ }
78
+ }
79
+ // 开启音量大小回调
80
+ function handleUserVoiceVolume(result) {
81
+ console.log('--- 音量 = ', result);
82
+ }
83
+ // audio available
84
+ function handleUserAudioAvailable(res, value) {
85
+ console.log('=== audio available = ', res, value);
86
+ }
87
+
88
+ const subscribeEvents = () => {
89
+ trtc.on('onError', onError);
90
+ trtc.on('onEnterRoom', onEnterRoom);
91
+ trtc.on('onExitRoom', onExitRoom);
92
+ trtc.on('onRemoteUserEnterRoom', onRemoteUserEnterRoom);
93
+ trtc.on('onRemoteUserLeaveRoom', onRemoteUserLeaveRoom);
94
+ trtc.on('onUserVideoAvailable', onUserVideoAvailable);
95
+ trtc.on('onUserAudioAvailable', handleUserAudioAvailable);
96
+ trtc.on('onFirstVideoFrame', onFirstVideoFrame);
97
+ trtc.on('onUserVoiceVolume', handleUserVoiceVolume);
98
+ };
99
+
100
+ const unsubscribeEvents = () => {
101
+ trtc.off('onError', onError);
102
+ trtc.off('onEnterRoom', onEnterRoom);
103
+ trtc.off('onExitRoom', onExitRoom);
104
+ trtc.off('onRemoteUserEnterRoom', onRemoteUserEnterRoom);
105
+ trtc.off('onRemoteUserLeaveRoom', onRemoteUserLeaveRoom);
106
+ trtc.off('onUserVideoAvailable', onUserVideoAvailable);
107
+ trtc.off('onUserAudioAvailable', handleUserAudioAvailable);
108
+ trtc.off('onFirstVideoFrame', onFirstVideoFrame);
109
+ trtc.off('onUserVoiceVolume', handleUserVoiceVolume);
110
+ };
111
+
112
+ const enterRoom = async () => {
113
+ const localVideoWrapper = document.getElementById('localVideoWrapper');
114
+ await trtc.startLocalPreview(localVideoWrapper);
115
+
116
+ const trtcParams = new TRTCParams();
117
+ trtcParams.userId = userId;
118
+ trtcParams.sdkAppId = sdkAppId;
119
+ trtcParams.userSig = userSignature;
120
+ trtcParams.roomId = +roomId;
121
+
122
+ await trtc.enterRoom(trtcParams, TRTCAppScene.TRTCAppSceneVideoCall);
123
+ await trtc.startLocalAudio();
124
+ };
125
+
126
+ function exitRoom() {
127
+ setRemoteUserIdList([]);
128
+ preRemoteUserIdList = [];
129
+ trtc.stopLocalPreview();
130
+ trtc.stopLocalAudio();
131
+ unsubscribeEvents();
132
+ trtc.exitRoom();
133
+ }
134
+
135
+ const handleInputChange = (event, type) => {
136
+ if (type === 'USERID') {
137
+ setUserId(event.target.value);
138
+ }
139
+ if (type === 'ROOMID') {
140
+ setRoomId(event.target.value);
141
+ }
142
+ };
143
+ const handleStart = () => {
144
+ info = genTestUserSig(userId);
145
+ sdkAppId = info.sdkAppId;
146
+ userSignature = info.userSig;
147
+
148
+ if (!validParams(userId, +roomId, sdkAppId, userSignature)) {
149
+ return;
150
+ }
151
+
152
+ subscribeEvents();
153
+ enterRoom();
154
+ };
155
+ const handleStop = () => {
156
+ exitRoom();
157
+ };
158
+
159
+ const startLocalAudio = async () => {
160
+ console.log('=== 打开 local 音频');
161
+ await trtc.startLocalAudio();
162
+ };
163
+ const stopLocalAudio = async () => {
164
+ console.log('=== 关闭 local 音频');
165
+ await trtc.stopLocalAudio();
166
+ };
167
+ // 静音掉远端所有用户 audio
168
+ const muteAllRemoteAudio = async () => {
169
+ trtc.muteAllRemoteAudio();
170
+ setIsMuteAllRemoteAudio(!isMuteAllRemoteAudio);
171
+ };
172
+
173
+ const startScreenCapture = async () => {
174
+ const shareUserId = `share_${userId}`;
175
+ const { userSig: shareUserSig } = genTestUserSig(shareUserId);
176
+ const shareParams = {
177
+ shareUserId,
178
+ shareUserSig,
179
+ };
180
+ await trtc.startScreenShare(shareParams);
181
+ };
182
+
183
+ return (
184
+ <div>
185
+ <BasicInfoComponent
186
+ userId={userId}
187
+ roomId={roomId}
188
+ handleInputChange={handleInputChange}
189
+ handleStart={handleStart}
190
+ handleStop={handleStop}
191
+ ></BasicInfoComponent>
192
+
193
+ {/* 额外操作 */}
194
+ <div className="external-operate-container">
195
+ <Button variant="contained" color="primary" onClick={() => startScreenCapture()}>开始屏幕分享</Button>
196
+ {/*
197
+ <Button variant="contained" color="primary" onClick={() => disableAudioVolumeEvaluation()}>关闭音量采集</Button>
198
+ <Button variant="contained" color="primary" onClick={() => startLocalAudio()}>打开音频</Button>
199
+ <Button variant="contained" color="primary" onClick={() => stopLocalAudio()}>关闭音频</Button>
200
+ <Button variant="contained" color="primary" onClick={() => muteAllRemoteAudio()}>{isMuteAllRemoteAudio ? '开启' : '关闭'}远端所有音频</Button> */}
201
+ </div>
202
+
203
+ <div className="video-view-preview">
204
+ <div className="video-wrapper local-user">
205
+ <div className="user-desc">
206
+ <span className="user-type">本地用户</span>
207
+ <span className="user-role" id="localUserRole"></span>
208
+ </div>
209
+ <div id="localVideoWrapper"></div>
210
+ </div>
211
+ <div className="video-wrapper remote-user">
212
+ <div className="user-desc">
213
+ <span className="user-type">远程用户</span>
214
+ <span className="user-role" id="remoteUserRole"></span>
215
+ </div>
216
+ <div className="video-wrapper-container">
217
+ {remoteUserIdList.map((userId, index) => <div id={userId} key={userId + "_" + index} className="remoteVideoWrapper"></div>)}
218
+ </div>
219
+ </div>
220
+ </div>
221
+ </div>
222
+ );
223
+ }