zbzt-live-sdk 0.0.2
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/.babelrc +8 -0
- package/.editorconfig +13 -0
- package/.eslintrc.js +29 -0
- package/CHANGELOG.md +16 -0
- package/README.md +32 -0
- package/dist/zbzt-live-sdk.cjs.js +51 -0
- package/dist/zbzt-live-sdk.esm.js +51 -0
- package/dist/zbzt-live-sdk.umd.js +52 -0
- package/dist/zbzt-live-sdk.umd.js.map +1 -0
- package/example/app.js +133 -0
- package/example/bootstrap-3.4.1/css/bootstrap-theme.css +587 -0
- package/example/bootstrap-3.4.1/css/bootstrap-theme.css.map +1 -0
- package/example/bootstrap-3.4.1/css/bootstrap-theme.min.css +6 -0
- package/example/bootstrap-3.4.1/css/bootstrap-theme.min.css.map +1 -0
- package/example/bootstrap-3.4.1/css/bootstrap.css +6834 -0
- package/example/bootstrap-3.4.1/css/bootstrap.css.map +1 -0
- package/example/bootstrap-3.4.1/css/bootstrap.min.css +6 -0
- package/example/bootstrap-3.4.1/css/bootstrap.min.css.map +1 -0
- package/example/bootstrap-3.4.1/fonts/glyphicons-halflings-regular.eot +0 -0
- package/example/bootstrap-3.4.1/fonts/glyphicons-halflings-regular.svg +288 -0
- package/example/bootstrap-3.4.1/fonts/glyphicons-halflings-regular.ttf +0 -0
- package/example/bootstrap-3.4.1/fonts/glyphicons-halflings-regular.woff +0 -0
- package/example/bootstrap-3.4.1/fonts/glyphicons-halflings-regular.woff2 +0 -0
- package/example/bootstrap-3.4.1/js/bootstrap.js +2580 -0
- package/example/bootstrap-3.4.1/js/bootstrap.min.js +6 -0
- package/example/bootstrap-3.4.1/js/npm.js +13 -0
- package/example/css/style.css +18 -0
- package/example/index.html +59 -0
- package/example/js/jquery-3.7.1.min.js +2 -0
- package/example/js/utils.js +25 -0
- package/example/js/variables.js +14 -0
- package/example/js/zegoApi.js +229 -0
- package/example/style.css +25 -0
- package/example/test.html +100 -0
- package/package.json +60 -0
- package/release.js +33 -0
- package/rollup-plugin-http.js +49 -0
- package/src/channel/getSendMsgParams.js +66 -0
- package/src/channel/index.js +135 -0
- package/src/channel/pomelo/index.js +182 -0
- package/src/channel/pomelo/latestQueue.js +150 -0
- package/src/channel/pomelo/polemo.js +730 -0
- package/src/channel/pomelo/util.js +54 -0
- package/src/channel/sdk-cb.js +73 -0
- package/src/channel/stream-msg.js +97 -0
- package/src/channel/zbzt/index.js +74 -0
- package/src/channel/zbzt/interactWithChannel.js +4 -0
- package/src/channel/zbzt/interactWithChannelControl.js +1568 -0
- package/src/channel/zbzt/interactWithChannelEntry.js +318 -0
- package/src/config/config.js +226 -0
- package/src/default/base.js +71 -0
- package/src/default/extend.js +36 -0
- package/src/default/index.js +10 -0
- package/src/live/base.js +43 -0
- package/src/live/call-method.js +10 -0
- package/src/live/extend.js +53 -0
- package/src/live/index.js +10 -0
- package/src/network/api.js +56 -0
- package/src/network/commonFetch.js +66 -0
- package/src/network/dataReport.js +448 -0
- package/src/notice.js +418 -0
- package/src/tool/base.js +74 -0
- package/src/tool/call-method.js +10 -0
- package/src/tool/extend.js +42 -0
- package/src/tool/index.js +10 -0
- package/src/util/bridge.js +87 -0
- package/src/util/bridge1.js +46 -0
- package/src/util/dict.js +51 -0
- package/src/util/sessionStorage.js +29 -0
- package/src/util/sha256.js +483 -0
- package/src/util/util.js +329 -0
- package/src/zbzt-av-sdk/default-sdk.js +192 -0
- package/src/zbzt-av-sdk/device.js +86 -0
- package/src/zbzt-av-sdk/rtc-sdk.js +2854 -0
- package/src/zbzt-av-sdk/talrtc-sdk.js +2620 -0
- package/src/zbzt-av-sdk/trtc-sdk.js +1802 -0
- package/src/zbzt-av-sdk/zbzt-av-sdk.js +2121 -0
- package/src/zbzt-av-sdk/zego-sdk.js +1718 -0
- package/src/zbzt-av-sdk/zego-sdk.js.bak +3133 -0
- package/src/zbzt-live-sdk.js +1484 -0
package/src/util/util.js
ADDED
|
@@ -0,0 +1,329 @@
|
|
|
1
|
+
import MD5 from 'md5';
|
|
2
|
+
import sha256 from './sha256.js';
|
|
3
|
+
|
|
4
|
+
const canvas = new OffscreenCanvas(1, 1);
|
|
5
|
+
const ctx = canvas.getContext('2d');
|
|
6
|
+
export default {
|
|
7
|
+
// timestamp : 0,
|
|
8
|
+
// diffTime : 0,
|
|
9
|
+
/**
|
|
10
|
+
* run the callback unitl checkFlag return true
|
|
11
|
+
* @param {function | boolean} checkFlag
|
|
12
|
+
* @param {function} callback
|
|
13
|
+
* @param {*} param
|
|
14
|
+
*/
|
|
15
|
+
waitFlagToRun(checkFlag, callback, param, options, count=1) {
|
|
16
|
+
/**
|
|
17
|
+
* options
|
|
18
|
+
* { repeatTimes : 重试次数限制
|
|
19
|
+
* interval : 间隔时间,默认 100ms
|
|
20
|
+
* }
|
|
21
|
+
* */
|
|
22
|
+
if(options && options.repeatTimes && (count > options.repeatTimes)) return;
|
|
23
|
+
if (checkFlag()) {
|
|
24
|
+
callback(param);
|
|
25
|
+
return;
|
|
26
|
+
} else {
|
|
27
|
+
const interval = options && options.timer ? options.timer : 100;
|
|
28
|
+
setTimeout(() => {
|
|
29
|
+
this.waitFlagToRun(checkFlag, callback, param, options, count+1);
|
|
30
|
+
}, interval);
|
|
31
|
+
}
|
|
32
|
+
},
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* query字符串参数排序
|
|
36
|
+
* */
|
|
37
|
+
queryStringSort(param) {
|
|
38
|
+
return param.split('&').sort().join('&');
|
|
39
|
+
},
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* 生成签名相关
|
|
43
|
+
*/
|
|
44
|
+
getVerifySign(param, saultKey='7qIdL2kdYQzecQJplq8QXfzpolOgUGOM') {
|
|
45
|
+
//按照api要求,进行混合saultKey二次MD5处理
|
|
46
|
+
if(typeof param == 'string') {
|
|
47
|
+
return MD5( MD5(this.queryStringSort(param) + saultKey));
|
|
48
|
+
} else if (typeof param == 'object') {
|
|
49
|
+
let arr = [];
|
|
50
|
+
for (var key in param) {
|
|
51
|
+
arr.push((key + '=' + param[key]));
|
|
52
|
+
}
|
|
53
|
+
let sortedQueryString = this.queryStringSort(arr.join('&'));
|
|
54
|
+
return MD5( MD5(sortedQueryString) + saultKey);
|
|
55
|
+
}
|
|
56
|
+
},
|
|
57
|
+
|
|
58
|
+
//根据值反查字典表中的键名
|
|
59
|
+
getMapKeyByValue(map, value) {
|
|
60
|
+
for (let item of map) {
|
|
61
|
+
if (map.get(item[0]) === value) {
|
|
62
|
+
return item[0];
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
},
|
|
66
|
+
uuid() {
|
|
67
|
+
var s = [];
|
|
68
|
+
var hexDigits = '0123456789abcdef';
|
|
69
|
+
for (var i = 0; i < 36; i++) {
|
|
70
|
+
s[i] = hexDigits.substr(Math.floor(Math.random() * 0x10), 1);
|
|
71
|
+
}
|
|
72
|
+
s[14] = '4';
|
|
73
|
+
s[19] = hexDigits.substr((s[19] & 0x3) | 0x8, 1);
|
|
74
|
+
s[8] = s[13] = s[18] = s[23] = '-';
|
|
75
|
+
|
|
76
|
+
var uuid = s.join('');
|
|
77
|
+
return uuid;
|
|
78
|
+
},
|
|
79
|
+
getVerifySign1() {
|
|
80
|
+
const appId = '1002';
|
|
81
|
+
const key = 'OmAIqyYz0U1/guuFo4GH6nVGNVFeHAczwpsuXzMqKdw=';
|
|
82
|
+
const timestamp = new Date().getTime();
|
|
83
|
+
const RDM = this.uuid();
|
|
84
|
+
return {
|
|
85
|
+
appId,
|
|
86
|
+
RDM,
|
|
87
|
+
timestamp,
|
|
88
|
+
Authorization: sha256.hmacsha256(key, `${appId}&${timestamp}&${RDM}`)
|
|
89
|
+
};
|
|
90
|
+
},
|
|
91
|
+
/**
|
|
92
|
+
*
|
|
93
|
+
* @param {String} idType id类型: userId, roomId, orgId
|
|
94
|
+
* @param {Strig} streamUrl 流地址id
|
|
95
|
+
*/
|
|
96
|
+
getDataFromStreamUrl(idType, streamUrl){
|
|
97
|
+
// streamUrl 格式
|
|
98
|
+
// '_orgId_roomId_userId_1'
|
|
99
|
+
//倒序
|
|
100
|
+
const obj = {
|
|
101
|
+
userId: 1,
|
|
102
|
+
roomId: 2,
|
|
103
|
+
orgId : 3,
|
|
104
|
+
};
|
|
105
|
+
if(!streamUrl){
|
|
106
|
+
return;
|
|
107
|
+
}else{
|
|
108
|
+
return streamUrl.split('_').reverse()[obj[idType]];
|
|
109
|
+
}
|
|
110
|
+
},
|
|
111
|
+
|
|
112
|
+
//转换一下用户角色的定义 用户角色 '1=teacher'/'2=student'/'3=assistant'/'4=parent'
|
|
113
|
+
translateRole(roleString) {
|
|
114
|
+
if (typeof roleString == 'string') {
|
|
115
|
+
if (roleString == 'teacher') {
|
|
116
|
+
return '1';
|
|
117
|
+
} else if (roleString == 'student') {
|
|
118
|
+
return '2';
|
|
119
|
+
} else if (roleString == 'assistant') {
|
|
120
|
+
return '3';
|
|
121
|
+
} else if (roleString == 'parent') {
|
|
122
|
+
return '4';
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
return roleString;
|
|
126
|
+
},
|
|
127
|
+
|
|
128
|
+
//转换一下用户角色的定义 用户角色 '1=teacher'/'2=student'/'3=assistant'/'4=parent'
|
|
129
|
+
translateRoleBack: function (roleNumber) {
|
|
130
|
+
if (typeof roleNumber == 'string') {
|
|
131
|
+
if (roleNumber == '1') {
|
|
132
|
+
return 'teacher';
|
|
133
|
+
} else if (roleNumber == '2') {
|
|
134
|
+
return 'student';
|
|
135
|
+
} else if (roleNumber == '3') {
|
|
136
|
+
return 'assistant';
|
|
137
|
+
} else if (roleNumber == '4') {
|
|
138
|
+
return 'parent';
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
return '';
|
|
142
|
+
},
|
|
143
|
+
throttle: function(fn, delay) {
|
|
144
|
+
var context = null,
|
|
145
|
+
timer = null,
|
|
146
|
+
args = null;
|
|
147
|
+
return function() {
|
|
148
|
+
context = this;
|
|
149
|
+
args = arguments;
|
|
150
|
+
if (timer) return;
|
|
151
|
+
timer = setTimeout(function() {
|
|
152
|
+
clearTimeout(timer);
|
|
153
|
+
timer = null;
|
|
154
|
+
fn.apply(context, args);
|
|
155
|
+
}, delay);
|
|
156
|
+
};
|
|
157
|
+
},
|
|
158
|
+
// 格式化当前时间
|
|
159
|
+
currentTimeString() {
|
|
160
|
+
const date = new Date();
|
|
161
|
+
let fmt = 'yyyy-MM-dd hh:mm:ss:S';
|
|
162
|
+
const o = {
|
|
163
|
+
'M+' : date.getMonth()+1, //月份
|
|
164
|
+
'd+' : date.getDate(), //日
|
|
165
|
+
'h+' : date.getHours(), //小时
|
|
166
|
+
'm+' : date.getMinutes(), //分
|
|
167
|
+
's+' : date.getSeconds(), //秒
|
|
168
|
+
'q+' : Math.floor((date.getMonth()+3)/3), //季度
|
|
169
|
+
'S' : date.getMilliseconds() //毫秒
|
|
170
|
+
};
|
|
171
|
+
if(/(y+)/.test(fmt));
|
|
172
|
+
fmt=fmt.replace(RegExp.$1, (date.getFullYear()+'').substr(4 - RegExp.$1.length));
|
|
173
|
+
for(let k in o) {
|
|
174
|
+
if(new RegExp('('+ k +')').test(fmt));
|
|
175
|
+
fmt = fmt.replace(RegExp.$1, (RegExp.$1.length==1) ? (o[k]) : (('00'+ o[k]).substr((''+ o[k]).length)));
|
|
176
|
+
}
|
|
177
|
+
return fmt;
|
|
178
|
+
},
|
|
179
|
+
getRoomIdByStreamId(streamId) {
|
|
180
|
+
const data = streamId.split('_');
|
|
181
|
+
if (data.length > 1) {
|
|
182
|
+
return data[1];
|
|
183
|
+
} else {
|
|
184
|
+
throw new Error('streamId格式错误');
|
|
185
|
+
}
|
|
186
|
+
},
|
|
187
|
+
//notice返回端上想要的uid
|
|
188
|
+
getUidByStreamId(streamId) {
|
|
189
|
+
if (streamId.split('_').length == 5) {
|
|
190
|
+
return streamId;
|
|
191
|
+
};
|
|
192
|
+
if (streamId && streamId.indexOf('_') > 0) {
|
|
193
|
+
return streamId.split('_')[2];
|
|
194
|
+
} else {
|
|
195
|
+
return streamId;
|
|
196
|
+
}
|
|
197
|
+
},
|
|
198
|
+
//数据上报返回真正的uid
|
|
199
|
+
getUidByStreamIdDr(streamId) {
|
|
200
|
+
if (streamId && streamId.indexOf('_') > 0) {
|
|
201
|
+
return streamId.split('_')[2];
|
|
202
|
+
} else {
|
|
203
|
+
return streamId;
|
|
204
|
+
}
|
|
205
|
+
},
|
|
206
|
+
toFixed(num, bit = 2) {
|
|
207
|
+
let backNum;
|
|
208
|
+
try {
|
|
209
|
+
backNum = parseFloat(num).toFixed(bit);
|
|
210
|
+
} catch (error) {
|
|
211
|
+
backNum = num;
|
|
212
|
+
}
|
|
213
|
+
return backNum;
|
|
214
|
+
},
|
|
215
|
+
getStreamId(args) {
|
|
216
|
+
const {institutionId, roomId, userId, groupId} = args;
|
|
217
|
+
return `${institutionId}_${groupId || roomId}_${userId}_1`;
|
|
218
|
+
},
|
|
219
|
+
getConfId(institutionId, roomId) {
|
|
220
|
+
return `${roomId}_${institutionId}`;
|
|
221
|
+
},
|
|
222
|
+
/**
|
|
223
|
+
* 深拷贝
|
|
224
|
+
* @param {*} obj 拷贝对象(object or array)
|
|
225
|
+
* @param {*} cache 缓存数组
|
|
226
|
+
*/
|
|
227
|
+
deepCopy(obj, cache = []) {
|
|
228
|
+
// typeof [] => 'object'
|
|
229
|
+
// typeof {} => 'object'
|
|
230
|
+
if (obj === null || typeof obj !== 'object') {
|
|
231
|
+
return obj;
|
|
232
|
+
}
|
|
233
|
+
// 如果传入的对象与缓存的相等, 则递归结束, 这样防止循环
|
|
234
|
+
/**
|
|
235
|
+
* 类似下面这种
|
|
236
|
+
* var a = {b:1}
|
|
237
|
+
* a.c = a
|
|
238
|
+
* 资料: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Errors/Cyclic_object_value
|
|
239
|
+
*/
|
|
240
|
+
const hit = cache.filter(c => c.original === obj)[0];
|
|
241
|
+
if (hit) {
|
|
242
|
+
return hit.copy;
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
const copy = Array.isArray(obj) ? [] : {};
|
|
246
|
+
// 将copy首先放入cache, 因为我们需要在递归deepCopy的时候引用它
|
|
247
|
+
cache.push({
|
|
248
|
+
original: obj,
|
|
249
|
+
copy
|
|
250
|
+
});
|
|
251
|
+
Object.keys(obj).forEach(key => {
|
|
252
|
+
copy[key] = deepCopy(obj[key], cache);
|
|
253
|
+
});
|
|
254
|
+
|
|
255
|
+
return copy;
|
|
256
|
+
},
|
|
257
|
+
firstUpperCase(key) {
|
|
258
|
+
if (!key) {
|
|
259
|
+
return key;
|
|
260
|
+
}
|
|
261
|
+
return key.charAt(0).toUpperCase() + key.slice(1);
|
|
262
|
+
},
|
|
263
|
+
getChromeVersion() {
|
|
264
|
+
let chromeVersion = navigator.userAgent;
|
|
265
|
+
console.log('chromeVersion',chromeVersion);
|
|
266
|
+
let res = chromeVersion.search(/Chrome\/68/);
|
|
267
|
+
// res == -1 ;//非68版本要升级
|
|
268
|
+
let isUpdateChromeVersion = res < 0 ? true : false;
|
|
269
|
+
return isUpdateChromeVersion;
|
|
270
|
+
},
|
|
271
|
+
sleep(time) {
|
|
272
|
+
return new Promise((resolve) => setTimeout(resolve, time));
|
|
273
|
+
},
|
|
274
|
+
async getImageDataFromURL(url) {
|
|
275
|
+
const getImageDom = (url) => new Promise((resolve, reject) => {
|
|
276
|
+
const img = new Image();
|
|
277
|
+
img.addEventListener('load', (e) => {
|
|
278
|
+
resolve(img);
|
|
279
|
+
});
|
|
280
|
+
setTimeout(() => {
|
|
281
|
+
reject(new Error('get snapshot timeout'));
|
|
282
|
+
}, 5000);
|
|
283
|
+
img.src = url;
|
|
284
|
+
});
|
|
285
|
+
|
|
286
|
+
const img = await getImageDom(url);
|
|
287
|
+
canvas.width = img.width;
|
|
288
|
+
canvas.height = img.height;
|
|
289
|
+
ctx.drawImage(img, 0, 0);
|
|
290
|
+
return ctx.getImageData(0, 0, img.width, img.height);
|
|
291
|
+
}
|
|
292
|
+
// 获取网络时间戳
|
|
293
|
+
// async getNetworkTimeStamp() {
|
|
294
|
+
// let res;
|
|
295
|
+
// try {
|
|
296
|
+
// res = await getNetworkTimestampApi();
|
|
297
|
+
// } catch (e){
|
|
298
|
+
// console.log('getNetworkTimeStamp1',e);
|
|
299
|
+
// }
|
|
300
|
+
// const res1 = new Date().getTime();
|
|
301
|
+
// // let timestamp = 0;
|
|
302
|
+
// if (res && res.data.t) {
|
|
303
|
+
// this.timestamp = +res.data.t;
|
|
304
|
+
// this.diffTime = this.timestamp - res1;
|
|
305
|
+
// console.log('getNetworkTimeStamp10');
|
|
306
|
+
// } else {
|
|
307
|
+
// this.timestamp = new Date().getTime();
|
|
308
|
+
// this.diffTime = 0;
|
|
309
|
+
// console.log('getNetworkTimeStamp11');
|
|
310
|
+
// // const res1 = await getNetworkTimestampApi('suning');
|
|
311
|
+
// // if (res1.status === 200) {
|
|
312
|
+
// // timestamp = +res1.data.sysTime1 * 1000;
|
|
313
|
+
// // }
|
|
314
|
+
// }
|
|
315
|
+
// console.log('getNetworkTimeStamp2',this.timestamp,res1,this.diffTime);
|
|
316
|
+
// // await this.getDiffTime();
|
|
317
|
+
// // return this.timestamp;
|
|
318
|
+
// },
|
|
319
|
+
//防抖
|
|
320
|
+
// debounce(fn,wait){
|
|
321
|
+
// var timer = null;
|
|
322
|
+
// return function(){
|
|
323
|
+
// if(timer !== null){
|
|
324
|
+
// clearTimeout(timer);
|
|
325
|
+
// }
|
|
326
|
+
// timer = setTimeout(fn,wait);
|
|
327
|
+
// }
|
|
328
|
+
// }
|
|
329
|
+
};
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
import getRTCInstance from 'omnirtc-web';
|
|
2
|
+
import defaultApi from '../default/index.js';
|
|
3
|
+
import NOTICE from '../notice';
|
|
4
|
+
|
|
5
|
+
// Device Test Token
|
|
6
|
+
const token = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhcHBpZCI6IkRldmljZSBUZXN0Iiwicm9vbVN0ciI6IkRldmljZSBUZXN0IiwidXNlciI6MCwiYXR0YWNoVG9rZW4iOiJEZXZpY2UgVGVzdCIsInR5cGUiOjcsImlhdCI6MTUxNjIzOTAyMn0.-KxkA5lfSvCNF2iosqcu4vxqhA8rl8l05mUkWxlvEgE';
|
|
7
|
+
const rtc = getRTCInstance(token);
|
|
8
|
+
|
|
9
|
+
const tracks = {
|
|
10
|
+
video: null,
|
|
11
|
+
audio: null,
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
if (!window.zbztAVSDK_device_checker_init) {
|
|
15
|
+
window.zbztAVSDK_device_checker_init = {
|
|
16
|
+
microphone: {
|
|
17
|
+
hasTest: false,
|
|
18
|
+
list: [],
|
|
19
|
+
use: '',
|
|
20
|
+
name: ''
|
|
21
|
+
},
|
|
22
|
+
camera: {
|
|
23
|
+
hasTest: false,
|
|
24
|
+
list: [],
|
|
25
|
+
use: '',
|
|
26
|
+
name: ''
|
|
27
|
+
},
|
|
28
|
+
speaker: {
|
|
29
|
+
hasTest: false,
|
|
30
|
+
list: [],
|
|
31
|
+
use: '',
|
|
32
|
+
name: ''
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export const getCameraDeviceList = async () => {
|
|
38
|
+
return rtc.getCameras().then((cameras) => {
|
|
39
|
+
const devices = cameras.map((camera, index) => ({
|
|
40
|
+
deviceId: camera.deviceId,
|
|
41
|
+
deviceName: camera.label,
|
|
42
|
+
isDefault: index === 0,
|
|
43
|
+
}));
|
|
44
|
+
window.zbztAVSDK_device_checker_init.camera.list = devices;
|
|
45
|
+
window.zbztAVSDK_device_checker_init.camera.hasTest = true;
|
|
46
|
+
defaultApi.writeLog(`getCameraDeviceList, ${JSON.stringify(devices)}`);
|
|
47
|
+
return devices;
|
|
48
|
+
});
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
export const getSpeakerDeviceList = async () => {
|
|
52
|
+
return rtc.getPlaybackDevices().then((speakers) => {
|
|
53
|
+
const devices = speakers.map((speaker, index) => ({
|
|
54
|
+
deviceId: speaker.deviceId,
|
|
55
|
+
deviceName: speaker.label,
|
|
56
|
+
isDefault: index === 0,
|
|
57
|
+
}));
|
|
58
|
+
window.zbztAVSDK_device_checker_init.speaker.list = devices;
|
|
59
|
+
window.zbztAVSDK_device_checker_init.speaker.hasTest = true;
|
|
60
|
+
defaultApi.writeLog(`getSpeakerDeviceList, ${JSON.stringify(devices)}`);
|
|
61
|
+
return devices;
|
|
62
|
+
});
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
export const getMicrophoneDeviceList = async () => {
|
|
66
|
+
return rtc.getMicrophones().then((microphones) => {
|
|
67
|
+
const devices = microphones.map((microphone, index) => ({
|
|
68
|
+
deviceId: microphone.deviceId,
|
|
69
|
+
deviceName: microphone.label,
|
|
70
|
+
isDefault: index === 0,
|
|
71
|
+
}));
|
|
72
|
+
window.zbztAVSDK_device_checker_init.microphone.list = devices;
|
|
73
|
+
window.zbztAVSDK_device_checker_init.microphone.hasTest = true;
|
|
74
|
+
defaultApi.writeLog(`getMicrophoneDeviceList, ${JSON.stringify(devices)}`);
|
|
75
|
+
return devices;
|
|
76
|
+
});
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
export const setCameraDevice = async ({deviceId}) => {
|
|
80
|
+
window.zbztAVSDK_device_checker_init.camera.use = deviceId;
|
|
81
|
+
window.zbztAVSDK_device_checker_init.camera.name = deviceListReport.cameraList[deviceId];
|
|
82
|
+
if (tracks.video) {
|
|
83
|
+
tracks.video.setDevice(deviceId);
|
|
84
|
+
}
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
export const setSpeakerDevice = async ({deviceId}) => {
|
|
88
|
+
window.zbztAVSDK_device_checker_init.speaker.use = deviceId;
|
|
89
|
+
window.zbztAVSDK_device_checker_init.speaker.name = deviceListReport.speakerList[deviceId];
|
|
90
|
+
};
|
|
91
|
+
|
|
92
|
+
export const setMicrophoneDevice = async ({deviceId}) => {
|
|
93
|
+
window.zbztAVSDK_device_checker_init.microphone.use = deviceId;
|
|
94
|
+
window.zbztAVSDK_device_checker_init.microphone.name = deviceListReport.micList[deviceId];
|
|
95
|
+
if (tracks.audio) {
|
|
96
|
+
tracks.audio.setDevice(deviceId);
|
|
97
|
+
}
|
|
98
|
+
};
|
|
99
|
+
|
|
100
|
+
export const startCamera = async () => {
|
|
101
|
+
if (tracks.video) {
|
|
102
|
+
defaultApi.writeLog('startCamera tracks.video is exist');
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
const config = {};
|
|
107
|
+
const camera = window.zbztAVSDK_device_checker_init.camera;
|
|
108
|
+
if (camera && camera.use) {
|
|
109
|
+
config.cameraId = camera.use;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
const video = await rtc.createCameraVideoTrack(config);
|
|
113
|
+
tracks.video = video;
|
|
114
|
+
};
|
|
115
|
+
|
|
116
|
+
export const stopCamera = async () => {
|
|
117
|
+
if (tracks.video) {
|
|
118
|
+
tracks.video.close();
|
|
119
|
+
tracks.video = null;
|
|
120
|
+
}
|
|
121
|
+
};
|
|
122
|
+
|
|
123
|
+
export const startPreview = async (domId) => {
|
|
124
|
+
if (!domId) {
|
|
125
|
+
defaultApi.writeLog('[startPreview] domId is not exist');
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
if (!tracks.video) {
|
|
130
|
+
defaultApi.writeLog('[startPreview] camera not start');
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
return tracks.video.play(domId);
|
|
135
|
+
};
|
|
136
|
+
|
|
137
|
+
export const startMicrophone = async () => {
|
|
138
|
+
if (tracks.audio) {
|
|
139
|
+
defaultApi.writeLog('startMicrophone tracks.audio is exist');
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
const config = {};
|
|
144
|
+
const microphone = window.zbztAVSDK_device_checker_init.microphone;
|
|
145
|
+
if (microphone && microphone.use) {
|
|
146
|
+
config.microphoneId = microphone.use;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
const audio = await rtc.createMicrophoneAudioTrack(config);
|
|
150
|
+
tracks.audio = audio;
|
|
151
|
+
startVolumeIndicator();
|
|
152
|
+
};
|
|
153
|
+
|
|
154
|
+
export const stopMicrophone = async () => {
|
|
155
|
+
if (tracks.audio) {
|
|
156
|
+
tracks.audio.close();
|
|
157
|
+
tracks.audio = null;
|
|
158
|
+
}
|
|
159
|
+
};
|
|
160
|
+
|
|
161
|
+
export const startVolumeIndicator = async () => {
|
|
162
|
+
if (tracks.audio) {
|
|
163
|
+
setTimeout(() => {
|
|
164
|
+
const level = (tracks.audio.getVolumeLevel() * 100) >> 0;
|
|
165
|
+
NOTICE.captureMicVolumeChanged({
|
|
166
|
+
volume: level,
|
|
167
|
+
});
|
|
168
|
+
startVolumeIndicator();
|
|
169
|
+
}, 1000);
|
|
170
|
+
}
|
|
171
|
+
};
|
|
172
|
+
|
|
173
|
+
export const openOrCloseCamera = async (operation) => {
|
|
174
|
+
return operation ? startCamera() : stopCamera();
|
|
175
|
+
};
|
|
176
|
+
|
|
177
|
+
export const openOrCloseMicrophone = async (operation) => {
|
|
178
|
+
return operation ? startMicrophone() : stopMicrophone();
|
|
179
|
+
};
|
|
180
|
+
|
|
181
|
+
export const getOrLocateVideo = async (isLocal, streamId, domId) => {
|
|
182
|
+
if (isLocal) {
|
|
183
|
+
return startPreview(domId);
|
|
184
|
+
} else {
|
|
185
|
+
defaultApi.writeLog('Please init() first');
|
|
186
|
+
}
|
|
187
|
+
};
|
|
188
|
+
|
|
189
|
+
export const destroyEngine = async () => {
|
|
190
|
+
stopCamera();
|
|
191
|
+
stopMicrophone();
|
|
192
|
+
};
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* @Author: your name
|
|
3
|
+
* @Date: 2020-07-31 14:53:37
|
|
4
|
+
* @LastEditTime: 2020-08-04 15:55:11
|
|
5
|
+
* @LastEditors: why
|
|
6
|
+
* @Description: In User Settings Edit
|
|
7
|
+
* @FilePath: \xinxiaoban_zego\zbzt_live_sdk\src\zbzt-av-sdk\device.js
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { utilitiesExt } from '../config/config';
|
|
11
|
+
import defaultApi from '../default';
|
|
12
|
+
// 扩展标识
|
|
13
|
+
const extensionId = 'utilities_ext';
|
|
14
|
+
// rtc小班课=0;rtc大班课=1
|
|
15
|
+
const classType = 0;
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* @function 调用端提供的回调方法
|
|
20
|
+
* @param name:String 回调方法名
|
|
21
|
+
* @param args 回调参数
|
|
22
|
+
* @return Promise | void
|
|
23
|
+
*/
|
|
24
|
+
const callMethod = (name, args) => {
|
|
25
|
+
// EM 是寄宿于端的,浏览器中并不存在,为防止报错需要先进行能力检测
|
|
26
|
+
if (EM) {
|
|
27
|
+
return new Promise((resolve, reject) => {
|
|
28
|
+
EM.CallMethod(
|
|
29
|
+
extensionId,
|
|
30
|
+
name,
|
|
31
|
+
JSON.stringify({...args, classType}),
|
|
32
|
+
(code, msg) => {
|
|
33
|
+
defaultApi.writeLog(`${name} Code: ${code}\nMessage: ${msg}\nParams: ${JSON.stringify({...args, classType})}`);
|
|
34
|
+
resolve({
|
|
35
|
+
code,
|
|
36
|
+
msg
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
);
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* @function 获取设备状态
|
|
46
|
+
* * @param { string } devicename //(设备名称,可为空)
|
|
47
|
+
* * @param { number } devicetype //(设备类型,1摄像头,2麦克风),3扬声器(mac端没有)
|
|
48
|
+
* @return: Promise
|
|
49
|
+
*/
|
|
50
|
+
const getDeviceState = (devicename, devicetype) => {
|
|
51
|
+
return callMethod('GetDeviceState', {devicetype, devicename});
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
//获取设备状态
|
|
55
|
+
export const getDevicePermissionsFun = async (devicename, devicetype) => {
|
|
56
|
+
defaultApi.writeLog(`sdk action : getDevicePermissionsFun devicename: ${devicename} devicetype: ${devicetype}`);
|
|
57
|
+
try {
|
|
58
|
+
let res =JSON.parse((await getDeviceState(devicename, devicetype)).msg).devicestate
|
|
59
|
+
// let codemsg = {
|
|
60
|
+
// '0':'有权限可用',
|
|
61
|
+
// '1':'没有询问是否开启权限',
|
|
62
|
+
// '2':'用户未授权',
|
|
63
|
+
// '3':'未授权,家长限制',
|
|
64
|
+
// '4':'未知权限类型',
|
|
65
|
+
// '5':'操作系统不支持权限管理',
|
|
66
|
+
// '6':'不可用(win10隐私关闭)',
|
|
67
|
+
// '7':'设备占用'
|
|
68
|
+
// };
|
|
69
|
+
// return codemsg[res];
|
|
70
|
+
console.log('getDevicePermissions_res',res);
|
|
71
|
+
return res;
|
|
72
|
+
} catch (error){
|
|
73
|
+
console.log('getDevicePermissions_error',error)
|
|
74
|
+
return 'error';
|
|
75
|
+
};
|
|
76
|
+
};
|
|
77
|
+
|
|
78
|
+
export const setMediaPermissionFun = (enableVideo, enableMicrophone) =>{
|
|
79
|
+
return callMethod('SetMediaPermission',{enableVideo, enableMicrophone});
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
export const deviceListReport = {
|
|
83
|
+
cameraList: {},
|
|
84
|
+
micList: {},
|
|
85
|
+
speakerList: {},
|
|
86
|
+
};
|