李勇

1.增加一个切换视频录制状态的接口;2.对课堂录制的启动逻辑做现在处理,加入课堂之后已经开启录制之后不再继续发生

@@ -63,7 +63,7 @@ export default class MessageEntrance extends Emiter { @@ -63,7 +63,7 @@ export default class MessageEntrance extends Emiter {
63 super(); 63 super();
64 this.lastClassActiveTime=0;//最后一次课堂激活的时间戳 64 this.lastClassActiveTime=0;//最后一次课堂激活的时间戳
65 //sdk 信息 65 //sdk 信息
66 - GlobalConfig.sdkVersion = "v2.27.11.20171109"; 66 + GlobalConfig.sdkVersion = "v2.28.1.20171110";
67 loger.warn("sdkVersion:" + GlobalConfig.sdkVersion); 67 loger.warn("sdkVersion:" + GlobalConfig.sdkVersion);
68 console.log("sdkVersion:" + GlobalConfig.sdkVersion); 68 console.log("sdkVersion:" + GlobalConfig.sdkVersion);
69 //设置 69 //设置
@@ -304,7 +304,7 @@ export default class MessageEntrance extends Emiter { @@ -304,7 +304,7 @@ export default class MessageEntrance extends Emiter {
304 this.setInvisibleMediaView = this._setInvisibleMediaView.bind(this);//设置监课身份的视图 304 this.setInvisibleMediaView = this._setInvisibleMediaView.bind(this);//设置监课身份的视图
305 305
306 this.setAppConfig = this._setAppConfig.bind(this); 306 this.setAppConfig = this._setAppConfig.bind(this);
307 - this.recordControl = this._mediaRecordControl.bind(this); 307 + this.recordControl = this._changeMediaRecordStatus.bind(this);//切换控制音视频的录制状态
308 308
309 this.changeRtcVideoConfig = this._changeRtcVideoConfig.bind(this);//设置webRtc视频视图的缩放 309 this.changeRtcVideoConfig = this._changeRtcVideoConfig.bind(this);//设置webRtc视频视图的缩放
310 310
@@ -2421,7 +2421,7 @@ export default class MessageEntrance extends Emiter { @@ -2421,7 +2421,7 @@ export default class MessageEntrance extends Emiter {
2421 //上传文档 2421 //上传文档
2422 _sendDocumentUpload(_param) { 2422 _sendDocumentUpload(_param) {
2423 if (!_mcu.connected) { 2423 if (!_mcu.connected) {
2424 - loger.warn(GlobalConfig.getCurrentStatus()); 2424 + console.warn("连接已经断开->上传文档");
2425 return; 2425 return;
2426 } 2426 }
2427 if (_doc_ape) { 2427 if (_doc_ape) {
@@ -2548,9 +2548,16 @@ export default class MessageEntrance extends Emiter { @@ -2548,9 +2548,16 @@ export default class MessageEntrance extends Emiter {
2548 2548
2549 //如果当前课堂内只有自己或者离开上次课堂的时间大于8分钟,需要停止服务端的视频录制,设备不是H5 2549 //如果当前课堂内只有自己或者离开上次课堂的时间大于8分钟,需要停止服务端的视频录制,设备不是H5
2550 if(GlobalConfig.rosterNumber<=1&&interval>=(6*60)&&GlobalConfig.deviceType!=3){ 2550 if(GlobalConfig.rosterNumber<=1&&interval>=(6*60)&&GlobalConfig.deviceType!=3){
  2551 + setTimeout(()=>{
  2552 + //延迟3秒,检测一下当前是否有人在开着视频,如果有开启的就不能再停止了
  2553 + loger.log("当前开启音视频的人数->"+GlobalConfig.getPublishUser());
  2554 + if(GlobalConfig.getPublishUser()<1){
2551 loger.log("调用服务端音视频停止录制->interval:"+interval); 2555 loger.log("调用服务端音视频停止录制->interval:"+interval);
2552 this._mediaRecordControl({"status": WebRtcApe.RECORD_STATUS_2}); 2556 this._mediaRecordControl({"status": WebRtcApe.RECORD_STATUS_2});
2553 } 2557 }
  2558 + },3000);
  2559 +
  2560 + }
2554 2561
2555 //如果是主持人,那么需要判断一下文档模块同步的数据和从sass获取的文档数据是否相同,如果mcu服务器不存在的,需要上传 2562 //如果是主持人,那么需要判断一下文档模块同步的数据和从sass获取的文档数据是否相同,如果mcu服务器不存在的,需要上传
2556 if (GlobalConfig.docListPrepare && GlobalConfig.docListPrepare.length > 0) { 2563 if (GlobalConfig.docListPrepare && GlobalConfig.docListPrepare.length > 0) {
@@ -3352,7 +3359,7 @@ export default class MessageEntrance extends Emiter { @@ -3352,7 +3359,7 @@ export default class MessageEntrance extends Emiter {
3352 break; 3359 break;
3353 case WebRtcApe.RECORD_STATUS_2: 3360 case WebRtcApe.RECORD_STATUS_2:
3354 //停止录制 3361 //停止录制
3355 - //_webRtc.stopRecordingMedia(); 3362 + loger.warn("调用停止音视频录制->");
3356 _webRtc.changePublishStatusAndServerRecord(WebRtcApe.RECORD_STATUS_2); 3363 _webRtc.changePublishStatusAndServerRecord(WebRtcApe.RECORD_STATUS_2);
3357 break; 3364 break;
3358 default : 3365 default :
@@ -3361,6 +3368,14 @@ export default class MessageEntrance extends Emiter { @@ -3361,6 +3368,14 @@ export default class MessageEntrance extends Emiter {
3361 } 3368 }
3362 } 3369 }
3363 3370
  3371 + /*
  3372 + * 切换音视频的录制状态 1开启 2停止
  3373 + * */
  3374 + _changeMediaRecordStatus(_param){
  3375 + if(_webRtc){
  3376 + _webRtc.changeMediaRecordStatus(_param);
  3377 + }
  3378 + }
3364 //webRtc-----------------end -------------------------------- 3379 //webRtc-----------------end --------------------------------
3365 //判断是否能推流,当前课堂推流人数是有限制的 3380 //判断是否能推流,当前课堂推流人数是有限制的
3366 _hasFreePublishChannel() { 3381 _hasFreePublishChannel() {
@@ -10,6 +10,7 @@ class GlobalConfig { @@ -10,6 +10,7 @@ class GlobalConfig {
10 constructor() { 10 constructor() {
11 11
12 } 12 }
  13 +
13 _currentStatus = null; 14 _currentStatus = null;
14 15
15 static getCurrentStatus() { 16 static getCurrentStatus() {
@@ -18,15 +19,19 @@ class GlobalConfig { @@ -18,15 +19,19 @@ class GlobalConfig {
18 } 19 }
19 return this._currentStatus; 20 return this._currentStatus;
20 } 21 }
  22 +
21 static setCurrentStatus(_data) { 23 static setCurrentStatus(_data) {
22 this._currentStatus = _data; 24 this._currentStatus = _data;
23 } 25 }
  26 +
24 static getClassDetail() { 27 static getClassDetail() {
25 return this.classDetail; 28 return this.classDetail;
26 } 29 }
  30 +
27 static setClassDetail(_data) { 31 static setClassDetail(_data) {
28 this.classDetail = _data; 32 this.classDetail = _data;
29 } 33 }
  34 +
30 static getClassInfo() { 35 static getClassInfo() {
31 let classInfo = {}; 36 let classInfo = {};
32 classInfo.siteId = this.siteId; 37 classInfo.siteId = this.siteId;
@@ -61,8 +66,8 @@ class GlobalConfig { @@ -61,8 +66,8 @@ class GlobalConfig {
61 classInfo.appId = this.appId; 66 classInfo.appId = this.appId;
62 classInfo.appCertificate = this.appCertificate; 67 classInfo.appCertificate = this.appCertificate;
63 classInfo.appRecordingKey = this.appRecordingKey; 68 classInfo.appRecordingKey = this.appRecordingKey;
64 - classInfo.channelId =this.channelId ;  
65 - classInfo.channelKey =this.channelKey ; 69 + classInfo.channelId = this.channelId;
  70 + classInfo.channelKey = this.channelKey;
66 classInfo.userUid = this.userUid; 71 classInfo.userUid = this.userUid;
67 return classInfo; 72 return classInfo;
68 73
@@ -101,9 +106,10 @@ class GlobalConfig { @@ -101,9 +106,10 @@ class GlobalConfig {
101 106
102 classStatusInfo.currentSceneTableId = this.currentSceneTableId; //文档区域的模块显示 107 classStatusInfo.currentSceneTableId = this.currentSceneTableId; //文档区域的模块显示
103 classStatusInfo.serverAndLoacTimeDistanc = this.serverAndLoacTimeDistanc; 108 classStatusInfo.serverAndLoacTimeDistanc = this.serverAndLoacTimeDistanc;
104 - classStatusInfo.videoScale=this.videoScale; 109 + classStatusInfo.videoScale = this.videoScale;
105 return classStatusInfo; 110 return classStatusInfo;
106 } 111 }
  112 +
107 //设置当前的课堂状态的信息 113 //设置当前的课堂状态的信息
108 static setClassStatusInfo(_data) { 114 static setClassStatusInfo(_data) {
109 //loger.log("setClassStatusInfo"); 115 //loger.log("setClassStatusInfo");
@@ -142,56 +148,77 @@ class GlobalConfig { @@ -142,56 +148,77 @@ class GlobalConfig {
142 148
143 149
144 //this.recordStatus = data.recordStatus || this.recordStatus; //当前录制状态 150 //this.recordStatus = data.recordStatus || this.recordStatus; //当前录制状态
145 - this.recordStatus = data.recordStatus ||false; //当前录制状态  
146 - this.recordTimestamp =Math.max(parseInt(data.recordTimestamp), this.recordTimestamp); //录制时间取最大值 151 + this.recordStatus = data.recordStatus || false; //当前录制状态
  152 + this.recordTimestamp = Math.max(parseInt(data.recordTimestamp), this.recordTimestamp); //录制时间取最大值
147 this.recordFileName = data.recordFileName || this.recordFileName; //录制的文件名 153 this.recordFileName = data.recordFileName || this.recordFileName; //录制的文件名
148 this.recordDownloadUrl = data.recordDownloadUrl || this.recordDownloadUrl; //下载地址 154 this.recordDownloadUrl = data.recordDownloadUrl || this.recordDownloadUrl; //下载地址
149 this.currentSceneTableId = data.currentSceneTableId || 0; //文档区域的模块显示 155 this.currentSceneTableId = data.currentSceneTableId || 0; //文档区域的模块显示
150 156
151 - this.isEnableDraw=data.isEnableDraw||false;//是否开启所有人的绘制权限  
152 - this.videoScale=parseInt(data.videoScale)||1; 157 + this.isEnableDraw = data.isEnableDraw || false;//是否开启所有人的绘制权限
  158 + this.videoScale = parseInt(data.videoScale) || 1;
153 // 全局禁言状态 159 // 全局禁言状态
154 this.silence = data.silence || false; 160 this.silence = data.silence || false;
155 - this.silenceUsers =data.silenceUsers || {};  
156 - if((typeof this.silenceUsers =='string')&& this.silenceUsers .constructor==String){  
157 - this.silenceUsers={}; 161 + this.silenceUsers = data.silenceUsers || {};
  162 + if ((typeof this.silenceUsers == 'string') && this.silenceUsers.constructor == String) {
  163 + this.silenceUsers = {};
158 } 164 }
159 } 165 }
  166 +
160 /* 167 /*
161 * 根据nodeId获取用户的身份 168 * 根据nodeId获取用户的身份
162 * */ 169 * */
163 - static getUserRoleFromeNodeId(_nodeId){  
164 - let user=this.rosters[_nodeId];  
165 - if(user){ 170 + static getUserRoleFromeNodeId(_nodeId) {
  171 + let user = this.rosters[_nodeId];
  172 + if (user) {
166 return user.userRole; 173 return user.userRole;
167 - }else { 174 + } else {
168 return "normal" 175 return "normal"
169 } 176 }
170 } 177 }
  178 +
171 /* 179 /*
172 * 根据nodeId获取用户的信息 180 * 根据nodeId获取用户的信息
173 * */ 181 * */
174 - static getUserInfoFromeNodeId(_nodeId){ 182 + static getUserInfoFromeNodeId(_nodeId) {
175 return this.rosters[_nodeId]; 183 return this.rosters[_nodeId];
176 } 184 }
  185 +
177 //获取推流权限,需要检查当前是否可以继续推流 186 //获取推流权限,需要检查当前是否可以继续推流
178 - static getPublishPermission(){  
179 - if(!this.rosters){ 187 + static getPublishPermission() {
  188 + if (!this.rosters) {
180 return true; 189 return true;
181 } 190 }
182 - let openCounter=0;  
183 - for (let i in this.rosters){  
184 - let item=this.rosters[i];  
185 - if(item&&item.userRole!=ApeConsts.invisible&&(item.openCamera>0||item.openMicrophones>0)){ 191 + let openCounter = 0;
  192 + for (let i in this.rosters) {
  193 + let item = this.rosters[i];
  194 + if (item && item.userRole != ApeConsts.invisible && (item.openCamera > 0 || item.openMicrophones > 0)) {
186 openCounter++; 195 openCounter++;
187 //统计当前已经开启摄像头和麦克风的人数,如果当前开启的人数大于等于最大允许的数量就不允许其他人再打开 196 //统计当前已经开启摄像头和麦克风的人数,如果当前开启的人数大于等于最大允许的数量就不允许其他人再打开
188 - if(openCounter>=GlobalConfig.maxMediaChannels){ 197 + if (openCounter >= GlobalConfig.maxMediaChannels) {
189 return false; 198 return false;
190 } 199 }
191 } 200 }
192 } 201 }
193 return true; 202 return true;
194 } 203 }
  204 +
  205 + /*
  206 + * 获取当前推流的人数
  207 + * */
  208 + static getPublishUser() {
  209 + if (!this.rosters) {
  210 + return 0;
  211 + }
  212 + let openCounter = 0;
  213 + for (let i in this.rosters) {
  214 + let item = this.rosters[i];
  215 + if (item && item.userRole != ApeConsts.invisible && (item.openCamera > 0 || item.openMicrophones > 0)) {
  216 + openCounter++;
  217 + }
  218 + }
  219 + return openCounter;
  220 + }
  221 +
195 // 判断自己是否主持人角色 222 // 判断自己是否主持人角色
196 static get isHost() { 223 static get isHost() {
197 if (this.userRole == ApeConsts.host) { 224 if (this.userRole == ApeConsts.host) {
@@ -234,9 +261,9 @@ class GlobalConfig { @@ -234,9 +261,9 @@ class GlobalConfig {
234 261
235 //是否是老师或主讲人 262 //是否是老师或主讲人
236 static get isTeachOrAssistant() { 263 static get isTeachOrAssistant() {
237 - if (this.userRole == ApeConsts.host||  
238 - this.userRole==ApeConsts.assistant||  
239 - this.userRole==ApeConsts.presenter) { 264 + if (this.userRole == ApeConsts.host ||
  265 + this.userRole == ApeConsts.assistant ||
  266 + this.userRole == ApeConsts.presenter) {
240 return true; 267 return true;
241 } 268 }
242 return false; 269 return false;
@@ -245,19 +272,23 @@ class GlobalConfig { @@ -245,19 +272,23 @@ class GlobalConfig {
245 static get serverTimestamp() { 272 static get serverTimestamp() {
246 return EngineUtils.creatTimestamp(); 273 return EngineUtils.creatTimestamp();
247 } 274 }
  275 +
248 //储存已经提前上传的文档列表 276 //储存已经提前上传的文档列表
249 static setDocListPrepare(_data) { 277 static setDocListPrepare(_data) {
250 if (_data == null) return; 278 if (_data == null) return;
251 this.docListPrepare = _data; 279 this.docListPrepare = _data;
252 } 280 }
  281 +
253 static getDocListPrepare() { 282 static getDocListPrepare() {
254 return this.docListPrepare; 283 return this.docListPrepare;
255 } 284 }
  285 +
256 //储存已经提前上传的媒体共享文件列表 286 //储存已经提前上传的媒体共享文件列表
257 static setMediaShareList(_data) { 287 static setMediaShareList(_data) {
258 if (_data == null) return; 288 if (_data == null) return;
259 this.sharedMediaList = _data; 289 this.sharedMediaList = _data;
260 } 290 }
  291 +
261 static getMediaShareList() { 292 static getMediaShareList() {
262 return this.sharedMediaList; 293 return this.sharedMediaList;
263 } 294 }
@@ -267,6 +298,7 @@ class GlobalConfig { @@ -267,6 +298,7 @@ class GlobalConfig {
267 if (_data == null) return; 298 if (_data == null) return;
268 this.sharedMusicList = _data; 299 this.sharedMusicList = _data;
269 } 300 }
  301 +
270 static getMusicShareList() { 302 static getMusicShareList() {
271 return this.sharedMusicList; 303 return this.sharedMusicList;
272 } 304 }
@@ -276,6 +308,7 @@ class GlobalConfig { @@ -276,6 +308,7 @@ class GlobalConfig {
276 if (_data == null) return; 308 if (_data == null) return;
277 this.recordList = _data; 309 this.recordList = _data;
278 } 310 }
  311 +
279 static getRecordList() { 312 static getRecordList() {
280 return this.recordList; 313 return this.recordList;
281 } 314 }
@@ -285,14 +318,17 @@ class GlobalConfig { @@ -285,14 +318,17 @@ class GlobalConfig {
285 if (_data == null) return; 318 if (_data == null) return;
286 this.docList = _data; 319 this.docList = _data;
287 } 320 }
  321 +
288 static getDocList() { 322 static getDocList() {
289 return this.docList; 323 return this.docList;
290 } 324 }
  325 +
291 //ms列表 326 //ms列表
292 static setMsList(_data) { 327 static setMsList(_data) {
293 if (_data == null) return; 328 if (_data == null) return;
294 this.msList = _data; 329 this.msList = _data;
295 } 330 }
  331 +
296 static getMsList() { 332 static getMsList() {
297 return this.msList; 333 return this.msList;
298 } 334 }
@@ -302,6 +338,7 @@ class GlobalConfig { @@ -302,6 +338,7 @@ class GlobalConfig {
302 if (_data == null) return; 338 if (_data == null) return;
303 this.rtmpPullList = _data; 339 this.rtmpPullList = _data;
304 } 340 }
  341 +
305 static getRtmpPullList() { 342 static getRtmpPullList() {
306 return this.rtmpPullList; 343 return this.rtmpPullList;
307 } 344 }
@@ -311,6 +348,7 @@ class GlobalConfig { @@ -311,6 +348,7 @@ class GlobalConfig {
311 if (_data == null) return; 348 if (_data == null) return;
312 this.hlsPullList = _data; 349 this.hlsPullList = _data;
313 } 350 }
  351 +
314 static getHlsPullList() { 352 static getHlsPullList() {
315 return this.hlsPullList; 353 return this.hlsPullList;
316 } 354 }
@@ -320,6 +358,7 @@ class GlobalConfig { @@ -320,6 +358,7 @@ class GlobalConfig {
320 if (_data == null) return; 358 if (_data == null) return;
321 this.rsList = _data; 359 this.rsList = _data;
322 } 360 }
  361 +
323 static getRsList() { 362 static getRsList() {
324 return this.rsList; 363 return this.rsList;
325 } 364 }
@@ -329,6 +368,7 @@ class GlobalConfig { @@ -329,6 +368,7 @@ class GlobalConfig {
329 if (_data == null) return; 368 if (_data == null) return;
330 this.mcuList = _data; 369 this.mcuList = _data;
331 } 370 }
  371 +
332 static getMcuList() { 372 static getMcuList() {
333 return this.mcuList; 373 return this.mcuList;
334 } 374 }
@@ -338,20 +378,22 @@ class GlobalConfig { @@ -338,20 +378,22 @@ class GlobalConfig {
338 if (_data == null) return; 378 if (_data == null) return;
339 this.musicList = _data; 379 this.musicList = _data;
340 } 380 }
  381 +
341 static getMusicList() { 382 static getMusicList() {
342 return this.musicList; 383 return this.musicList;
343 } 384 }
  385 +
344 //已经上传的声音列表 386 //已经上传的声音列表
345 static setMusicListPrepare(_data) { 387 static setMusicListPrepare(_data) {
346 if (_data == null) return; 388 if (_data == null) return;
347 this.musicListPrepare = _data; 389 this.musicListPrepare = _data;
348 } 390 }
  391 +
349 static getMusicListPrepare() { 392 static getMusicListPrepare() {
350 return this.musicListPrepare; 393 return this.musicListPrepare;
351 } 394 }
352 395
353 396
354 -  
355 //CDN加速的 拉流地址 rtmp 和hls(m3u8) 397 //CDN加速的 拉流地址 rtmp 和hls(m3u8)
356 static setVideoCDNAddr(_data) { 398 static setVideoCDNAddr(_data) {
357 if (_data == null) return; 399 if (_data == null) return;
@@ -364,33 +406,34 @@ class GlobalConfig { @@ -364,33 +406,34 @@ class GlobalConfig {
364 } 406 }
365 407
366 //把IP中的端口换成指定端口 408 //把IP中的端口换成指定端口
367 - static replacePort(_ipport,_curPort,_newPort){  
368 - loger.warn("替换端口->",_ipport,_curPort,_newPort);  
369 - if(!_ipport||!_curPort){ 409 + static replacePort(_ipport, _curPort, _newPort) {
  410 + loger.warn("替换端口->", _ipport, _curPort, _newPort);
  411 + if (!_ipport || !_curPort) {
370 //数据不正确,直接返回原数据 412 //数据不正确,直接返回原数据
371 return _ipport; 413 return _ipport;
372 } 414 }
373 try { 415 try {
374 //判断要替换的端口是否在最后的位置,否则是不能替换的,比如替换":80"端口,如果地址是"xxx.xxx.xxx:8080" 不判断的话就会出错 416 //判断要替换的端口是否在最后的位置,否则是不能替换的,比如替换":80"端口,如果地址是"xxx.xxx.xxx:8080" 不判断的话就会出错
375 - let lastIndex=_ipport.lastIndexOf(_curPort);  
376 - if((_ipport.length-_curPort.length)==lastIndex){  
377 - let ipportNew=_ipport.replace(_curPort,_newPort); 417 + let lastIndex = _ipport.lastIndexOf(_curPort);
  418 + if ((_ipport.length - _curPort.length) == lastIndex) {
  419 + let ipportNew = _ipport.replace(_curPort, _newPort);
378 return ipportNew 420 return ipportNew
379 } 421 }
380 return _ipport; 422 return _ipport;
381 - }catch (err){ 423 + } catch (err) {
382 return _ipport; 424 return _ipport;
383 } 425 }
384 426
385 } 427 }
  428 +
386 //通过IP查找IP对象 429 //通过IP查找IP对象
387 - static getIpItem(ip,ipList){  
388 - if(!ip||!ipList) { 430 + static getIpItem(ip, ipList) {
  431 + if (!ip || !ipList) {
389 return null; 432 return null;
390 } 433 }
391 - for(let i=0;i<ipList.length;i++){  
392 - let item=ipList[i];  
393 - if(item&&item.ip==ip){ 434 + for (let i = 0; i < ipList.length; i++) {
  435 + let item = ipList[i];
  436 + if (item && item.ip == ip) {
394 return item; 437 return item;
395 } 438 }
396 } 439 }
@@ -398,11 +441,11 @@ class GlobalConfig { @@ -398,11 +441,11 @@ class GlobalConfig {
398 } 441 }
399 } 442 }
400 443
401 -GlobalConfig.statusCode_0 = { "code": 0, message: "SDK 未初始化" };  
402 -GlobalConfig.statusCode_1 = { "code": 1, message: "未加入课堂" };  
403 -GlobalConfig.statusCode_2 = { "code": 2, message: "已经加入课堂" };  
404 -GlobalConfig.statusCode_3 = { "code": 3, message: "已经离开课堂" };  
405 -GlobalConfig.statusCode_4 = { "code": 4, message: "未知状态" }; 444 +GlobalConfig.statusCode_0 = {"code": 0, message: "SDK 未初始化"};
  445 +GlobalConfig.statusCode_1 = {"code": 1, message: "未加入课堂"};
  446 +GlobalConfig.statusCode_2 = {"code": 2, message: "已经加入课堂"};
  447 +GlobalConfig.statusCode_3 = {"code": 3, message: "已经离开课堂"};
  448 +GlobalConfig.statusCode_4 = {"code": 4, message: "未知状态"};
406 449
407 GlobalConfig.screenWidth = 1024; 450 GlobalConfig.screenWidth = 1024;
408 GlobalConfig.screenHeight = 768; 451 GlobalConfig.screenHeight = 768;
@@ -412,7 +455,7 @@ GlobalConfig.msType = 1; //鐩墠鍥哄畾鐢ㄨ繖涓 @@ -412,7 +455,7 @@ GlobalConfig.msType = 1; //鐩墠鍥哄畾鐢ㄨ繖涓
412 GlobalConfig.messageDelay = false; //是否启用消息延迟 455 GlobalConfig.messageDelay = false; //是否启用消息延迟
413 GlobalConfig.mcuDelay = 0; //默认的延迟时间(单位-秒) 456 GlobalConfig.mcuDelay = 0; //默认的延迟时间(单位-秒)
414 457
415 -GlobalConfig.classExit=false;//是否关闭课堂,如果关闭之后不再连接MCU 458 +GlobalConfig.classExit = false;//是否关闭课堂,如果关闭之后不再连接MCU
416 459
417 GlobalConfig.docDelay = 1600; //文档模块加入成功之后延迟发送送成功的消息给主模块(sdk内部使用) 460 GlobalConfig.docDelay = 1600; //文档模块加入成功之后延迟发送送成功的消息给主模块(sdk内部使用)
418 GlobalConfig.portal = ""; //Sass IP 461 GlobalConfig.portal = ""; //Sass IP
@@ -464,7 +507,6 @@ GlobalConfig.hlsPullListFinal = []; //鏈缁堥夋嫨鐨凥LS鎷夋祦鍦板潃闆嗗悎 @@ -464,7 +507,6 @@ GlobalConfig.hlsPullListFinal = []; //鏈缁堥夋嫨鐨凥LS鎷夋祦鍦板潃闆嗗悎
464 GlobalConfig.rsPullListFinal = []; //最终选择的录制回放HLS拉流地址集合 507 GlobalConfig.rsPullListFinal = []; //最终选择的录制回放HLS拉流地址集合
465 508
466 509
467 -  
468 //连接MCU的IP+端口 510 //连接MCU的IP+端口
469 GlobalConfig.MCUServerIP = ""; 511 GlobalConfig.MCUServerIP = "";
470 GlobalConfig.MCUServerPort = ''; 512 GlobalConfig.MCUServerPort = '';
@@ -499,7 +541,7 @@ GlobalConfig.maxMediaChannels = 0; //鏈澶ч煶瑙嗛璺暟锛屼互闊宠棰戣矾鏁颁 @@ -499,7 +541,7 @@ GlobalConfig.maxMediaChannels = 0; //鏈澶ч煶瑙嗛璺暟锛屼互闊宠棰戣矾鏁颁
499 GlobalConfig.hasCamera = false; //摄像头是否可用 541 GlobalConfig.hasCamera = false; //摄像头是否可用
500 GlobalConfig.hasMicrophone = false; //麦克风是否可用 542 GlobalConfig.hasMicrophone = false; //麦克风是否可用
501 543
502 -GlobalConfig.returnCitySN=null;//获取的ip数据 {"cip":"60.253.214.122","cid":"110000","cname":"北京市"} 544 +GlobalConfig.returnCitySN = null;//获取的ip数据 {"cip":"60.253.214.122","cid":"110000","cname":"北京市"}
503 GlobalConfig.deviceType = 0; //设备类型 0:电脑 1:ios 2:安卓 545 GlobalConfig.deviceType = 0; //设备类型 0:电脑 1:ios 2:安卓
504 GlobalConfig.userIp = ""; //用户当前IP 546 GlobalConfig.userIp = ""; //用户当前IP
505 GlobalConfig.userId = 0; 547 GlobalConfig.userId = 0;
@@ -508,7 +550,7 @@ GlobalConfig.handUpTime = 0; @@ -508,7 +550,7 @@ GlobalConfig.handUpTime = 0;
508 GlobalConfig.level = 0; 550 GlobalConfig.level = 0;
509 GlobalConfig.openCamera = 0; 551 GlobalConfig.openCamera = 0;
510 GlobalConfig.openMicrophones = 0; 552 GlobalConfig.openMicrophones = 0;
511 -GlobalConfig.selfDisEnableDrawTime=1;//记录是否禁用画笔,0为启用画笔,大于0时被禁用的时间戳 553 +GlobalConfig.selfDisEnableDrawTime = 1;//记录是否禁用画笔,0为启用画笔,大于0时被禁用的时间戳
512 554
513 //视频质量相关设置 555 //视频质量相关设置
514 GlobalConfig.fps = 15; //帧频 556 GlobalConfig.fps = 15; //帧频
@@ -526,7 +568,7 @@ GlobalConfig.autoGain = false; //鑷姩璋冭妭楹﹀厠椋庨煶閲 @@ -526,7 +568,7 @@ GlobalConfig.autoGain = false; //鑷姩璋冭妭楹﹀厠椋庨煶閲
526 GlobalConfig.speakerVolume = 80; //扬声器音量(0-80) 568 GlobalConfig.speakerVolume = 80; //扬声器音量(0-80)
527 GlobalConfig.micCode = 0; //麦克风模式 569 GlobalConfig.micCode = 0; //麦克风模式
528 570
529 -GlobalConfig.optionJsonData="";//音视频模块推流时的可选参数,这个由外部传入 571 +GlobalConfig.optionJsonData = "";//音视频模块推流时的可选参数,这个由外部传入
530 GlobalConfig.audioRecords = []; 572 GlobalConfig.audioRecords = [];
531 GlobalConfig.videoRecords = []; 573 GlobalConfig.videoRecords = [];
532 GlobalConfig.status = 0 574 GlobalConfig.status = 0
@@ -570,7 +612,7 @@ GlobalConfig.updateRecordTimeDelay = 5; //(绉)锛屽悓姝ヤ竴娆¤鍫傚綍鍒剁姸鎬 @@ -570,7 +612,7 @@ GlobalConfig.updateRecordTimeDelay = 5; //(绉)锛屽悓姝ヤ竴娆¤鍫傚綍鍒剁姸鎬
570 GlobalConfig.updateClassInfoDelay = 10; //(秒),同步一次课堂状态的并保存到Sass 612 GlobalConfig.updateClassInfoDelay = 10; //(秒),同步一次课堂状态的并保存到Sass
571 GlobalConfig.msDynamicChooseIpDelay = 60 * 3; //(秒)MS动态选点的间隔 613 GlobalConfig.msDynamicChooseIpDelay = 60 * 3; //(秒)MS动态选点的间隔
572 //GlobalConfig.serverTimestamp=0;//当前的系统时间戳 用get set 获取 614 //GlobalConfig.serverTimestamp=0;//当前的系统时间戳 用get set 获取
573 -GlobalConfig.whiteboardId=2359297;//白板文档的ID 615 +GlobalConfig.whiteboardId = 2359297;//白板文档的ID
574 GlobalConfig.activeDocId = 0; //当前激活的文档ID 616 GlobalConfig.activeDocId = 0; //当前激活的文档ID
575 GlobalConfig.activeDocCurPage = 1; //当前激活的文档的当前页 617 GlobalConfig.activeDocCurPage = 1; //当前激活的文档的当前页
576 618
@@ -583,9 +625,8 @@ GlobalConfig.classAllParam = {}; //Sass鐩存帴杩斿洖鐨勬墍鏈夎鍫備俊鎭(鏈鍏) @@ -583,9 +625,8 @@ GlobalConfig.classAllParam = {}; //Sass鐩存帴杩斿洖鐨勬墍鏈夎鍫備俊鎭(鏈鍏)
583 GlobalConfig.classDetail = {}; //Sass直接返回的当前课堂基本信息 625 GlobalConfig.classDetail = {}; //Sass直接返回的当前课堂基本信息
584 626
585 627
586 -  
587 GlobalConfig.isRecordPlayBack = false; //是否是录制回放,默认是否 628 GlobalConfig.isRecordPlayBack = false; //是否是录制回放,默认是否
588 -GlobalConfig.allowRecordMaxTime = 48*60*60; //(秒)允许录制的最长时间 629 +GlobalConfig.allowRecordMaxTime = 48 * 60 * 60; //(秒)允许录制的最长时间
589 630
590 GlobalConfig.siteId_letv = 'shchuanbao'; //乐视,MS不需要动态选点的站点 631 GlobalConfig.siteId_letv = 'shchuanbao'; //乐视,MS不需要动态选点的站点
591 GlobalConfig.ssTunnelAppURL = ''; //屏幕共享插件的地址 632 GlobalConfig.ssTunnelAppURL = ''; //屏幕共享插件的地址
@@ -593,36 +634,36 @@ GlobalConfig.serverTime = 0; //鏈嶅姟鍣ㄥ綋鍓嶆椂闂存埑 @@ -593,36 +634,36 @@ GlobalConfig.serverTime = 0; //鏈嶅姟鍣ㄥ綋鍓嶆椂闂存埑
593 GlobalConfig.serverAndLoacTimeDistanc = 0; //本地时间和服务器时间错的差值; 634 GlobalConfig.serverAndLoacTimeDistanc = 0; //本地时间和服务器时间错的差值;
594 GlobalConfig.logUrl = ""; //日志上报地址; 635 GlobalConfig.logUrl = ""; //日志上报地址;
595 636
596 -GlobalConfig.rosterNumber=0;//当前总人数  
597 -GlobalConfig.rosters={};//当前课堂内的人员数据 637 +GlobalConfig.rosterNumber = 0;//当前总人数
  638 +GlobalConfig.rosters = {};//当前课堂内的人员数据
598 639
599 GlobalConfig.isMobile = false; //是否是移动端 640 GlobalConfig.isMobile = false; //是否是移动端
600 -GlobalConfig.language="";//浏览器语言  
601 -GlobalConfig.platform="pc";//平台 IOS/ANDROID/PC  
602 -GlobalConfig.explorer="未知";//浏览器  
603 -GlobalConfig.explorerVersion="未知";//浏览器版本  
604 -GlobalConfig.os="未知";//系统 641 +GlobalConfig.language = "";//浏览器语言
  642 +GlobalConfig.platform = "pc";//平台 IOS/ANDROID/PC
  643 +GlobalConfig.explorer = "未知";//浏览器
  644 +GlobalConfig.explorerVersion = "未知";//浏览器版本
  645 +GlobalConfig.os = "未知";//系统
605 646
606 -GlobalConfig.locationProtocol="http://";//https;或http:  
607 -GlobalConfig.websocketProtocol="ws://";//wss或ws  
608 -GlobalConfig.isHttps=false;//是否是https 647 +GlobalConfig.locationProtocol = "http://";//https;或http:
  648 +GlobalConfig.websocketProtocol = "ws://";//wss或ws
  649 +GlobalConfig.isHttps = false;//是否是https
609 650
610 -GlobalConfig.openFlash=false;//使用flash通话模式。默认为false,使用的是webRtc 651 +GlobalConfig.openFlash = false;//使用flash通话模式。默认为false,使用的是webRtc
611 //webRtc 652 //webRtc
612 GlobalConfig.appId = ''; 653 GlobalConfig.appId = '';
613 GlobalConfig.appCertificate = ""; 654 GlobalConfig.appCertificate = "";
614 GlobalConfig.appRecordingKey = ""; 655 GlobalConfig.appRecordingKey = "";
615 GlobalConfig.channelId = ""; 656 GlobalConfig.channelId = "";
616 -GlobalConfig.channelKey =""; 657 +GlobalConfig.channelKey = "";
617 GlobalConfig.userUid = 0; 658 GlobalConfig.userUid = 0;
618 -GlobalConfig.recordInterfaces="";//控制开启录制和录制状态改变的接口  
619 -GlobalConfig.getRecordInfoInterfaces="";//获取媒体录制信息数据的接口  
620 -GlobalConfig.stopRecordingInterfaces="";//停止录制的接口  
621 -GlobalConfig.getTxRecordInfoInterfaces="";//获取媒体录制信息数据的接口(tx)  
622 -GlobalConfig.getRecordFileURLAgoInterfaces="";//获取媒体录制信息数据的接口(ago)  
623 -GlobalConfig.getChannelToken="";//获取token的地址  
624 -GlobalConfig.recordFileSever="";//录制文件路径和文件地址(ago)  
625 -GlobalConfig.videoScale=1;//视频的缩放倍数,默认1倍无缩放 659 +GlobalConfig.recordInterfaces = "";//控制开启录制和录制状态改变的接口
  660 +GlobalConfig.getRecordInfoInterfaces = "";//获取媒体录制信息数据的接口
  661 +GlobalConfig.stopRecordingInterfaces = "";//停止录制的接口
  662 +GlobalConfig.getTxRecordInfoInterfaces = "";//获取媒体录制信息数据的接口(tx)
  663 +GlobalConfig.getRecordFileURLAgoInterfaces = "";//获取媒体录制信息数据的接口(ago)
  664 +GlobalConfig.getChannelToken = "";//获取token的地址
  665 +GlobalConfig.recordFileSever = "";//录制文件路径和文件地址(ago)
  666 +GlobalConfig.videoScale = 1;//视频的缩放倍数,默认1倍无缩放
626 667
627 export default GlobalConfig; 668 export default GlobalConfig;
628 669
@@ -34,30 +34,30 @@ class RecordPlayBackParse extends Emiter { @@ -34,30 +34,30 @@ class RecordPlayBackParse extends Emiter {
34 this._recordPlaybackTimestamp = 0;//回放的时间 34 this._recordPlaybackTimestamp = 0;//回放的时间
35 this._recordPlaybackMaxTime = 0;//录制回放的总时间 35 this._recordPlaybackMaxTime = 0;//录制回放的总时间
36 this._isReady = false;//录制回放是否已经准备完成 36 this._isReady = false;//录制回放是否已经准备完成
37 - this.isLoadTxRecordInfo=false;//是否已经加载TXY的录制数据  
38 - this.isLoadAgoRecordInfo=false;//是否已经加载AGO的录制数据  
39 - this.isgetRecordFileURLFromAgo=false;//是否已经加载AGO的录制文件地址数据 37 + this.isLoadTxRecordInfo = false;//是否已经加载TXY的录制数据
  38 + this.isLoadAgoRecordInfo = false;//是否已经加载AGO的录制数据
  39 + this.isgetRecordFileURLFromAgo = false;//是否已经加载AGO的录制文件地址数据
40 40
41 this._apes = {}; 41 this._apes = {};
42 - this._videoApeBroadcastMssages={};//视频模块的广播消息  
43 - this.mediaChannleList={}; 42 + this._videoApeBroadcastMssages = {};//视频模块的广播消息
  43 + this.mediaChannleList = {};
44 this._conferApeMssages = {};//会议数据 44 this._conferApeMssages = {};//会议数据
45 this._chatApeMssages = {};//聊天数据 45 this._chatApeMssages = {};//聊天数据
46 this._videoApeMssages = {};//视频数据 46 this._videoApeMssages = {};//视频数据
47 this._audioApeMssages = {};//音频数据 47 this._audioApeMssages = {};//音频数据
48 this._docApeMssages = {};//文档数据 48 this._docApeMssages = {};//文档数据
49 this._whiteApeMssages = {};//白板数据 49 this._whiteApeMssages = {};//白板数据
50 - this._mediaShareApeMssages={};//媒体共享  
51 - this._musicShareApeMssages={};//伴音媒体共享 50 + this._mediaShareApeMssages = {};//媒体共享
  51 + this._musicShareApeMssages = {};//伴音媒体共享
52 this._timerCounter = new TimerCounter();//计时器 52 this._timerCounter = new TimerCounter();//计时器
53 this._timerCounter.addTimerCallBack(this._timerCounterUptate.bind(this), 1); 53 this._timerCounter.addTimerCallBack(this._timerCounterUptate.bind(this), 1);
54 54
55 - this.agoTiemstampMessages={};//ago推流时间戳消息数据集合  
56 - this.agoAllMedias={};//ago录制的文件集合 55 + this.agoTiemstampMessages = {};//ago推流时间戳消息数据集合
  56 + this.agoAllMedias = {};//ago录制的文件集合
57 57
58 - this.allStreams={};//记录课堂内所有的流id  
59 - this.recordInfoMatch=RecordInfoMatch;  
60 - this.recordInfoMatch.on(RecordInfoMatch.RECORD_INFO_MATCH_COMPLETE,this.onRecordInfoMatchComplete.bind(this)); 58 + this.allStreams = {};//记录课堂内所有的流id
  59 + this.recordInfoMatch = RecordInfoMatch;
  60 + this.recordInfoMatch.on(RecordInfoMatch.RECORD_INFO_MATCH_COMPLETE, this.onRecordInfoMatchComplete.bind(this));
61 } 61 }
62 62
63 //method--------------------内部--------------------------------------------- 63 //method--------------------内部---------------------------------------------
@@ -76,7 +76,7 @@ class RecordPlayBackParse extends Emiter { @@ -76,7 +76,7 @@ class RecordPlayBackParse extends Emiter {
76 this._chatApeMssages = {};//聊天数据 76 this._chatApeMssages = {};//聊天数据
77 this._videoApeMssages = {};//视频数据 77 this._videoApeMssages = {};//视频数据
78 this._audioApeMssages = {};//音频数据 78 this._audioApeMssages = {};//音频数据
79 - this.mediaChannleList={}; 79 + this.mediaChannleList = {};
80 this._docApeMssages = {};//文档数据 80 this._docApeMssages = {};//文档数据
81 this._whiteApeMssages = {};//白板数据 81 this._whiteApeMssages = {};//白板数据
82 } 82 }
@@ -195,12 +195,12 @@ class RecordPlayBackParse extends Emiter { @@ -195,12 +195,12 @@ class RecordPlayBackParse extends Emiter {
195 break; 195 break;
196 case ApeConsts.VIDEO_SESSION_ID: 196 case ApeConsts.VIDEO_SESSION_ID:
197 this.saveParseData(data, timestamp, this._videoApeMssages); 197 this.saveParseData(data, timestamp, this._videoApeMssages);
198 - this.unpackVideoBroadcastMessage(pduMsg,timestamp,data);  
199 - this.unPackpduRegAdapterHandler(pduMsg.data,timestamp,data,ApeConsts.VIDEO_SESSION_ID,pduMsg.subType) 198 + this.unpackVideoBroadcastMessage(pduMsg, timestamp, data);
  199 + this.unPackpduRegAdapterHandler(pduMsg.data, timestamp, data, ApeConsts.VIDEO_SESSION_ID, pduMsg.subType)
200 break; 200 break;
201 case ApeConsts.AUDIO_SESSION_ID: 201 case ApeConsts.AUDIO_SESSION_ID:
202 this.saveParseData(data, timestamp, this._audioApeMssages); 202 this.saveParseData(data, timestamp, this._audioApeMssages);
203 - this.unPackpduRegAdapterHandler(pduMsg.data,timestamp,data,ApeConsts.AUDIO_SESSION_ID,pduMsg.subType) 203 + this.unPackpduRegAdapterHandler(pduMsg.data, timestamp, data, ApeConsts.AUDIO_SESSION_ID, pduMsg.subType)
204 break; 204 break;
205 default: 205 default:
206 break; 206 break;
@@ -214,17 +214,17 @@ class RecordPlayBackParse extends Emiter { @@ -214,17 +214,17 @@ class RecordPlayBackParse extends Emiter {
214 } 214 }
215 215
216 //消息和录制文件匹配完成 216 //消息和录制文件匹配完成
217 - onRecordInfoMatchComplete(_data){  
218 - console.log("消息和录制文件匹配完成",_data);  
219 - if(_data){  
220 - for(let k in _data){ 217 + onRecordInfoMatchComplete(_data) {
  218 + console.log("消息和录制文件匹配完成", _data);
  219 + if (_data) {
  220 + for (let k in _data) {
221 //优先使用TXY的,没有的时候再使用AGO 221 //优先使用TXY的,没有的时候再使用AGO
222 /* if(! MediaModule.streams[k]){ 222 /* if(! MediaModule.streams[k]){
223 MediaModule.streams[k]=_data[k]; 223 MediaModule.streams[k]=_data[k];
224 }else { 224 }else {
225 console.log(k+" 已经存在",MediaModule.streams[k]); 225 console.log(k+" 已经存在",MediaModule.streams[k]);
226 }*/ 226 }*/
227 - MediaModule.streams[k]=_data[k]; 227 + MediaModule.streams[k] = _data[k];
228 228
229 } 229 }
230 } 230 }
@@ -232,6 +232,7 @@ class RecordPlayBackParse extends Emiter { @@ -232,6 +232,7 @@ class RecordPlayBackParse extends Emiter {
232 //解析课堂录制的rec文件 232 //解析课堂录制的rec文件
233 this.parseArrayBuf(); 233 this.parseArrayBuf();
234 } 234 }
  235 +
235 //保存各个模块的MCU原始数据 236 //保存各个模块的MCU原始数据
236 saveParseData(data, timestamp, apeMessages) { 237 saveParseData(data, timestamp, apeMessages) {
237 let messageItem = apeMessages[timestamp]; 238 let messageItem = apeMessages[timestamp];
@@ -271,14 +272,14 @@ class RecordPlayBackParse extends Emiter { @@ -271,14 +272,14 @@ class RecordPlayBackParse extends Emiter {
271 } 272 }
272 273
273 //各个APE模块根据时间查找消息数据 274 //各个APE模块根据时间查找消息数据
274 - this._searchMessageFromTime(this._recordPlaybackTimestamp, this._conferApeMssages,"conferApe");  
275 - this._searchMessageFromTime(this._recordPlaybackTimestamp, this._chatApeMssages,"chatApe");  
276 - this._searchMessageFromTime(this._recordPlaybackTimestamp, this._docApeMssages,"docApe");  
277 - this._searchMessageFromTime(this._recordPlaybackTimestamp, this._mediaShareApeMssages,"mediaShareApe");  
278 - this._searchMessageFromTime(this._recordPlaybackTimestamp, this._musicShareApeMssages,"musicShareApe");  
279 - this._searchMessageFromTime(this._recordPlaybackTimestamp, this._whiteApeMssages,"whiteApe");  
280 - this._searchMessageFromTime(this._recordPlaybackTimestamp, this._videoApeMssages,"videoAp");  
281 - this._searchMessageFromTime(this._recordPlaybackTimestamp, this._audioApeMssages,"audioApe"); 275 + this._searchMessageFromTime(this._recordPlaybackTimestamp, this._conferApeMssages, "conferApe");
  276 + this._searchMessageFromTime(this._recordPlaybackTimestamp, this._chatApeMssages, "chatApe");
  277 + this._searchMessageFromTime(this._recordPlaybackTimestamp, this._docApeMssages, "docApe");
  278 + this._searchMessageFromTime(this._recordPlaybackTimestamp, this._mediaShareApeMssages, "mediaShareApe");
  279 + this._searchMessageFromTime(this._recordPlaybackTimestamp, this._musicShareApeMssages, "musicShareApe");
  280 + this._searchMessageFromTime(this._recordPlaybackTimestamp, this._whiteApeMssages, "whiteApe");
  281 + this._searchMessageFromTime(this._recordPlaybackTimestamp, this._videoApeMssages, "videoAp");
  282 + this._searchMessageFromTime(this._recordPlaybackTimestamp, this._audioApeMssages, "audioApe");
282 } 283 }
283 284
284 //加载录制文件rec 285 //加载录制文件rec
@@ -287,11 +288,11 @@ class RecordPlayBackParse extends Emiter { @@ -287,11 +288,11 @@ class RecordPlayBackParse extends Emiter {
287 loger.log("读取录制回放数据"); 288 loger.log("读取录制回放数据");
288 //let url = `http://123.56.73.119:80/h5dev/20170306/1357644520_20170306.rec`; 289 //let url = `http://123.56.73.119:80/h5dev/20170306/1357644520_20170306.rec`;
289 //let url = `http://${ GlobalConfig.RecordServerIP}:${ GlobalConfig.RecordServerPort}/${GlobalConfig.recordFileName}`; 290 //let url = `http://${ GlobalConfig.RecordServerIP}:${ GlobalConfig.RecordServerPort}/${GlobalConfig.recordFileName}`;
290 - let ipport=GlobalConfig.RecordServerIP;//GlobalConfig.RecordServerPort  
291 - if(GlobalConfig.RecordServerPort){  
292 - ipport=ipport+":"+GlobalConfig.RecordServerPort; 291 + let ipport = GlobalConfig.RecordServerIP;//GlobalConfig.RecordServerPort
  292 + if (GlobalConfig.RecordServerPort) {
  293 + ipport = ipport + ":" + GlobalConfig.RecordServerPort;
293 } 294 }
294 - let url = `${GlobalConfig.locationProtocol+ ipport}/${GlobalConfig.recordFileName}`; 295 + let url = `${GlobalConfig.locationProtocol + ipport}/${GlobalConfig.recordFileName}`;
295 loger.log(url); 296 loger.log(url);
296 fetch(url, { 297 fetch(url, {
297 timeout: 240000 //加载文件超时时间4分 298 timeout: 240000 //加载文件超时时间4分
@@ -351,115 +352,118 @@ class RecordPlayBackParse extends Emiter { @@ -351,115 +352,118 @@ class RecordPlayBackParse extends Emiter {
351 this.parseArrayBuf(); 352 this.parseArrayBuf();
352 } 353 }
353 })*/ 354 })*/
354 - this.getMediaRecrodInfoFromTx(()=>{ 355 + this.getMediaRecrodInfoFromTx(()=> {
355 //AGO启动录制消息和文件匹配 356 //AGO启动录制消息和文件匹配
356 this.recordInfoMatch.start(); 357 this.recordInfoMatch.start();
357 }); 358 });
358 359
359 } 360 }
360 } 361 }
  362 +
361 //时间戳转换为UTC 时间字符串 363 //时间戳转换为UTC 时间字符串
362 - timestampToUTCTime(_timestamp){  
363 - let date=new Date(_timestamp);  
364 - let y=""+date.getFullYear();  
365 - let month=""+(date.getMonth()+1);  
366 - let d=""+date.getDate();  
367 - let h=""+(date.getHours()-8);//GMT 转UTC 减8  
368 - let minutes=""+date.getMinutes();  
369 - let s=""+date.getSeconds();  
370 - if (month.length<2){  
371 - month="0"+month;  
372 - }  
373 - if (d.length<2){  
374 - d="0"+d;  
375 - }  
376 - if (h.length<2){  
377 - h="0"+h;  
378 - }  
379 - if (minutes.length<2){  
380 - minutes="0"+minutes;  
381 - }  
382 - if (s.length<2){  
383 - s="0"+s;  
384 - }  
385 - let tiemStr=y+month+d+h+minutes+s; 364 + timestampToUTCTime(_timestamp) {
  365 + let date = new Date(_timestamp);
  366 + let y = "" + date.getFullYear();
  367 + let month = "" + (date.getMonth() + 1);
  368 + let d = "" + date.getDate();
  369 + let h = "" + (date.getHours() - 8);//GMT 转UTC 减8
  370 + let minutes = "" + date.getMinutes();
  371 + let s = "" + date.getSeconds();
  372 + if (month.length < 2) {
  373 + month = "0" + month;
  374 + }
  375 + if (d.length < 2) {
  376 + d = "0" + d;
  377 + }
  378 + if (h.length < 2) {
  379 + h = "0" + h;
  380 + }
  381 + if (minutes.length < 2) {
  382 + minutes = "0" + minutes;
  383 + }
  384 + if (s.length < 2) {
  385 + s = "0" + s;
  386 + }
  387 + let tiemStr = y + month + d + h + minutes + s;
386 //console.log(_timestamp,tiemStr,date); 388 //console.log(_timestamp,tiemStr,date);
387 return tiemStr 389 return tiemStr
388 } 390 }
  391 +
389 //匹配时间戳和录制的视频地址 392 //匹配时间戳和录制的视频地址
390 - matchingVideoUrlFromTime(_tiemstampMessages,_allMedias){  
391 - if(!_tiemstampMessages||!_allMedias){  
392 - console.log("没有数据无法解析匹配",_tiemstampMessages,_allMedias) 393 + matchingVideoUrlFromTime(_tiemstampMessages, _allMedias) {
  394 + if (!_tiemstampMessages || !_allMedias) {
  395 + console.log("没有数据无法解析匹配", _tiemstampMessages, _allMedias)
393 return; 396 return;
394 } 397 }
395 - if(Object.keys(_tiemstampMessages).length<1||Object.keys(_allMedias).length<1){ 398 + if (Object.keys(_tiemstampMessages).length < 1 || Object.keys(_allMedias).length < 1) {
396 console.log("数据没有加载完成->不做匹配"); 399 console.log("数据没有加载完成->不做匹配");
397 return; 400 return;
398 - }; 401 + }
  402 + ;
399 403
400 - let finelMediaInfo={};  
401 - let unknowFiles={};//记录没有匹配到的,需要再次匹配 404 + let finelMediaInfo = {};
  405 + let unknowFiles = {};//记录没有匹配到的,需要再次匹配
402 let tItem; 406 let tItem;
403 - for(let j in _tiemstampMessages){  
404 - tItem=_tiemstampMessages[j];  
405 - let videoUrl="";  
406 - if(_allMedias[tItem.uid+"_"+tItem.createTimeUTC]){  
407 - videoUrl=_allMedias[tItem.uid+"_"+tItem.createTimeUTC]; 407 + for (let j in _tiemstampMessages) {
  408 + tItem = _tiemstampMessages[j];
  409 + let videoUrl = "";
  410 + if (_allMedias[tItem.uid + "_" + tItem.createTimeUTC]) {
  411 + videoUrl = _allMedias[tItem.uid + "_" + tItem.createTimeUTC];
408 //console.log(tItem.uid+"_"+tItem.createTimeUTC,videoUrl); 412 //console.log(tItem.uid+"_"+tItem.createTimeUTC,videoUrl);
409 - }else {  
410 - let t=parseInt(tItem.createTimeUTC);  
411 - console.log(tItem.uid+"_"+t,"没有数据->查找最近的数据");  
412 - videoUrl=_allMedias[tItem.uid+"_"+(t-1)];  
413 - if(!videoUrl){  
414 - videoUrl=_allMedias[tItem.uid+"_"+(t+1)]; 413 + } else {
  414 + let t = parseInt(tItem.createTimeUTC);
  415 + console.log(tItem.uid + "_" + t, "没有数据->查找最近的数据");
  416 + videoUrl = _allMedias[tItem.uid + "_" + (t - 1)];
  417 + if (!videoUrl) {
  418 + videoUrl = _allMedias[tItem.uid + "_" + (t + 1)];
415 } 419 }
416 - if(!videoUrl){  
417 - unknowFiles[tItem.timestamp]=tItem; 420 + if (!videoUrl) {
  421 + unknowFiles[tItem.timestamp] = tItem;
418 } 422 }
419 } 423 }
420 //console.log(tItem.uid+"_"+t+" "+videoUrl); 424 //console.log(tItem.uid+"_"+t+" "+videoUrl);
421 - tItem.video_url=videoUrl;  
422 - finelMediaInfo[tItem.timestamp]=tItem; 425 + tItem.video_url = videoUrl;
  426 + finelMediaInfo[tItem.timestamp] = tItem;
423 // MediaModule.streams[tItem.stream_id]=tItem.video_url; 427 // MediaModule.streams[tItem.stream_id]=tItem.video_url;
424 - MediaModule.streams[tItem.stream_id]={video_url:tItem.video_url,seek:0}; 428 + MediaModule.streams[tItem.stream_id] = {video_url: tItem.video_url, seek: 0};
425 } 429 }
426 - console.log("finelMediaInfo",finelMediaInfo); 430 + console.log("finelMediaInfo", finelMediaInfo);
427 431
428 //最后处理没有匹配到的 432 //最后处理没有匹配到的
429 //检测没有匹配到数据的消息 433 //检测没有匹配到数据的消息
430 - for(let i in unknowFiles){  
431 - let noItem=unknowFiles[i];  
432 - for(let k in finelMediaInfo){  
433 - let okItem=finelMediaInfo[k];  
434 - let seek=(parseInt(noItem.timestamp)-parseInt(okItem.timestamp))/1000; 434 + for (let i in unknowFiles) {
  435 + let noItem = unknowFiles[i];
  436 + for (let k in finelMediaInfo) {
  437 + let okItem = finelMediaInfo[k];
  438 + let seek = (parseInt(noItem.timestamp) - parseInt(okItem.timestamp)) / 1000;
435 //console.log("seek",seek); 439 //console.log("seek",seek);
436 - if(noItem.uid==okItem.uid&&seek<15&&noItem.timestamp!=okItem.timestamp){ 440 + if (noItem.uid == okItem.uid && seek < 15 && noItem.timestamp != okItem.timestamp) {
437 //console.log(noItem,okItem); 441 //console.log(noItem,okItem);
438 - noItem.video_url=okItem.video_url;  
439 - noItem.seek=seek;  
440 - finelMediaInfo [noItem.timestamp]=noItem; 442 + noItem.video_url = okItem.video_url;
  443 + noItem.seek = seek;
  444 + finelMediaInfo [noItem.timestamp] = noItem;
441 //MediaModule.streams[noItem.stream_id]=noItem.video_url; 445 //MediaModule.streams[noItem.stream_id]=noItem.video_url;
442 - console.log("根据时间戳查找流",noItem.stream_id,{video_url:noItem.video_url,seek:seek})  
443 - MediaModule.streams[noItem.stream_id]={video_url:noItem.video_url,seek:seek}; 446 + console.log("根据时间戳查找流", noItem.stream_id, {video_url: noItem.video_url, seek: seek})
  447 + MediaModule.streams[noItem.stream_id] = {video_url: noItem.video_url, seek: seek};
444 } 448 }
445 } 449 }
446 } 450 }
447 - console.log("服务端所有m3u8文件",_allMedias);  
448 - console.log("所有推流消息",_tiemstampMessages);  
449 - console.log("最终匹配结束的文件",finelMediaInfo);  
450 - console.log("回放中最终使用的视频流数据",MediaModule.streams); 451 + console.log("服务端所有m3u8文件", _allMedias);
  452 + console.log("所有推流消息", _tiemstampMessages);
  453 + console.log("最终匹配结束的文件", finelMediaInfo);
  454 + console.log("回放中最终使用的视频流数据", MediaModule.streams);
451 } 455 }
452 456
453 //获取媒体录制的地址信息-时间戳流名称和文件地址对应 457 //获取媒体录制的地址信息-时间戳流名称和文件地址对应
454 - getRecordFileURLFromAgo(_callback){  
455 - if(!GlobalConfig.getRecordFileURLAgoInterfaces){ 458 + getRecordFileURLFromAgo(_callback) {
  459 + if (!GlobalConfig.getRecordFileURLAgoInterfaces) {
456 loger.log("AGOR-获取媒体录制信息->失败->接口地址无效"); 460 loger.log("AGOR-获取媒体录制信息->失败->接口地址无效");
457 - if(_callback){ 461 + if (_callback) {
458 _callback(); 462 _callback();
459 } 463 }
460 - return ; 464 + return;
461 } 465 }
462 - let url = `${GlobalConfig.locationProtocol+GlobalConfig.getRecordFileURLAgoInterfaces}`; 466 + let url = `${GlobalConfig.locationProtocol + GlobalConfig.getRecordFileURLAgoInterfaces}`;
463 loger.log('AGOR-获取媒体录制信息.', url); 467 loger.log('AGOR-获取媒体录制信息.', url);
464 //接口中用的是GET 468 //接口中用的是GET
465 fetch(encodeURI(url), { 469 fetch(encodeURI(url), {
@@ -475,7 +479,7 @@ class RecordPlayBackParse extends Emiter { @@ -475,7 +479,7 @@ class RecordPlayBackParse extends Emiter {
475 return ret.json(); 479 return ret.json();
476 } else { 480 } else {
477 loger.error(`AGOR-获取媒体录制信息-网络异常.状态码:${ret}`); 481 loger.error(`AGOR-获取媒体录制信息-网络异常.状态码:${ret}`);
478 - if(_callback){ 482 + if (_callback) {
479 _callback(); 483 _callback();
480 } 484 }
481 throw ''; 485 throw '';
@@ -491,34 +495,35 @@ class RecordPlayBackParse extends Emiter { @@ -491,34 +495,35 @@ class RecordPlayBackParse extends Emiter {
491 fschannefiles:[] 495 fschannefiles:[]
492 } 496 }
493 } }*/ 497 } }*/
494 - if(ret&&ret.code==200){  
495 - if(ret.returnData&&ret.returnData.data){ 498 + if (ret && ret.code == 200) {
  499 + if (ret.returnData && ret.returnData.data) {
496 this.parseAndSavaStreamInfoFromAgor(ret.returnData.data); 500 this.parseAndSavaStreamInfoFromAgor(ret.returnData.data);
497 } 501 }
498 } 502 }
499 - if(_callback){ 503 + if (_callback) {
500 _callback(); 504 _callback();
501 } 505 }
502 }) 506 })
503 .catch(err => { 507 .catch(err => {
504 loger.error(`AGOR-获取媒体录制信息-异常.状态码:${err}`); 508 loger.error(`AGOR-获取媒体录制信息-异常.状态码:${err}`);
505 - if(_callback){ 509 + if (_callback) {
506 _callback(); 510 _callback();
507 } 511 }
508 }); 512 });
509 } 513 }
  514 +
510 //获取媒体录制信息 515 //获取媒体录制信息
511 - getMediaRecrodInfoFromAgora(_callback){ 516 + getMediaRecrodInfoFromAgora(_callback) {
512 //获取课堂录制信息 get localhost:3000/recordInfo/getRecordInfo/7d72365eb9834353397e3e3f9d460bdda 517 //获取课堂录制信息 get localhost:3000/recordInfo/getRecordInfo/7d72365eb9834353397e3e3f9d460bdda
513 //localhost:3000/recordInfo/getRecordInfo/ 后面直接添加课堂号 channel 518 //localhost:3000/recordInfo/getRecordInfo/ 后面直接添加课堂号 channel
514 - if(!GlobalConfig.getRecordInfoInterfaces){ 519 + if (!GlobalConfig.getRecordInfoInterfaces) {
515 loger.log("AG-获取媒体录制信息->失败->接口地址无效"); 520 loger.log("AG-获取媒体录制信息->失败->接口地址无效");
516 - if(_callback){ 521 + if (_callback) {
517 _callback(); 522 _callback();
518 } 523 }
519 - return ; 524 + return;
520 } 525 }
521 - let url = `${GlobalConfig.locationProtocol+GlobalConfig.getRecordInfoInterfaces}/${GlobalConfig.channelId}`; 526 + let url = `${GlobalConfig.locationProtocol + GlobalConfig.getRecordInfoInterfaces}/${GlobalConfig.channelId}`;
522 loger.log('AG-获取媒体录制信息.', url); 527 loger.log('AG-获取媒体录制信息.', url);
523 fetch(url, { 528 fetch(url, {
524 timeout: 15000 529 timeout: 15000
@@ -528,7 +533,7 @@ class RecordPlayBackParse extends Emiter { @@ -528,7 +533,7 @@ class RecordPlayBackParse extends Emiter {
528 return ret.json(); 533 return ret.json();
529 } else { 534 } else {
530 loger.error(`AG-获取媒体录制信息-网络异常.状态码:${ret}`); 535 loger.error(`AG-获取媒体录制信息-网络异常.状态码:${ret}`);
531 - if(_callback){ 536 + if (_callback) {
532 _callback(); 537 _callback();
533 } 538 }
534 throw ''; 539 throw '';
@@ -537,41 +542,42 @@ class RecordPlayBackParse extends Emiter { @@ -537,41 +542,42 @@ class RecordPlayBackParse extends Emiter {
537 .then(ret => { 542 .then(ret => {
538 loger.log('AG-获取媒体录制信息-完成'); 543 loger.log('AG-获取媒体录制信息-完成');
539 //console.log("getRecordInfo success",ret); 544 //console.log("getRecordInfo success",ret);
540 - if(ret&&ret.returnData&&ret.returnData.data){  
541 - let dataArr=ret.returnData.data;  
542 - for (let i=0;i<dataArr.length;i++){  
543 - let item=dataArr[i];  
544 - if(item.status==1){ 545 + if (ret && ret.returnData && ret.returnData.data) {
  546 + let dataArr = ret.returnData.data;
  547 + for (let i = 0; i < dataArr.length; i++) {
  548 + let item = dataArr[i];
  549 + if (item.status == 1) {
545 //console.log(JSON.stringify(item)); 550 //console.log(JSON.stringify(item));
546 - let time=parseInt(item.createTime);  
547 - item.createTimeUTC=this.timestampToUTCTime(time);  
548 - item.stream_id=item.channel+"_"+item.userId+"_"+item.timestamp;  
549 - this.agoTiemstampMessages[item.timestamp]=item; 551 + let time = parseInt(item.createTime);
  552 + item.createTimeUTC = this.timestampToUTCTime(time);
  553 + item.stream_id = item.channel + "_" + item.userId + "_" + item.timestamp;
  554 + this.agoTiemstampMessages[item.timestamp] = item;
550 } 555 }
551 } 556 }
552 } 557 }
553 console.log("agoTiemstampMessages", this.agoTiemstampMessages); 558 console.log("agoTiemstampMessages", this.agoTiemstampMessages);
554 - if(_callback){ 559 + if (_callback) {
555 _callback(); 560 _callback();
556 } 561 }
557 }) 562 })
558 .catch(err => { 563 .catch(err => {
559 loger.error(`AG-获取媒体录制信息-异常.状态码:${err}`); 564 loger.error(`AG-获取媒体录制信息-异常.状态码:${err}`);
560 - if(_callback){ 565 + if (_callback) {
561 _callback(); 566 _callback();
562 } 567 }
563 }); 568 });
564 } 569 }
  570 +
565 //获取媒体录制信息 571 //获取媒体录制信息
566 - getMediaRecrodInfoFromTx(_callback){  
567 - if(!GlobalConfig.getTxRecordInfoInterfaces){ 572 + getMediaRecrodInfoFromTx(_callback) {
  573 + if (!GlobalConfig.getTxRecordInfoInterfaces) {
568 loger.log("TX-获取媒体录制信息->失败->接口地址无效"); 574 loger.log("TX-获取媒体录制信息->失败->接口地址无效");
569 - if(_callback){ 575 + if (_callback) {
570 _callback(); 576 _callback();
571 } 577 }
572 - return ; 578 + return;
573 } 579 }
574 - let url = `${GlobalConfig.locationProtocol+GlobalConfig.getTxRecordInfoInterfaces}`; 580 + let url = `${GlobalConfig.locationProtocol + GlobalConfig.getTxRecordInfoInterfaces}`;
575 loger.log('TX-获取媒体录制信息.', url); 581 loger.log('TX-获取媒体录制信息.', url);
576 //接口中用的是GET 582 //接口中用的是GET
577 fetch(encodeURI(url), { 583 fetch(encodeURI(url), {
@@ -587,7 +593,7 @@ class RecordPlayBackParse extends Emiter { @@ -587,7 +593,7 @@ class RecordPlayBackParse extends Emiter {
587 return ret.json(); 593 return ret.json();
588 } else { 594 } else {
589 loger.error(`TX-获取媒体录制信息-网络异常.状态码:${ret}`); 595 loger.error(`TX-获取媒体录制信息-网络异常.状态码:${ret}`);
590 - if(_callback){ 596 + if (_callback) {
591 _callback(); 597 _callback();
592 } 598 }
593 throw ''; 599 throw '';
@@ -606,24 +612,25 @@ class RecordPlayBackParse extends Emiter { @@ -606,24 +612,25 @@ class RecordPlayBackParse extends Emiter {
606 }] 612 }]
607 } 613 }
608 }*/ 614 }*/
609 - if(ret&&ret.code==200){  
610 - if(ret.returnData&&ret.returnData.data){ 615 + if (ret && ret.code == 200) {
  616 + if (ret.returnData && ret.returnData.data) {
611 this.parseAndSavaStreamInfoFromTx(ret.returnData.data); 617 this.parseAndSavaStreamInfoFromTx(ret.returnData.data);
612 } 618 }
613 } 619 }
614 - if(_callback){ 620 + if (_callback) {
615 _callback(); 621 _callback();
616 } 622 }
617 }) 623 })
618 .catch(err => { 624 .catch(err => {
619 loger.error(`获取媒体录制信息-异常.状态码:${err}`); 625 loger.error(`获取媒体录制信息-异常.状态码:${err}`);
620 - if(_callback){ 626 + if (_callback) {
621 _callback(); 627 _callback();
622 } 628 }
623 }); 629 });
624 } 630 }
  631 +
625 //解析agor录制的视频数据,数组[] 632 //解析agor录制的视频数据,数组[]
626 - parseAndSavaStreamInfoFromAgor(_data){ 633 + parseAndSavaStreamInfoFromAgor(_data) {
627 //backFile:[ 634 //backFile:[
628 // { 635 // {
629 // "channel": "markettest_628050539", 636 // "channel": "markettest_628050539",
@@ -636,7 +643,7 @@ class RecordPlayBackParse extends Emiter { @@ -636,7 +643,7 @@ class RecordPlayBackParse extends Emiter {
636 // ],//根据时间戳匹配好的播放地址 643 // ],//根据时间戳匹配好的播放地址
637 //fschannefiles:"http://networkschool.xuedianyun.com:8899/20171021/markettest_628050539_053439",//文件目录地址 644 //fschannefiles:"http://networkschool.xuedianyun.com:8899/20171021/markettest_628050539_053439",//文件目录地址
638 //fschannefiles:[] //文件列表 645 //fschannefiles:[] //文件列表
639 - if(!_data){ 646 + if (!_data) {
640 loger.log("AGOR-外部录制的视频数据无效"); 647 loger.log("AGOR-外部录制的视频数据无效");
641 return; 648 return;
642 } 649 }
@@ -662,57 +669,57 @@ class RecordPlayBackParse extends Emiter { @@ -662,57 +669,57 @@ class RecordPlayBackParse extends Emiter {
662 } 669 }
663 } 670 }
664 console.log("AGO MediaModule.streams", MediaModule.streams);*/ 671 console.log("AGO MediaModule.streams", MediaModule.streams);*/
665 - if(!_data.fschannefiles) return;  
666 - let items=_data.fschannefiles; 672 + if (!_data.fschannefiles) return;
  673 + let items = _data.fschannefiles;
667 //console.log(JSON.stringify(items)); 674 //console.log(JSON.stringify(items));
668 - for(let k=0;k<items.length;k++) { 675 + for (let k = 0; k < items.length; k++) {
669 676
670 - let item=items[k]; 677 + let item = items[k];
671 // if(item.indexOf(".aac")>=0||item.indexOf(".webm")>=0){ 678 // if(item.indexOf(".aac")>=0||item.indexOf(".webm")>=0){
672 // console.log(item) 679 // console.log(item)
673 // } 680 // }
674 //console.log("item.indexOf ts",item.indexOf(".ts")) 681 //console.log("item.indexOf ts",item.indexOf(".ts"))
675 // if(item.indexOf(".m3u8")>=0&&item.indexOf(".ts")<0&&item.indexOf(".m3u8.swp")<0){ 682 // if(item.indexOf(".m3u8")>=0&&item.indexOf(".ts")<0&&item.indexOf(".m3u8.swp")<0){
676 - let indexStr=".m3u8";  
677 - if(item.lastIndexOf(indexStr)+indexStr.length==item.length){ 683 + let indexStr = ".m3u8";
  684 + if (item.lastIndexOf(indexStr) + indexStr.length == item.length) {
678 //http://networkschool.xuedianyun.com:8899/20171021/markettest_188409305_030739/555257911_20171021031224730.mp4 685 //http://networkschool.xuedianyun.com:8899/20171021/markettest_188409305_030739/555257911_20171021031224730.mp4
679 //http://networkschool.xuedianyun.com:8899/20171021/markettest_1785982263_080003/572805001_20171021080041402_av.m3u8 686 //http://networkschool.xuedianyun.com:8899/20171021/markettest_1785982263_080003/572805001_20171021080041402_av.m3u8
680 - let itemUrl=_data.channefiles+"/"+item; 687 + let itemUrl = _data.channefiles + "/" + item;
681 //console.log(item,itemUrl); 688 //console.log(item,itemUrl);
682 - item=item.substr(0,item.length-11);  
683 - this.agoAllMedias[item]=itemUrl; 689 + item = item.substr(0, item.length - 11);
  690 + this.agoAllMedias[item] = itemUrl;
684 } 691 }
685 692
686 } 693 }
687 - console.log("agoAllMedias",this.agoAllMedias); 694 + console.log("agoAllMedias", this.agoAllMedias);
688 } 695 }
689 696
690 //解析TXY录制的视频数据,数组[] 697 //解析TXY录制的视频数据,数组[]
691 - parseAndSavaStreamInfoFromTx(_dataArr){ 698 + parseAndSavaStreamInfoFromTx(_dataArr) {
692 /* "id": "0zo9GALQdmkwrJVYxqgaE6xM7j8yvOZN", 699 /* "id": "0zo9GALQdmkwrJVYxqgaE6xM7j8yvOZN",
693 "channelId": "marketflashtest_1966232762", 700 "channelId": "marketflashtest_1966232762",
694 "recordInfo":"xxxxx", 701 "recordInfo":"xxxxx",
695 "createTime":"xxxx"*/ 702 "createTime":"xxxx"*/
696 - if(!_dataArr){ 703 + if (!_dataArr) {
697 loger.log("TX-外部录制的视频数据无效"); 704 loger.log("TX-外部录制的视频数据无效");
698 return; 705 return;
699 } 706 }
700 let item; 707 let item;
701 let itemJson; 708 let itemJson;
702 - loger.log("TX-外部录制的视频数据-length="+_dataArr.length)  
703 - for(let i=0;i<_dataArr.length;i++){  
704 - item=_dataArr[i];  
705 - if(item){  
706 - itemJson=item.recordInfo;  
707 - try{  
708 - itemJson=JSON.parse(itemJson);  
709 - }catch (err){  
710 -  
711 - }  
712 - if(itemJson&&itemJson.video_url){  
713 - if(itemJson.video_url.indexOf(".m3u8")>0){ 709 + loger.log("TX-外部录制的视频数据-length=" + _dataArr.length)
  710 + for (let i = 0; i < _dataArr.length; i++) {
  711 + item = _dataArr[i];
  712 + if (item) {
  713 + itemJson = item.recordInfo;
  714 + try {
  715 + itemJson = JSON.parse(itemJson);
  716 + } catch (err) {
  717 +
  718 + }
  719 + if (itemJson && itemJson.video_url) {
  720 + if (itemJson.video_url.indexOf(".m3u8") > 0) {
714 //MediaModule.streams[itemJson.stream_id]=itemJson.video_url; 721 //MediaModule.streams[itemJson.stream_id]=itemJson.video_url;
715 - MediaModule.streams[itemJson.stream_id]={video_url:itemJson.video_url,seek:0}; 722 + MediaModule.streams[itemJson.stream_id] = {video_url: itemJson.video_url, seek: 0};
716 } 723 }
717 } 724 }
718 } 725 }
@@ -748,38 +755,39 @@ class RecordPlayBackParse extends Emiter { @@ -748,38 +755,39 @@ class RecordPlayBackParse extends Emiter {
748 /*if(this._recordPlaybackMaxTime<GlobalConfig.classTimestamp){ 755 /*if(this._recordPlaybackMaxTime<GlobalConfig.classTimestamp){
749 this._recordPlaybackMaxTime=GlobalConfig.classTimestamp; 756 this._recordPlaybackMaxTime=GlobalConfig.classTimestamp;
750 }*/ 757 }*/
751 - if(this._recordPlaybackMaxTime<GlobalConfig.recordTimestamp){  
752 - this._recordPlaybackMaxTime=GlobalConfig.recordTimestamp; 758 + if (this._recordPlaybackMaxTime < GlobalConfig.recordTimestamp) {
  759 + this._recordPlaybackMaxTime = GlobalConfig.recordTimestamp;
753 } 760 }
754 761
755 GlobalConfig.recordPlaybackMaxTime = this._recordPlaybackMaxTime; 762 GlobalConfig.recordPlaybackMaxTime = this._recordPlaybackMaxTime;
756 - console.log('课堂模块',this._conferApeMssages);  
757 - console.log('音视频通话模块数据',this.mediaChannleList);  
758 - console.log('媒体共享模块数据',this._mediaShareApeMssages);  
759 - console.log('伴音模块数据',this._musicShareApeMssages);  
760 - console.log('视频数据',this._videoApeMssages);  
761 - console.log('音频数据',this._audioApeMssages);  
762 - console.log('文档数据',this._docApeMssages);  
763 - console.log('白板数据',this._whiteApeMssages);  
764 - console.log('聊天数据',this._chatApeMssages);  
765 - console.log('视频模块广播消息',this._videoApeBroadcastMssages);  
766 - loger.log("录制回放数据解析完成,录制回放的总时间长为->", this._recordPlaybackMaxTime,"recordTimestamp:"+GlobalConfig.recordTimestamp); 763 + console.log('课堂模块', this._conferApeMssages);
  764 + console.log('音视频通话模块数据', this.mediaChannleList);
  765 + console.log('媒体共享模块数据', this._mediaShareApeMssages);
  766 + console.log('伴音模块数据', this._musicShareApeMssages);
  767 + console.log('视频数据', this._videoApeMssages);
  768 + console.log('音频数据', this._audioApeMssages);
  769 + console.log('文档数据', this._docApeMssages);
  770 + console.log('白板数据', this._whiteApeMssages);
  771 + console.log('聊天数据', this._chatApeMssages);
  772 + console.log('视频模块广播消息', this._videoApeBroadcastMssages);
  773 + loger.log("录制回放数据解析完成,录制回放的总时间长为->", this._recordPlaybackMaxTime, "recordTimestamp:" + GlobalConfig.recordTimestamp);
767 this._emit(RecordPlayBackParse.CLASS_JOIN_RECORD_PLAYBACK_SUCCESS, {"recordPlaybackMaxTime": this._recordPlaybackMaxTime}); 774 this._emit(RecordPlayBackParse.CLASS_JOIN_RECORD_PLAYBACK_SUCCESS, {"recordPlaybackMaxTime": this._recordPlaybackMaxTime});
768 } 775 }
769 776
770 //根据时间查找数据 777 //根据时间查找数据
771 - _searchMessageFromTime(_timestamp, _apeMessages,_ape) { 778 + _searchMessageFromTime(_timestamp, _apeMessages, _ape) {
772 let msgDataArr = _apeMessages[_timestamp]; 779 let msgDataArr = _apeMessages[_timestamp];
773 if (!msgDataArr) { 780 if (!msgDataArr) {
774 //没有数据,需要查找当前时间点属于哪一个时间戳关键帧 781 //没有数据,需要查找当前时间点属于哪一个时间戳关键帧
775 } else { 782 } else {
776 //把时间点对应的数据发送,同一秒内有存在多个数据的情况 783 //把时间点对应的数据发送,同一秒内有存在多个数据的情况
777 - loger.log(_ape,"回放数据->length:",msgDataArr.length) 784 + loger.log(_ape, "回放数据->length:", msgDataArr.length)
778 for (let i = 0; i < msgDataArr.length; i++) { 785 for (let i = 0; i < msgDataArr.length; i++) {
779 this._everSocketMsgReceivedHandler(msgDataArr[i].byteData, 0); 786 this._everSocketMsgReceivedHandler(msgDataArr[i].byteData, 0);
780 } 787 }
781 } 788 }
782 } 789 }
  790 +
783 //method------------外部接口------------------------------------- 791 //method------------外部接口-------------------------------------
784 792
785 //开始播放 793 //开始播放
@@ -787,13 +795,13 @@ class RecordPlayBackParse extends Emiter { @@ -787,13 +795,13 @@ class RecordPlayBackParse extends Emiter {
787 if (!this._isReady) { 795 if (!this._isReady) {
788 return {"code": ApeConsts.RETURN_FAILED, "data": "录制回放还未准备完成"}; 796 return {"code": ApeConsts.RETURN_FAILED, "data": "录制回放还未准备完成"};
789 } 797 }
790 - loger.log("classStatusInfo",GlobalConfig.classStatusInfo);  
791 - console.log("所有流ID",this.allStreams);  
792 - for(let i in this.allStreams){  
793 - if(MediaModule.streams[i]){  
794 - console.log("匹配成功的流:"+i,MediaModule.streams[i]);  
795 - }else {  
796 - console.warn("未匹配成功的流:"+i); 798 + loger.log("classStatusInfo", GlobalConfig.classStatusInfo);
  799 + console.log("所有流ID", this.allStreams);
  800 + for (let i in this.allStreams) {
  801 + if (MediaModule.streams[i]) {
  802 + console.log("匹配成功的流:" + i, MediaModule.streams[i]);
  803 + } else {
  804 + console.warn("未匹配成功的流:" + i);
797 } 805 }
798 } 806 }
799 this._startTimerCounter(); 807 this._startTimerCounter();
@@ -805,8 +813,8 @@ class RecordPlayBackParse extends Emiter { @@ -805,8 +813,8 @@ class RecordPlayBackParse extends Emiter {
805 this._stopTimerCounter(); 813 this._stopTimerCounter();
806 this._recordPlaybackTimestamp = 0; 814 this._recordPlaybackTimestamp = 0;
807 //把记录的文档信息也要清除 815 //把记录的文档信息也要清除
808 - GlobalConfig.activeDocId=0;  
809 - GlobalConfig.activeDocCurPage=1; 816 + GlobalConfig.activeDocId = 0;
  817 + GlobalConfig.activeDocCurPage = 1;
810 this._emit(RecordPlayBackParse.RECORD_PLAYBACK_CLEAR_DATA); 818 this._emit(RecordPlayBackParse.RECORD_PLAYBACK_CLEAR_DATA);
811 this._emit(MessageTypes.RECORD_PLAYBACK_UPDATE, {"status": STOP}); 819 this._emit(MessageTypes.RECORD_PLAYBACK_UPDATE, {"status": STOP});
812 } 820 }
@@ -829,8 +837,8 @@ class RecordPlayBackParse extends Emiter { @@ -829,8 +837,8 @@ class RecordPlayBackParse extends Emiter {
829 this._stopTimerCounter(); 837 this._stopTimerCounter();
830 this._recordPlaybackTimestamp = _param.time || 0; 838 this._recordPlaybackTimestamp = _param.time || 0;
831 //把记录的文档信息也要清除 839 //把记录的文档信息也要清除
832 - GlobalConfig.activeDocId=0;  
833 - GlobalConfig.activeDocCurPage=1; 840 + GlobalConfig.activeDocId = 0;
  841 + GlobalConfig.activeDocCurPage = 1;
834 this._emit(RecordPlayBackParse.RECORD_PLAYBACK_CLEAR_DATA); 842 this._emit(RecordPlayBackParse.RECORD_PLAYBACK_CLEAR_DATA);
835 //各个ape模块查找关键帧数据 843 //各个ape模块查找关键帧数据
836 this._searchSeekKeyfram(); 844 this._searchSeekKeyfram();
@@ -862,14 +870,13 @@ class RecordPlayBackParse extends Emiter { @@ -862,14 +870,13 @@ class RecordPlayBackParse extends Emiter {
862 this._searchWhiteboradHistoryMessageKeyfram(this._whiteApeMssages, ApeConsts.WHITEBOARD_SESSION_ID); 870 this._searchWhiteboradHistoryMessageKeyfram(this._whiteApeMssages, ApeConsts.WHITEBOARD_SESSION_ID);
863 871
864 872
865 -  
866 //各个ape模块无论有没有找到关键帧数据,都继续播放 873 //各个ape模块无论有没有找到关键帧数据,都继续播放
867 this._startTimerCounter(); 874 this._startTimerCounter();
868 } 875 }
869 876
870 //查找ape关键帧数据 877 //查找ape关键帧数据
871 _searchApeMessageKeyfram(_apeMessages, _apeId) { 878 _searchApeMessageKeyfram(_apeMessages, _apeId) {
872 - if(!_apeMessages){ 879 + if (!_apeMessages) {
873 return; 880 return;
874 } 881 }
875 let messageItem; 882 let messageItem;
@@ -896,12 +903,12 @@ class RecordPlayBackParse extends Emiter { @@ -896,12 +903,12 @@ class RecordPlayBackParse extends Emiter {
896 } 903 }
897 904
898 //音视频模块seek的时候,查找当前seek点的关键帧数据,所有频道的数据都需要查一下,否则多路视频的时候会显示不全 905 //音视频模块seek的时候,查找当前seek点的关键帧数据,所有频道的数据都需要查一下,否则多路视频的时候会显示不全
899 - searchMediaApeMessageKeyfram(_apeMessages){  
900 - if(!_apeMessages){ 906 + searchMediaApeMessageKeyfram(_apeMessages) {
  907 + if (!_apeMessages) {
901 return; 908 return;
902 } 909 }
903 - console.log('SEEK->查找音视频模块数据',_apeMessages)  
904 - if(_apeMessages) { 910 + console.log('SEEK->查找音视频模块数据', _apeMessages)
  911 + if (_apeMessages) {
905 for (let k in _apeMessages) { 912 for (let k in _apeMessages) {
906 let channelInfos = _apeMessages[k]; 913 let channelInfos = _apeMessages[k];
907 let messageItem; 914 let messageItem;
@@ -910,18 +917,19 @@ class RecordPlayBackParse extends Emiter { @@ -910,18 +917,19 @@ class RecordPlayBackParse extends Emiter {
910 messageItem = channelInfos[i]; 917 messageItem = channelInfos[i];
911 if (messageItem) { 918 if (messageItem) {
912 keyFrameSeekTime = (this._recordPlaybackTimestamp - i); 919 keyFrameSeekTime = (this._recordPlaybackTimestamp - i);
913 - loger.log("频道:"+k+"->SEEK->查找音视频模块数据->",messageItem,'keyFrameSeekTime->',keyFrameSeekTime) 920 + loger.log("频道:" + k + "->SEEK->查找音视频模块数据->", messageItem, 'keyFrameSeekTime->', keyFrameSeekTime)
914 this._everSocketMsgReceivedHandler(messageItem.byteData, keyFrameSeekTime); 921 this._everSocketMsgReceivedHandler(messageItem.byteData, keyFrameSeekTime);
915 break; 922 break;
916 } 923 }
917 } 924 }
918 - loger.log("频道:"+k+"—>没有查找到数据") 925 + loger.log("频道:" + k + "—>没有查找到数据")
919 } 926 }
920 } 927 }
921 } 928 }
  929 +
922 //媒体共享模块查找关键帧时间戳的消息 930 //媒体共享模块查找关键帧时间戳的消息
923 - searchMediaShareApeMessageKeyfram(_apeMessages){  
924 - if(!_apeMessages){ 931 + searchMediaShareApeMessageKeyfram(_apeMessages) {
  932 + if (!_apeMessages) {
925 return; 933 return;
926 } 934 }
927 let messageItem; 935 let messageItem;
@@ -930,7 +938,7 @@ class RecordPlayBackParse extends Emiter { @@ -930,7 +938,7 @@ class RecordPlayBackParse extends Emiter {
930 messageItem = _apeMessages[i]; 938 messageItem = _apeMessages[i];
931 if (messageItem) { 939 if (messageItem) {
932 keyFrameSeekTime = (this._recordPlaybackTimestamp - i) 940 keyFrameSeekTime = (this._recordPlaybackTimestamp - i)
933 - loger.log("SEEK->APE",'媒体共享',this._recordPlaybackTimestamp, "查找到相连的timestamp->", i, '需要seek->', keyFrameSeekTime, "秒"); 941 + loger.log("SEEK->APE", '媒体共享', this._recordPlaybackTimestamp, "查找到相连的timestamp->", i, '需要seek->', keyFrameSeekTime, "秒");
934 //把时间点对应的数据发送,同一秒内有存在多个数据的情况 942 //把时间点对应的数据发送,同一秒内有存在多个数据的情况
935 for (let k = 0; k < messageItem.length; k++) { 943 for (let k = 0; k < messageItem.length; k++) {
936 this._everSocketMsgReceivedHandler(messageItem[k].byteData, keyFrameSeekTime); 944 this._everSocketMsgReceivedHandler(messageItem[k].byteData, keyFrameSeekTime);
@@ -942,8 +950,8 @@ class RecordPlayBackParse extends Emiter { @@ -942,8 +950,8 @@ class RecordPlayBackParse extends Emiter {
942 } 950 }
943 951
944 //伴音共享模块查找关键帧时间戳的消息 952 //伴音共享模块查找关键帧时间戳的消息
945 - searchMusicShareApeMessageKeyfram(_apeMessages){  
946 - if(!_apeMessages){ 953 + searchMusicShareApeMessageKeyfram(_apeMessages) {
  954 + if (!_apeMessages) {
947 return; 955 return;
948 } 956 }
949 let messageItem; 957 let messageItem;
@@ -952,7 +960,7 @@ class RecordPlayBackParse extends Emiter { @@ -952,7 +960,7 @@ class RecordPlayBackParse extends Emiter {
952 messageItem = _apeMessages[i]; 960 messageItem = _apeMessages[i];
953 if (messageItem) { 961 if (messageItem) {
954 keyFrameSeekTime = (this._recordPlaybackTimestamp - i) 962 keyFrameSeekTime = (this._recordPlaybackTimestamp - i)
955 - loger.log("SEEK->APE",'伴音共享',this._recordPlaybackTimestamp, "查找到相连的timestamp->", i, '需要seek->', keyFrameSeekTime, "秒"); 963 + loger.log("SEEK->APE", '伴音共享', this._recordPlaybackTimestamp, "查找到相连的timestamp->", i, '需要seek->', keyFrameSeekTime, "秒");
956 //把时间点对应的数据发送,同一秒内有存在多个数据的情况 964 //把时间点对应的数据发送,同一秒内有存在多个数据的情况
957 for (let k = 0; k < messageItem.length; k++) { 965 for (let k = 0; k < messageItem.length; k++) {
958 this._everSocketMsgReceivedHandler(messageItem[k].byteData, keyFrameSeekTime); 966 this._everSocketMsgReceivedHandler(messageItem[k].byteData, keyFrameSeekTime);
@@ -965,13 +973,13 @@ class RecordPlayBackParse extends Emiter { @@ -965,13 +973,13 @@ class RecordPlayBackParse extends Emiter {
965 973
966 //查找聊天模块ape关键帧数据,聊天模块比较特殊,消息是累积的,当前时间戳之前的都需要显示 974 //查找聊天模块ape关键帧数据,聊天模块比较特殊,消息是累积的,当前时间戳之前的都需要显示
967 _searchChatHistoryMessageKeyfram(_apeMessages) { 975 _searchChatHistoryMessageKeyfram(_apeMessages) {
968 - if(!_apeMessages){ 976 + if (!_apeMessages) {
969 return; 977 return;
970 } 978 }
971 //最多30条数据 979 //最多30条数据
972 - let counter=0; 980 + let counter = 0;
973 let messageItem; 981 let messageItem;
974 - let mssageArr=[]; 982 + let mssageArr = [];
975 for (let i = this._recordPlaybackTimestamp; i > 0; i--) { 983 for (let i = this._recordPlaybackTimestamp; i > 0; i--) {
976 messageItem = _apeMessages[i]; 984 messageItem = _apeMessages[i];
977 if (messageItem) { 985 if (messageItem) {
@@ -980,7 +988,7 @@ class RecordPlayBackParse extends Emiter { @@ -980,7 +988,7 @@ class RecordPlayBackParse extends Emiter {
980 //this._everSocketMsgReceivedHandler(messageItem[i].byteData, 0); 988 //this._everSocketMsgReceivedHandler(messageItem[i].byteData, 0);
981 mssageArr.push(messageItem[i].byteData); 989 mssageArr.push(messageItem[i].byteData);
982 counter++; 990 counter++;
983 - if(counter>40){ 991 + if (counter > 40) {
984 loger.warn("SEEK->最多处理历史消息30条"); 992 loger.warn("SEEK->最多处理历史消息30条");
985 break; 993 break;
986 } 994 }
@@ -988,9 +996,9 @@ class RecordPlayBackParse extends Emiter { @@ -988,9 +996,9 @@ class RecordPlayBackParse extends Emiter {
988 } 996 }
989 } 997 }
990 //mssageArr记录的数据是按时间最大排序的,发消息的时候需要从时间小的开始,倒着发数据 998 //mssageArr记录的数据是按时间最大排序的,发消息的时候需要从时间小的开始,倒着发数据
991 - let len=mssageArr.length;  
992 - if(len>0){  
993 - for (let k=len-1;k>=0;k--){ 999 + let len = mssageArr.length;
  1000 + if (len > 0) {
  1001 + for (let k = len - 1; k >= 0; k--) {
994 this._everSocketMsgReceivedHandler(mssageArr[k], 0); 1002 this._everSocketMsgReceivedHandler(mssageArr[k], 0);
995 } 1003 }
996 } 1004 }
@@ -998,11 +1006,11 @@ class RecordPlayBackParse extends Emiter { @@ -998,11 +1006,11 @@ class RecordPlayBackParse extends Emiter {
998 1006
999 //查找白板标注模块ape关键帧数据,聊天模块比较特殊,消息是累积的,当前时间戳之前的都需要显示 1007 //查找白板标注模块ape关键帧数据,聊天模块比较特殊,消息是累积的,当前时间戳之前的都需要显示
1000 _searchWhiteboradHistoryMessageKeyfram(_apeMessages) { 1008 _searchWhiteboradHistoryMessageKeyfram(_apeMessages) {
1001 - if(!_apeMessages){ 1009 + if (!_apeMessages) {
1002 return; 1010 return;
1003 } 1011 }
1004 //最多100条数据 1012 //最多100条数据
1005 - let counter=0; 1013 + let counter = 0;
1006 let messageItem; 1014 let messageItem;
1007 for (let i = this._recordPlaybackTimestamp; i > 0; i--) { 1015 for (let i = this._recordPlaybackTimestamp; i > 0; i--) {
1008 messageItem = _apeMessages[i]; 1016 messageItem = _apeMessages[i];
@@ -1011,7 +1019,7 @@ class RecordPlayBackParse extends Emiter { @@ -1011,7 +1019,7 @@ class RecordPlayBackParse extends Emiter {
1011 for (let i = 0; i < messageItem.length; i++) { 1019 for (let i = 0; i < messageItem.length; i++) {
1012 this._everSocketMsgReceivedHandler(messageItem[i].byteData, 0); 1020 this._everSocketMsgReceivedHandler(messageItem[i].byteData, 0);
1013 counter++; 1021 counter++;
1014 - if(counter>40){ 1022 + if (counter > 40) {
1015 loger.warn("SEEK->最多处理历史消息40条"); 1023 loger.warn("SEEK->最多处理历史消息40条");
1016 return; 1024 return;
1017 } 1025 }
@@ -1019,17 +1027,18 @@ class RecordPlayBackParse extends Emiter { @@ -1019,17 +1027,18 @@ class RecordPlayBackParse extends Emiter {
1019 } 1027 }
1020 } 1028 }
1021 } 1029 }
  1030 +
1022 //解析视频模块的广播消息 1031 //解析视频模块的广播消息
1023 - unpackVideoBroadcastMessage(pduMsg,timestamp,data){ 1032 + unpackVideoBroadcastMessage(pduMsg, timestamp, data) {
1024 //console.log("VIDEO_SESSION_ID-pduMsg",pduMsg); 1033 //console.log("VIDEO_SESSION_ID-pduMsg",pduMsg);
1025 - if(!pduMsg){ 1034 + if (!pduMsg) {
1026 return; 1035 return;
1027 } 1036 }
1028 - if(pduMsg.subType!=pdu.RCPDU_SEND_VIDEO_DATA_REQUEST){ 1037 + if (pduMsg.subType != pdu.RCPDU_SEND_VIDEO_DATA_REQUEST) {
1029 //视频广播消息,只处理501消息 1038 //视频广播消息,只处理501消息
1030 return; 1039 return;
1031 } 1040 }
1032 - try{ 1041 + try {
1033 let videoReceivePdu = pdu['RCVideoSendDataRequestPdu'].decode(pduMsg.data); 1042 let videoReceivePdu = pdu['RCVideoSendDataRequestPdu'].decode(pduMsg.data);
1034 if (videoReceivePdu == null) { 1043 if (videoReceivePdu == null) {
1035 loger.warn("视频模块广播消息-decode->失败"); 1044 loger.warn("视频模块广播消息-decode->失败");
@@ -1048,9 +1057,9 @@ class RecordPlayBackParse extends Emiter { @@ -1048,9 +1057,9 @@ class RecordPlayBackParse extends Emiter {
1048 //data :Object 1057 //data :Object
1049 //fromNodeId :902994631 1058 //fromNodeId :902994631
1050 //toNodeId : 0 1059 //toNodeId : 0
1051 - if(videoReceivePdu.actionType==40){  
1052 - if(!this._videoApeBroadcastMssages[videoReceivePdu.fromNodeId]){  
1053 - this._videoApeBroadcastMssages[videoReceivePdu.fromNodeId]={}; 1060 + if (videoReceivePdu.actionType == 40) {
  1061 + if (!this._videoApeBroadcastMssages[videoReceivePdu.fromNodeId]) {
  1062 + this._videoApeBroadcastMssages[videoReceivePdu.fromNodeId] = {};
1054 } 1063 }
1055 /* 1064 /*
1056 //结构 1065 //结构
@@ -1063,29 +1072,33 @@ class RecordPlayBackParse extends Emiter { @@ -1063,29 +1072,33 @@ class RecordPlayBackParse extends Emiter {
1063 },..... 1072 },.....
1064 }*/ 1073 }*/
1065 1074
1066 - this._videoApeBroadcastMssages[videoReceivePdu.fromNodeId][timestamp]={parseData:videoReceivePdu,byteData:data,timestamp: timestamp}; 1075 + this._videoApeBroadcastMssages[videoReceivePdu.fromNodeId][timestamp] = {
  1076 + parseData: videoReceivePdu,
  1077 + byteData: data,
  1078 + timestamp: timestamp
  1079 + };
1067 //this._videoApeBroadcastMssages[timestamp]={parseData:videoReceivePdu,byteData:data,timestamp: timestamp}; 1080 //this._videoApeBroadcastMssages[timestamp]={parseData:videoReceivePdu,byteData:data,timestamp: timestamp};
1068 } 1081 }
1069 1082
1070 - }catch (err){  
1071 - console.log("视频模块广播消息->解析失败",err.message); 1083 + } catch (err) {
  1084 + console.log("视频模块广播消息->解析失败", err.message);
1072 } 1085 }
1073 } 1086 }
1074 1087
1075 //音视频的数据需要解析,然后按频道储存数据 1088 //音视频的数据需要解析,然后按频道储存数据
1076 // 解析pdu RCAdapterPdu的数据: regBuffer(RCAdapterPdu数据),timestamp(时间戳), data(mcu的原始数据) sessionId(类型) 1089 // 解析pdu RCAdapterPdu的数据: regBuffer(RCAdapterPdu数据),timestamp(时间戳), data(mcu的原始数据) sessionId(类型)
1077 - unPackpduRegAdapterHandler(regBuffer, timestamp, data, sessionId,subType) { 1090 + unPackpduRegAdapterHandler(regBuffer, timestamp, data, sessionId, subType) {
1078 let regPdu; 1091 let regPdu;
1079 - let regItems ;  
1080 - let regItemSize ;  
1081 - try{ 1092 + let regItems;
  1093 + let regItemSize;
  1094 + try {
1082 //console.log('RCAdapterPdu--->') 1095 //console.log('RCAdapterPdu--->')
1083 regPdu = pdu['RCAdapterPdu'].decode(regBuffer); 1096 regPdu = pdu['RCAdapterPdu'].decode(regBuffer);
1084 regItems = regPdu.item; 1097 regItems = regPdu.item;
1085 regItemSize = regItems.length; 1098 regItemSize = regItems.length;
1086 1099
1087 - }catch (err){  
1088 - console.warn('RCAdapterPdu->unpack-error->type类型不对',"subType:"+subType); 1100 + } catch (err) {
  1101 + console.warn('RCAdapterPdu->unpack-error->type类型不对', "subType:" + subType);
1089 return; 1102 return;
1090 } 1103 }
1091 1104
@@ -1098,7 +1111,7 @@ class RecordPlayBackParse extends Emiter { @@ -1098,7 +1111,7 @@ class RecordPlayBackParse extends Emiter {
1098 if (pdu.RCPDU_REG_UPDATE_OBJ !== regItemType) { 1111 if (pdu.RCPDU_REG_UPDATE_OBJ !== regItemType) {
1099 if (pdu.RCPDU_REG_RESPONSE_OBJ == regItemType) { 1112 if (pdu.RCPDU_REG_RESPONSE_OBJ == regItemType) {
1100 let regResponsePdu = pdu['RCRegistryResponseObjPdu'].decode(regItemData); 1113 let regResponsePdu = pdu['RCRegistryResponseObjPdu'].decode(regItemData);
1101 - console.log('regResponsePdu',regResponsePdu) 1114 + console.log('regResponsePdu', regResponsePdu)
1102 //this.regResponsePduHandler(regResponsePdu); 1115 //this.regResponsePduHandler(regResponsePdu);
1103 } 1116 }
1104 // 只处理两种类型 1117 // 只处理两种类型
@@ -1158,7 +1171,7 @@ class RecordPlayBackParse extends Emiter { @@ -1158,7 +1171,7 @@ class RecordPlayBackParse extends Emiter {
1158 break; 1171 break;
1159 case pdu.RCPDU_SEND_VIDEO_DATA_REQUEST: 1172 case pdu.RCPDU_SEND_VIDEO_DATA_REQUEST:
1160 //视频模块的控制消息 1173 //视频模块的控制消息
1161 - try{ 1174 + try {
1162 let videoReceivePdu = pdu['RCVideoSendDataRequestPdu'].decode(user_data); 1175 let videoReceivePdu = pdu['RCVideoSendDataRequestPdu'].decode(user_data);
1163 if (videoReceivePdu == null) { 1176 if (videoReceivePdu == null) {
1164 loger.warn("视频控制消息处理,收到的消息为null,不做处理"); 1177 loger.warn("视频控制消息处理,收到的消息为null,不做处理");
@@ -1173,9 +1186,13 @@ class RecordPlayBackParse extends Emiter { @@ -1173,9 +1186,13 @@ class RecordPlayBackParse extends Emiter {
1173 dataObj = videoReceivePdu.data; 1186 dataObj = videoReceivePdu.data;
1174 } 1187 }
1175 videoReceivePdu.data = dataObj; 1188 videoReceivePdu.data = dataObj;
1176 - this._videoApeBroadcastMssages[timestamp]={parseData:videoReceivePdu,byteData:data,timestamp: timestamp};  
1177 - }catch (err){  
1178 - loger.warn("RCPDU_SEND_VIDEO_DATA_REQUEST->err",err); 1189 + this._videoApeBroadcastMssages[timestamp] = {
  1190 + parseData: videoReceivePdu,
  1191 + byteData: data,
  1192 + timestamp: timestamp
  1193 + };
  1194 + } catch (err) {
  1195 + loger.warn("RCPDU_SEND_VIDEO_DATA_REQUEST->err", err);
1179 } 1196 }
1180 break; 1197 break;
1181 case pdu.RCPDU_REG_TABLE_UPDATE_PDU: 1198 case pdu.RCPDU_REG_TABLE_UPDATE_PDU:
@@ -1186,37 +1203,47 @@ class RecordPlayBackParse extends Emiter { @@ -1186,37 +1203,47 @@ class RecordPlayBackParse extends Emiter {
1186 let tableItem = tableUpdateItems[i]; 1203 let tableItem = tableUpdateItems[i];
1187 1204
1188 //只处理音视频模块的消息 1205 //只处理音视频模块的消息
1189 - if(sessionId==ApeConsts.VIDEO_SESSION_ID){ 1206 + if (sessionId == ApeConsts.VIDEO_SESSION_ID) {
1190 try { 1207 try {
1191 let videoChannelInfo = pdu['RCVideoChannelInfoPdu'].decode(tableItem.itemData); 1208 let videoChannelInfo = pdu['RCVideoChannelInfoPdu'].decode(tableItem.itemData);
1192 //loger.log('RCVideoChannelInfoPdu->timestamp',timestamp,videoChannelInfo); 1209 //loger.log('RCVideoChannelInfoPdu->timestamp',timestamp,videoChannelInfo);
1193 //储存音视频模块的数据 1210 //储存音视频模块的数据
1194 - if(!this.mediaChannleList[videoChannelInfo.channelId]){  
1195 - this.mediaChannleList[videoChannelInfo.channelId]={};  
1196 - }  
1197 - let statusStr="关";  
1198 - if(videoChannelInfo&&videoChannelInfo.status==1){  
1199 - statusStr="开";  
1200 - this.allStreams[videoChannelInfo.streamId]=videoChannelInfo;  
1201 - console.log("视频流"+videoChannelInfo.streamId);  
1202 - }  
1203 - this.mediaChannleList[videoChannelInfo.channelId][timestamp]={parseData:videoChannelInfo,byteData:data,timestamp: timestamp,status:statusStr}; 1211 + if (!this.mediaChannleList[videoChannelInfo.channelId]) {
  1212 + this.mediaChannleList[videoChannelInfo.channelId] = {};
  1213 + }
  1214 + let statusStr = "关";
  1215 + if (videoChannelInfo && videoChannelInfo.status == 1) {
  1216 + statusStr = "开";
  1217 + this.allStreams[videoChannelInfo.streamId] = videoChannelInfo;
  1218 + console.log("视频流" + videoChannelInfo.streamId);
  1219 + }
  1220 + this.mediaChannleList[videoChannelInfo.channelId][timestamp] = {
  1221 + parseData: videoChannelInfo,
  1222 + byteData: data,
  1223 + timestamp: timestamp,
  1224 + status: statusStr
  1225 + };
1204 } catch (err) { 1226 } catch (err) {
1205 loger.log("RCVideoChannelInfoPdu->unPackPdu->error->" + tableItem.itemIdx + " err:" + err.message); 1227 loger.log("RCVideoChannelInfoPdu->unPackPdu->error->" + tableItem.itemIdx + " err:" + err.message);
1206 } 1228 }
1207 - }else if(sessionId==ApeConsts.AUDIO_SESSION_ID){ 1229 + } else if (sessionId == ApeConsts.AUDIO_SESSION_ID) {
1208 try { 1230 try {
1209 let audioChannelInfo = pdu['RCAudioChannelInfoPdu'].decode(tableItem.itemData); 1231 let audioChannelInfo = pdu['RCAudioChannelInfoPdu'].decode(tableItem.itemData);
1210 - loger.log('RCAudioChannelInfoPdu->timestamp',timestamp,audioChannelInfo); 1232 + loger.log('RCAudioChannelInfoPdu->timestamp', timestamp, audioChannelInfo);
1211 //储存音视频模块的数据 1233 //储存音视频模块的数据
1212 - if(!this.mediaChannleList[audioChannelInfo.channelId]){  
1213 - this.mediaChannleList[audioChannelInfo.channelId]={};  
1214 - }  
1215 - let statusStr="关";  
1216 - if(audioChannelInfo&&audioChannelInfo.status==1){  
1217 - statusStr="开";  
1218 - }  
1219 - this.mediaChannleList[audioChannelInfo.channelId][timestamp]={parseData:audioChannelInfo,byteData:data,timestamp: timestamp,status:statusStr}; 1234 + if (!this.mediaChannleList[audioChannelInfo.channelId]) {
  1235 + this.mediaChannleList[audioChannelInfo.channelId] = {};
  1236 + }
  1237 + let statusStr = "关";
  1238 + if (audioChannelInfo && audioChannelInfo.status == 1) {
  1239 + statusStr = "开";
  1240 + }
  1241 + this.mediaChannleList[audioChannelInfo.channelId][timestamp] = {
  1242 + parseData: audioChannelInfo,
  1243 + byteData: data,
  1244 + timestamp: timestamp,
  1245 + status: statusStr
  1246 + };
1220 } catch (err) { 1247 } catch (err) {
1221 loger.log("RCAudioChannelInfoPdu->unPackPdu->error->" + tableItem.itemIdx + " err:" + err.message); 1248 loger.log("RCAudioChannelInfoPdu->unPackPdu->error->" + tableItem.itemIdx + " err:" + err.message);
1222 } 1249 }
@@ -245,7 +245,7 @@ class ConferApe extends Ape { @@ -245,7 +245,7 @@ class ConferApe extends Ape {
245 optional string filename = 4; // 录像文件名称,filename中增加目录部分 245 optional string filename = 4; // 录像文件名称,filename中增加目录部分
246 }*/ 246 }*/
247 247
248 - if(this.recordStatus==conferRecordSendPdu.record){ 248 + if(this.recordStatus==true){
249 //已经有录制文件,不再发送 249 //已经有录制文件,不再发送
250 return; 250 return;
251 } 251 }
@@ -533,7 +533,6 @@ class ConferApe extends Ape { @@ -533,7 +533,6 @@ class ConferApe extends Ape {
533 }); 533 });
534 } else { 534 } else {
535 loger.warn("踢人失败-参数无效") 535 loger.warn("踢人失败-参数无效")
536 - console.log(_param);  
537 } 536 }
538 } 537 }
539 538
@@ -862,15 +862,18 @@ class WebRtcApe extends Emiter { @@ -862,15 +862,18 @@ class WebRtcApe extends Emiter {
862 }); 862 });
863 } 863 }
864 864
865 - //调用媒体服务停止录制  
866 - stopRecordingMedia() {  
867 - //192.168.31.8:3000/recordInfo/stopRecording/  
868 - if (!GlobalConfig.stopRecordingInterfaces) {  
869 - loger.log("调用服务器端开启录制->失败->接口地址无效"); 865 + /*
  866 + * 切换音视频的录制状态
  867 + * */
  868 + changeMediaRecordStatus(_params) {
  869 + if (!GlobalConfig.recordInterfaces||!_params) {
  870 + loger.warn("切换音视频的录制状态->失败->接口地址无效",_params);
870 return; 871 return;
871 } 872 }
872 - let url = GlobalConfig.locationProtocol + GlobalConfig.stopRecordingInterfaces;  
873 - let data = this.packMediaInfoData(WebRtcApe.RECORD_STATUS_2); 873 + loger.warn("切换音视频的录制状态->"+_params);
  874 + let url = GlobalConfig.locationProtocol + GlobalConfig.recordInterfaces;
  875 + let curTimestamp = new Date().getTime();
  876 + let data = `appId=${GlobalConfig.appId}&channel=${GlobalConfig.channelId}&channelKey=${GlobalConfig.appCertificate}&uid=${GlobalConfig.userUid}&status=${_params.status}&userId=${GlobalConfig.userId}&userName=${GlobalConfig.userName}&userRole=${GlobalConfig.userRole}&timestamp=${curTimestamp}&recordTimestamp=${GlobalConfig.recordTimestamp}`;
874 fetch(encodeURI(url), { 877 fetch(encodeURI(url), {
875 method: 'POST', 878 method: 'POST',
876 headers: { 879 headers: {
@@ -883,19 +886,19 @@ class WebRtcApe extends Emiter { @@ -883,19 +886,19 @@ class WebRtcApe extends Emiter {
883 if (ret.ok) { 886 if (ret.ok) {
884 return ret.json(); 887 return ret.json();
885 } else { 888 } else {
886 - loger.error(`调用服务器端开启录制-网络异常.状态码:${ret.status}`); 889 + loger.error(`切换音视频的录制状态-网络异常.状态码:${ret.status}`);
887 throw ''; 890 throw '';
888 } 891 }
889 }) 892 })
890 .then(ret => { 893 .then(ret => {
891 if (ret) { 894 if (ret) {
892 - loger.log('调用服务器端开启录制完成', ret); 895 + loger.log('切换音视频的录制状态->完成', ret);
893 } else { 896 } else {
894 - loger.warn('调用服务器端开启录制 失败.', ret); 897 + loger.warn('切换音视频的录制状态 失败.', ret);
895 } 898 }
896 }) 899 })
897 .catch(err => { 900 .catch(err => {
898 - loger.error(`调用服务器端开启录制.状态码:${err}`); 901 + loger.error(`切换音视频的录制状态.状态码:${err}`);
899 }); 902 });
900 } 903 }
901 } 904 }