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.
- package/.eslintrc.js +88 -0
- package/.prettierrc +5 -0
- package/CHANGELOG.md +58 -0
- package/build/jsdoc/clean-doc.js +12 -0
- package/build/jsdoc/fix-doc.js +141 -0
- package/build/jsdoc/jsdoc.json +42 -0
- package/build/package-bundle.js +29 -0
- package/build/rollup.config.dev.js +88 -0
- package/build/rollup.config.prod.js +93 -0
- package/build/rollup.js +359 -0
- package/build/template/npm-package/package.json +24 -0
- package/coverage/Chrome 103.0.5060 (Mac OS X 10.15.7)/base.css +213 -0
- package/coverage/Chrome 103.0.5060 (Mac OS X 10.15.7)/index.html +80 -0
- package/coverage/Chrome 103.0.5060 (Mac OS X 10.15.7)/prettify.css +1 -0
- package/coverage/Chrome 103.0.5060 (Mac OS X 10.15.7)/prettify.js +1 -0
- package/coverage/Chrome 103.0.5060 (Mac OS X 10.15.7)/sort-arrow-sprite.png +0 -0
- package/coverage/Chrome 103.0.5060 (Mac OS X 10.15.7)/sorter.js +158 -0
- package/examples/apiExample/.env +2 -0
- package/examples/apiExample/README.md +70 -0
- package/examples/apiExample/package-lock.json +30915 -0
- package/examples/apiExample/package.json +51 -0
- package/examples/apiExample/public/audio.js +195 -0
- package/examples/apiExample/public/audio.js.map +7 -0
- package/examples/apiExample/public/av_processing.js +1 -0
- package/examples/apiExample/public/basic/av_processing.wasm +0 -0
- package/examples/apiExample/public/basic/worker.js +10434 -0
- package/examples/apiExample/public/favicon.ico +0 -0
- package/examples/apiExample/public/index.html +47 -0
- package/examples/apiExample/public/logo192.png +0 -0
- package/examples/apiExample/public/logo512.png +0 -0
- package/examples/apiExample/public/manifest.json +25 -0
- package/examples/apiExample/public/robots.txt +3 -0
- package/examples/apiExample/src/App.css +37 -0
- package/examples/apiExample/src/App.js +25 -0
- package/examples/apiExample/src/api/http.js +127 -0
- package/examples/apiExample/src/api/nav.js +44 -0
- package/examples/apiExample/src/components/BasicInfoComponent.css +16 -0
- package/examples/apiExample/src/components/BasicInfoComponent.js +27 -0
- package/examples/apiExample/src/config/gen-test-user-sig.js +64 -0
- package/examples/apiExample/src/config/lib-generate-test-usersig.min.js +7052 -0
- package/examples/apiExample/src/config/nav.js +136 -0
- package/examples/apiExample/src/home.js +16 -0
- package/examples/apiExample/src/index.css +21 -0
- package/examples/apiExample/src/index.js +12 -0
- package/examples/apiExample/src/logo.svg +1 -0
- package/examples/apiExample/src/page/basic/screen-share/index.css +52 -0
- package/examples/apiExample/src/page/basic/screen-share/index.js +223 -0
- package/examples/apiExample/src/page/basic/setDevice/index.js +262 -0
- package/examples/apiExample/src/page/basic/setDevice/index.scss +93 -0
- package/examples/apiExample/src/page/basic/video-call/index.js +521 -0
- package/examples/apiExample/src/page/basic/video-call/index.scss +93 -0
- package/examples/apiExample/src/page/basic/video-call-init/index.js +382 -0
- package/examples/apiExample/src/page/basic/video-call-init/index.scss +93 -0
- package/examples/apiExample/src/page/basic/video-live/index.css +37 -0
- package/examples/apiExample/src/page/basic/video-live/index.js +188 -0
- package/examples/apiExample/src/page/layout.js +22 -0
- package/examples/apiExample/src/page/layout.scss +76 -0
- package/examples/apiExample/src/utils/utils.js +35 -0
- package/examples/jsExample/assets/css/bootstrap-material-design.css +12169 -0
- package/examples/jsExample/assets/css/bootstrap-material-design.min.css +8 -0
- package/examples/jsExample/assets/css/common.css +48 -0
- package/examples/jsExample/assets/icon/iconfont.js +1 -0
- package/examples/jsExample/assets/js/bootstrap-material-design.js +6939 -0
- package/examples/jsExample/assets/js/bootstrap-material-design.js.map +1 -0
- package/examples/jsExample/assets/js/bootstrap-material-design.min.js +1 -0
- package/examples/jsExample/assets/js/graph.js +695 -0
- package/examples/jsExample/assets/js/jquery-3.2.1.min.js +4 -0
- package/examples/jsExample/assets/js/jquery-3.2.1.slim.min.js +4 -0
- package/examples/jsExample/assets/js/lib-generate-test-usersig.min.js +2 -0
- package/examples/jsExample/assets/js/popper.js +2442 -0
- package/examples/jsExample/index.html +57 -0
- package/examples/jsExample/rtc/css/common.css +82 -0
- package/examples/jsExample/rtc/index.html +107 -0
- package/examples/jsExample/rtc/js/index.js +142 -0
- package/examples/vueDemo/LICENSE +21 -0
- package/examples/vueDemo/README.md +144 -0
- package/examples/vueDemo/README_EN.md +136 -0
- package/examples/vueDemo/av_processing.wasm +0 -0
- package/examples/vueDemo/index.html +23 -0
- package/examples/vueDemo/package-lock.json +1375 -0
- package/examples/vueDemo/package.json +36 -0
- package/examples/vueDemo/src/App.vue +12 -0
- package/examples/vueDemo/src/api/index.js +59 -0
- package/examples/vueDemo/src/assets/css/color-dark.css +28 -0
- package/examples/vueDemo/src/assets/css/icon.css +4 -0
- package/examples/vueDemo/src/assets/css/main.css +177 -0
- package/examples/vueDemo/src/assets/img/img.jpg +0 -0
- package/examples/vueDemo/src/assets/img/login-bg.jpg +0 -0
- package/examples/vueDemo/src/components/Header.vue +172 -0
- package/examples/vueDemo/src/components/Sidebar.vue +117 -0
- package/examples/vueDemo/src/components/Tags.vue +174 -0
- package/examples/vueDemo/src/components/tendency.vue +206 -0
- package/examples/vueDemo/src/components/trtc/main-menu.vue +50 -0
- package/examples/vueDemo/src/components/trtc/nav-bar.vue +53 -0
- package/examples/vueDemo/src/components/trtc/show-screen-capture.vue +118 -0
- package/examples/vueDemo/src/components/trtc/trtc-state-check.vue +117 -0
- package/examples/vueDemo/src/config/gen-test-user-sig.js +67 -0
- package/examples/vueDemo/src/config/lib-generate-test-usersig.min.js +7052 -0
- package/examples/vueDemo/src/main.js +11 -0
- package/examples/vueDemo/src/plugins/element.js +17 -0
- package/examples/vueDemo/src/router/index.js +73 -0
- package/examples/vueDemo/src/store/sidebar.js +17 -0
- package/examples/vueDemo/src/store/tags.js +48 -0
- package/examples/vueDemo/src/utils/i18n.js +24 -0
- package/examples/vueDemo/src/utils/request.js +34 -0
- package/examples/vueDemo/src/utils/utils.js +35 -0
- package/examples/vueDemo/src/views/Home.vue +46 -0
- package/examples/vueDemo/src/views/I18n.vue +40 -0
- package/examples/vueDemo/src/views/Icon.vue +229 -0
- package/examples/vueDemo/src/views/basic/trtc.vue +194 -0
- package/examples/vueDemo/src/views/feature/index.vue +259 -0
- package/examples/vueDemo/src/views/github/index.vue +243 -0
- package/examples/vueDemo/src/views/improve/live-index.vue +256 -0
- package/examples/vueDemo/src/views/improve/live-room-anchor.vue +689 -0
- package/examples/vueDemo/src/views/improve/live-room-audience.vue +383 -0
- package/examples/vueDemo/src/views/sdkAppId/index.vue +284 -0
- package/examples/vueDemo/vite.config.js +18 -0
- package/examples/vueDemo/worker.js +22 -0
- package/karma.conf.js +99 -0
- package/package.json +57 -7
- package/scripts/publish.js +86 -0
- package/src/Camera.ts +80 -0
- package/src/Mic.ts +145 -0
- package/src/common/IError.ts +6 -0
- package/src/common/ITRTCCloud.ts +68 -0
- package/src/common/constants.ts +116 -0
- package/src/common/trtc-code.ts +43 -0
- package/src/common/trtc-define.ts +1007 -0
- package/src/common/trtc-event.ts +29 -0
- package/src/index.ts +1672 -0
- package/src/utils/environment.js +297 -0
- package/src/utils/raf.js +131 -0
- package/src/utils/time.js +22 -0
- package/src/utils/utils.ts +71 -0
- package/src/utils/uuid.js +12 -0
- package/test/unit/env.test.js +25 -0
- package/test/unit/get-user-media.test.js +40 -0
- package/test/unit/ice-parser.test.js +23 -0
- package/test/unit/sdp.test.js +45 -0
- package/test/unit/signal.test.js +78 -0
- package/tsconfig.json +32 -0
- package/trtc-cloud-js-sdk.js +0 -1
- /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
|
+
}
|