李勇

1.修改课堂录制的逻辑

@@ -58,7 +58,7 @@ export default class MessageEntrance extends Emiter { @@ -58,7 +58,7 @@ export default class MessageEntrance extends Emiter {
58 constructor() { 58 constructor() {
59 super(); 59 super();
60 //sdk 信息 60 //sdk 信息
61 - GlobalConfig.sdkVersion = "v1.81.1.20170824"; 61 + GlobalConfig.sdkVersion = "v1.81.19.20170828";
62 loger.warn("sdkVersion:" + GlobalConfig.sdkVersion); 62 loger.warn("sdkVersion:" + GlobalConfig.sdkVersion);
63 63
64 //设置 64 //设置
@@ -399,7 +399,7 @@ export default class MessageEntrance extends Emiter { @@ -399,7 +399,7 @@ export default class MessageEntrance extends Emiter {
399 //当前的课堂状态信息发生改变,需要保存课堂状态到Sass 399 //当前的课堂状态信息发生改变,需要保存课堂状态到Sass
400 _onClassStatusInfoChange(_param) { 400 _onClassStatusInfoChange(_param) {
401 //如果MCU连接已经断开,不发送 401 //如果MCU连接已经断开,不发送
402 - if (GlobalConfig.getCurrentStatus().code != GlobalConfig.statusCode_2.code) { 402 + if (!_mcu||!_mcu.connected) {
403 loger.warn("不能保存课堂状态", GlobalConfig.getCurrentStatus()); 403 loger.warn("不能保存课堂状态", GlobalConfig.getCurrentStatus());
404 return; 404 return;
405 } 405 }
@@ -424,14 +424,17 @@ export default class MessageEntrance extends Emiter { @@ -424,14 +424,17 @@ export default class MessageEntrance extends Emiter {
424 this.classRecordStatusUpdateTimer = setTimeout(function () { 424 this.classRecordStatusUpdateTimer = setTimeout(function () {
425 clearTimeout(this.classRecordStatusUpdateTimer); 425 clearTimeout(this.classRecordStatusUpdateTimer);
426 _this.updaterRecordAllApeStatus(_param); 426 _this.updaterRecordAllApeStatus(_param);
427 - }, 2000); 427 + }, 1600);
428 428
429 } 429 }
430 430
431 //录制状态发送改变,更新所有模块的当前数据发送到MCU 431 //录制状态发送改变,更新所有模块的当前数据发送到MCU
432 updaterRecordAllApeStatus(_param) { 432 updaterRecordAllApeStatus(_param) {
  433 + if(GlobalConfig.isRecordPlayBack){
  434 + return;
  435 + }
433 //老师身份和非录制回放的时候执行,录制状态发送改变,需要更新当前的数据,否则已有的消息会录制不上 436 //老师身份和非录制回放的时候执行,录制状态发送改变,需要更新当前的数据,否则已有的消息会录制不上
434 - if (GlobalConfig.isHost && !GlobalConfig.isRecordPlayBack) { 437 + if (GlobalConfig.isHost||GlobalConfig.rosterNumber<=1) {
435 loger.warn('录制状态发送改变->更新所有模块的当前数据发送到MCU'); 438 loger.warn('录制状态发送改变->更新所有模块的当前数据发送到MCU');
436 //目前录制的模块[文档模块、白板模块、视频模块(包含屏幕共享)、音频模块、媒体共享,聊天模块] 439 //目前录制的模块[文档模块、白板模块、视频模块(包含屏幕共享)、音频模块、媒体共享,聊天模块]
437 if (_doc_ape) { 440 if (_doc_ape) {
@@ -959,7 +962,7 @@ export default class MessageEntrance extends Emiter { @@ -959,7 +962,7 @@ export default class MessageEntrance extends Emiter {
959 isForce = true; 962 isForce = true;
960 } 963 }
961 964
962 - if (GlobalConfig.isHost || isForce) { 965 + /* if (GlobalConfig.isHost || isForce) {
963 //只有加入课堂之后才能保存数据 966 //只有加入课堂之后才能保存数据
964 if (GlobalConfig.getCurrentStatus().code == GlobalConfig.statusCode_2.code) { 967 if (GlobalConfig.getCurrentStatus().code == GlobalConfig.statusCode_2.code) {
965 //POST 保存数据 968 //POST 保存数据
@@ -969,7 +972,26 @@ export default class MessageEntrance extends Emiter { @@ -969,7 +972,26 @@ export default class MessageEntrance extends Emiter {
969 } 972 }
970 } else { 973 } else {
971 loger.log("没有保存课堂状态信息的权限->身份", GlobalConfig.userRole); 974 loger.log("没有保存课堂状态信息的权限->身份", GlobalConfig.userRole);
  975 + }*/
  976 + if (GlobalConfig.isHost || isForce||GlobalConfig.rosterNumber<=1) {
  977 + //只有加入课堂之后才能保存数据
  978 + /*if (GlobalConfig.getCurrentStatus().code == GlobalConfig.statusCode_2.code) {
  979 + //POST 保存数据
  980 + _sass.saveClassStatusInfo({"classStatusInfo": GlobalConfig.classStatusInfo}); //保存课堂状态信息
  981 + } else {
  982 + loger.error("不能保存课堂数据", GlobalConfig.getCurrentStatus());
  983 + }*/
  984 + if (_mcu&&_mcu.connected) {
  985 + //POST 保存数据
  986 + _sass.saveClassStatusInfo({"classStatusInfo": GlobalConfig.classStatusInfo}); //保存课堂状态信息
  987 + } else {
  988 + loger.error("不能保存课堂数据", GlobalConfig.getCurrentStatus());
  989 + }
  990 +
  991 + } else {
  992 + loger.log("没有保存课堂状态信息的权限->身份", GlobalConfig.userRole);
972 } 993 }
  994 +
973 } 995 }
974 996
975 //保存会态信息成功 997 //保存会态信息成功
@@ -1355,10 +1377,15 @@ export default class MessageEntrance extends Emiter { @@ -1355,10 +1377,15 @@ export default class MessageEntrance extends Emiter {
1355 loger.warn(GlobalConfig.getCurrentStatus()); 1377 loger.warn(GlobalConfig.getCurrentStatus());
1356 return; 1378 return;
1357 } 1379 }
1358 - 1380 + if(GlobalConfig.isRecordPlayBack){
  1381 + return;
  1382 + }
1359 if (_confer_ape) { 1383 if (_confer_ape) {
1360 //开始录制 1384 //开始录制
  1385 + setTimeout(()=> {
1361 _confer_ape.startRecord(); 1386 _confer_ape.startRecord();
  1387 + },2000);
  1388 +
1362 //开始上课 1389 //开始上课
1363 _confer_ape.startClass(_param); 1390 _confer_ape.startClass(_param);
1364 } 1391 }
@@ -72,6 +72,7 @@ class RecordPlayBackParse extends Emiter { @@ -72,6 +72,7 @@ class RecordPlayBackParse extends Emiter {
72 let pduMsg = pdu.decode_pdu(data); 72 let pduMsg = pdu.decode_pdu(data);
73 let pduType = pduMsg.get("type"); 73 let pduType = pduMsg.get("type");
74 let pduData = pduMsg.get("data"); 74 let pduData = pduMsg.get("data");
  75 +
75 //*************非常重要****************** 76 //*************非常重要******************
76 //客户端发送的所有125消息,MCU收到之后会痛120把消息返回给客户端, 77 //客户端发送的所有125消息,MCU收到之后会痛120把消息返回给客户端,
77 //所以需要把125消息type转换为120,因为MCU在录制的时候是直接录制客户端发送的消息而不是MCU转换之后的 78 //所以需要把125消息type转换为120,因为MCU在录制的时候是直接录制客户端发送的消息而不是MCU转换之后的
@@ -121,10 +122,11 @@ class RecordPlayBackParse extends Emiter { @@ -121,10 +122,11 @@ class RecordPlayBackParse extends Emiter {
121 122
122 //解析和储存,录制回放EverSocket底层消息处理 data-数据;timestamp-数据对应的时间戳 123 //解析和储存,录制回放EverSocket底层消息处理 data-数据;timestamp-数据对应的时间戳
123 _parseSaveSocketMsgReceivedHandler(data, timestamp) { 124 _parseSaveSocketMsgReceivedHandler(data, timestamp) {
124 - //loger.log('解析和储存录制回放数据-> '); 125 +
125 let pduMsg = pdu.decode_pdu(data); 126 let pduMsg = pdu.decode_pdu(data);
126 let pduType = pduMsg.get("type"); 127 let pduType = pduMsg.get("type");
127 let pduData = pduMsg.get("data"); 128 let pduData = pduMsg.get("data");
  129 +
128 //*************非常重要****************** 130 //*************非常重要******************
129 //客户端发送的所有125消息,MCU收到之后会痛120把消息返回给客户端, 131 //客户端发送的所有125消息,MCU收到之后会痛120把消息返回给客户端,
130 //所以需要把125消息type转换为120,因为MCU在录制的时候是直接录制客户端发送的消息而不是MCU转换之后的 132 //所以需要把125消息type转换为120,因为MCU在录制的时候是直接录制客户端发送的消息而不是MCU转换之后的
@@ -328,10 +330,17 @@ class RecordPlayBackParse extends Emiter { @@ -328,10 +330,17 @@ class RecordPlayBackParse extends Emiter {
328 } 330 }
329 331
330 GlobalConfig.recordPlaybackMaxTime = this._recordPlaybackMaxTime; 332 GlobalConfig.recordPlaybackMaxTime = this._recordPlaybackMaxTime;
  333 + console.log('课堂模块',this._conferApeMssages);
331 console.log('音视频通话模块数据',this.mediaChannleList); 334 console.log('音视频通话模块数据',this.mediaChannleList);
332 console.log('媒体共享模块数据',this._mediaShareApeMssages); 335 console.log('媒体共享模块数据',this._mediaShareApeMssages);
333 console.log('伴音模块数据',this._musicShareApeMssages); 336 console.log('伴音模块数据',this._musicShareApeMssages);
334 - loger.log("录制回放数据解析完成,录制回放的总时间长为->", this._recordPlaybackMaxTime); 337 + console.log('视频数据',this._videoApeMssages);
  338 + console.log('音频数据',this._audioApeMssages);
  339 + console.log('文档数据',this._docApeMssages);
  340 + console.log('白板数据',this._whiteApeMssages);
  341 + console.log('聊天数据',this._chatApeMssages);
  342 +
  343 + loger.log("录制回放数据解析完成,录制回放的总时间长为->", this._recordPlaybackMaxTime,"recordTimestamp:"+GlobalConfig.recordTimestamp);
335 this._emit(RecordPlayBackParse.CLASS_JOIN_RECORD_PLAYBACK_SUCCESS, {"recordPlaybackMaxTime": this._recordPlaybackMaxTime}); 344 this._emit(RecordPlayBackParse.CLASS_JOIN_RECORD_PLAYBACK_SUCCESS, {"recordPlaybackMaxTime": this._recordPlaybackMaxTime});
336 } 345 }
337 346
@@ -342,7 +351,7 @@ class RecordPlayBackParse extends Emiter { @@ -342,7 +351,7 @@ class RecordPlayBackParse extends Emiter {
342 //没有数据,需要查找当前时间点属于哪一个时间戳关键帧 351 //没有数据,需要查找当前时间点属于哪一个时间戳关键帧
343 } else { 352 } else {
344 //把时间点对应的数据发送,同一秒内有存在多个数据的情况 353 //把时间点对应的数据发送,同一秒内有存在多个数据的情况
345 - loger.log(_ape,"回放数据->",msgDataArr.length) 354 + loger.log(_ape,"回放数据->length:",msgDataArr.length)
346 for (let i = 0; i < msgDataArr.length; i++) { 355 for (let i = 0; i < msgDataArr.length; i++) {
347 this._everSocketMsgReceivedHandler(msgDataArr[i].byteData, 0); 356 this._everSocketMsgReceivedHandler(msgDataArr[i].byteData, 0);
348 } 357 }
@@ -470,11 +479,12 @@ class RecordPlayBackParse extends Emiter { @@ -470,11 +479,12 @@ class RecordPlayBackParse extends Emiter {
470 messageItem = channelInfos[i]; 479 messageItem = channelInfos[i];
471 if (messageItem) { 480 if (messageItem) {
472 keyFrameSeekTime = (this._recordPlaybackTimestamp - i); 481 keyFrameSeekTime = (this._recordPlaybackTimestamp - i);
473 - loger.log("SEEK->查找音视频模块数据->",messageItem,'keyFrameSeekTime->',keyFrameSeekTime) 482 + loger.log("频道:"+k+"->SEEK->查找音视频模块数据->",messageItem,'keyFrameSeekTime->',keyFrameSeekTime)
474 this._everSocketMsgReceivedHandler(messageItem.byteData, keyFrameSeekTime); 483 this._everSocketMsgReceivedHandler(messageItem.byteData, keyFrameSeekTime);
475 break; 484 break;
476 } 485 }
477 } 486 }
  487 + loger.log("频道:"+k+"—>没有查找到数据")
478 } 488 }
479 } 489 }
480 } 490 }
@@ -677,7 +687,11 @@ class RecordPlayBackParse extends Emiter { @@ -677,7 +687,11 @@ class RecordPlayBackParse extends Emiter {
677 if(!this.mediaChannleList[videoChannelInfo.channelId]){ 687 if(!this.mediaChannleList[videoChannelInfo.channelId]){
678 this.mediaChannleList[videoChannelInfo.channelId]={}; 688 this.mediaChannleList[videoChannelInfo.channelId]={};
679 } 689 }
680 - this.mediaChannleList[videoChannelInfo.channelId][timestamp]={parseData:videoChannelInfo,byteData:data,timestamp: timestamp }; 690 + let statusStr="关";
  691 + if(videoChannelInfo&&videoChannelInfo.status==1){
  692 + statusStr="开";
  693 + }
  694 + this.mediaChannleList[videoChannelInfo.channelId][timestamp]={parseData:videoChannelInfo,byteData:data,timestamp: timestamp,status:statusStr};
681 } catch (err) { 695 } catch (err) {
682 loger.log("RCVideoChannelInfoPdu->unPackPdu->error->" + tableItem.itemIdx + " err:" + err.message); 696 loger.log("RCVideoChannelInfoPdu->unPackPdu->error->" + tableItem.itemIdx + " err:" + err.message);
683 } 697 }
@@ -689,7 +703,11 @@ class RecordPlayBackParse extends Emiter { @@ -689,7 +703,11 @@ class RecordPlayBackParse extends Emiter {
689 if(!this.mediaChannleList[audioChannelInfo.channelId]){ 703 if(!this.mediaChannleList[audioChannelInfo.channelId]){
690 this.mediaChannleList[audioChannelInfo.channelId]={}; 704 this.mediaChannleList[audioChannelInfo.channelId]={};
691 } 705 }
692 - this.mediaChannleList[audioChannelInfo.channelId][timestamp]={parseData:audioChannelInfo,byteData:data,timestamp: timestamp }; 706 + let statusStr="关";
  707 + if(audioChannelInfo&&audioChannelInfo.status==1){
  708 + statusStr="开";
  709 + }
  710 + this.mediaChannleList[audioChannelInfo.channelId][timestamp]={parseData:audioChannelInfo,byteData:data,timestamp: timestamp,status:statusStr};
693 } catch (err) { 711 } catch (err) {
694 loger.log("RCAudioChannelInfoPdu->unPackPdu->error->" + tableItem.itemIdx + " err:" + err.message); 712 loger.log("RCAudioChannelInfoPdu->unPackPdu->error->" + tableItem.itemIdx + " err:" + err.message);
695 } 713 }
@@ -94,6 +94,7 @@ export default class Ape extends Emiter { @@ -94,6 +94,7 @@ export default class Ape extends Emiter {
94 let regPdu = pdu['RCAdapterPdu'].decode(regBuffer); 94 let regPdu = pdu['RCAdapterPdu'].decode(regBuffer);
95 let regItems = regPdu.item; 95 let regItems = regPdu.item;
96 let regItemSize = regItems.length; 96 let regItemSize = regItems.length;
  97 + //console.log("RCAdapterPdu数据同步处理",regPdu);
97 //loger.log(this._session_name + '数据同步消息'); 98 //loger.log(this._session_name + '数据同步消息');
98 //loger.log(this._session_name + '数据同步消息.同步条数', regItemSize,"seekTime->",seekTime); 99 //loger.log(this._session_name + '数据同步消息.同步条数', regItemSize,"seekTime->",seekTime);
99 for (var i = 0; i < regItemSize; ++i) { 100 for (var i = 0; i < regItemSize; ++i) {
@@ -332,7 +333,11 @@ export default class Ape extends Emiter { @@ -332,7 +333,11 @@ export default class Ape extends Emiter {
332 //loger.log('Ape发送数据NORMAL PDU'); 333 //loger.log('Ape发送数据NORMAL PDU');
333 //console.log(appPdu); 334 //console.log(appPdu);
334 //loger.log('当前的状态============',GlobalConfig.getCurrentStatus().code); 335 //loger.log('当前的状态============',GlobalConfig.getCurrentStatus().code);
335 - if (GlobalConfig.getCurrentStatus().code == 0 || GlobalConfig.getCurrentStatus().code == 1) { 336 + /* if (GlobalConfig.getCurrentStatus().code == 0 || GlobalConfig.getCurrentStatus().code == 1) {
  337 + this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_APE_SEND_FAILED_NO_JOIN);
  338 + return;
  339 + }*/
  340 + if(!this.mcu||!this.mcu.connected){
336 this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_APE_SEND_FAILED_NO_JOIN); 341 this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_APE_SEND_FAILED_NO_JOIN);
337 return; 342 return;
338 } 343 }
@@ -391,7 +396,6 @@ export default class Ape extends Emiter { @@ -391,7 +396,6 @@ export default class Ape extends Emiter {
391 this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_APE_SEND_FAILED_NO_JOIN); 396 this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_APE_SEND_FAILED_NO_JOIN);
392 return; 397 return;
393 } 398 }
394 -  
395 let uniformPdu = pdu.create_uniform_pdu( 399 let uniformPdu = pdu.create_uniform_pdu(
396 appPdu.type, 400 appPdu.type,
397 this._classInfo.nodeId, 401 this._classInfo.nodeId,
@@ -470,7 +470,7 @@ class AudioApe extends Ape { @@ -470,7 +470,7 @@ class AudioApe extends Ape {
470 470
471 //更新媒体文件模块的录制信息,每次开启录制的时候需要把当前媒体文件的信息更新一次 471 //更新媒体文件模块的录制信息,每次开启录制的时候需要把当前媒体文件的信息更新一次
472 updaterRecordApeStatus(_param) { 472 updaterRecordApeStatus(_param) {
473 - console.warn("录制状态发送改变->更新当前的状态->", this.mediaModule.mediaChannels); 473 + loger.warn("录制状态发送改变->更新当前的状态->", this.mediaModule.mediaChannels);
474 for (let i in this.mediaModule.mediaChannels) { 474 for (let i in this.mediaModule.mediaChannels) {
475 let channelInfo = this.mediaModule.mediaChannels[i]; 475 let channelInfo = this.mediaModule.mediaChannels[i];
476 if (channelInfo) { 476 if (channelInfo) {
@@ -271,10 +271,10 @@ class ConferApe extends Ape { @@ -271,10 +271,10 @@ class ConferApe extends Ape {
271 loger.warn('不能再录制,录制时间已经达到最大限制', GlobalConfig.recordTimestamp); 271 loger.warn('不能再录制,录制时间已经达到最大限制', GlobalConfig.recordTimestamp);
272 return; 272 return;
273 } 273 }
274 - 274 + loger.warn('检测是否需要开启录制', "isHost", GlobalConfig.isHost, "recordStatus", GlobalConfig.recordStatus,"当前人数:"+this.rosterLen);
275 //如果是host或者当前课堂只有1个人 275 //如果是host或者当前课堂只有1个人
276 if (GlobalConfig.isHost||this.rosterLen<=1) { 276 if (GlobalConfig.isHost||this.rosterLen<=1) {
277 - if(GlobalConfig.recordStatus){ 277 + /* if(GlobalConfig.recordStatus){
278 loger.warn("课堂已经是录制状态不->不需要再开启,isHost", GlobalConfig.isHost, "recordStatus", GlobalConfig.recordStatus,"当前人数:"+this.rosterLen); 278 loger.warn("课堂已经是录制状态不->不需要再开启,isHost", GlobalConfig.isHost, "recordStatus", GlobalConfig.recordStatus,"当前人数:"+this.rosterLen);
279 }else{ 279 }else{
280 loger.warn('开启录制', "isHost", GlobalConfig.isHost, "recordStatus", GlobalConfig.recordStatus,"当前人数:"+this.rosterLen); 280 loger.warn('开启录制', "isHost", GlobalConfig.isHost, "recordStatus", GlobalConfig.recordStatus,"当前人数:"+this.rosterLen);
@@ -282,8 +282,12 @@ class ConferApe extends Ape { @@ -282,8 +282,12 @@ class ConferApe extends Ape {
282 this.sendConferRecordMsg({"recordStatus": true}); 282 this.sendConferRecordMsg({"recordStatus": true});
283 this._emit(MessageTypes.CLASS_STATUS_INFO_CHANGE); 283 this._emit(MessageTypes.CLASS_STATUS_INFO_CHANGE);
284 this._emit(MessageTypes.CLASS_RECORD_START); //课堂开始录制 284 this._emit(MessageTypes.CLASS_RECORD_START); //课堂开始录制
285 - }  
286 - 285 + }*/
  286 + loger.warn('开启录制', "isHost", GlobalConfig.isHost, "recordStatus", GlobalConfig.recordStatus,"当前人数:"+this.rosterLen);
  287 + GlobalConfig.classStopTime = EngineUtils.creatTimestampStr();
  288 + this.sendConferRecordMsg({"recordStatus": true});
  289 + this._emit(MessageTypes.CLASS_STATUS_INFO_CHANGE);
  290 + this._emit(MessageTypes.CLASS_RECORD_START); //课堂开始录制
287 } 291 }
288 } 292 }
289 293
@@ -434,7 +438,8 @@ class ConferApe extends Ape { @@ -434,7 +438,8 @@ class ConferApe extends Ape {
434 this._emit(MessageTypes.CLASS_STATUS_INFO_CHANGE, _param); 438 this._emit(MessageTypes.CLASS_STATUS_INFO_CHANGE, _param);
435 //this.sendUpdaterClassStatusInfo({"actionType": 2, isStopAllPublishMedia: true}); 439 //this.sendUpdaterClassStatusInfo({"actionType": 2, isStopAllPublishMedia: true});
436 this.sendUpdaterClassStatusInfo({"actionType": ApeConsts.CLASS_STATUS_PAUSE, isStopAllPublishMedia: false}); 440 this.sendUpdaterClassStatusInfo({"actionType": ApeConsts.CLASS_STATUS_PAUSE, isStopAllPublishMedia: false});
437 - this.stopTimerCounter(); 441 +
  442 + //this.stopTimerCounter();//新版的录制规则,尝试暂停不停止计时器
438 } 443 }
439 444
440 //关闭课堂 445 //关闭课堂
@@ -605,6 +610,7 @@ class ConferApe extends Ape { @@ -605,6 +610,7 @@ class ConferApe extends Ape {
605 } 610 }
606 loger.log('课堂模块初始完成->当前课堂状态:'+ GlobalConfig.classStatus,"recordStatus:"+GlobalConfig.recordStatus); 611 loger.log('课堂模块初始完成->当前课堂状态:'+ GlobalConfig.classStatus,"recordStatus:"+GlobalConfig.recordStatus);
607 this.timerCounter.addTimerCallBack(this.timerCounterUptate.bind(this), 1); 612 this.timerCounter.addTimerCallBack(this.timerCounterUptate.bind(this), 1);
  613 +
608 //2秒后执行开始上课和开始录制的判断逻辑 614 //2秒后执行开始上课和开始录制的判断逻辑
609 clearTimeout(this.startClassTimer); 615 clearTimeout(this.startClassTimer);
610 this.startClassTimer=setTimeout(()=>{ 616 this.startClassTimer=setTimeout(()=>{
@@ -658,9 +664,36 @@ class ConferApe extends Ape { @@ -658,9 +664,36 @@ class ConferApe extends Ape {
658 this.stopTimerCounter(); 664 this.stopTimerCounter();
659 return; 665 return;
660 } 666 }
661 - //课堂开始的状态下,课堂进行时间和录制时间都需要更加,录制时间会大于或等于课堂开始的累积时间 667 + //更新课堂进行时间
662 if (GlobalConfig.classStatus == ApeConsts.CLASS_STATUS_STARTED) { 668 if (GlobalConfig.classStatus == ApeConsts.CLASS_STATUS_STARTED) {
663 GlobalConfig.classTimestamp = GlobalConfig.classTimestamp + 1; //计时 669 GlobalConfig.classTimestamp = GlobalConfig.classTimestamp + 1; //计时
  670 + //向应用层更新当前课堂进行的时间长度 (秒)
  671 + this._emit(MessageTypes.CLASS_UPDATE_TIMER, {"classTimestamp": GlobalConfig.classTimestamp});
  672 + //以一定的时间间隔同步课堂内所有人的累积上课时间
  673 + if (GlobalConfig.classTimestamp % GlobalConfig.updateClassInfoDelay == 0) {
  674 + //如果是host身份,需要同步时间给其他人,同时把当前的状态上传到服务器
  675 + if (GlobalConfig.isHost||this.rosterLen<=1) {
  676 + //保存数据到Sass
  677 + this._emit(MessageTypes.CLASS_STATUS_INFO_CHANGE);
  678 + //同步消息给其他人
  679 + this.sendUpdaterClassStatusInfo({"actionType": ApeConsts.CLASS_STATUS_STARTED, isStopAllPublishMedia: false});
  680 + }
  681 + }
  682 +
  683 + //进行MS动态选点,选择最快的MS服务器地址(录制回放不做处理)
  684 + if (!GlobalConfig.isRecordPlayBack && GlobalConfig.classTimestamp % GlobalConfig.msDynamicChooseIpDelay == 0) {
  685 + //MS推流选点
  686 + this._emit(MessageTypes.SWITCH_MS_IP);
  687 + //MS拉流选点
  688 + this._emit(MessageTypes.SWITCH_RTMP_PULL_IP);
  689 + //HLS拉流选点
  690 + this._emit(MessageTypes.SWITCH_HLS_IP);
  691 + }
  692 + }
  693 + //更新录制进行时间
  694 +
  695 + /* if (GlobalConfig.classStatus == ApeConsts.CLASS_STATUS_STARTED) {
  696 + GlobalConfig.classTimestamp = GlobalConfig.classTimestamp + 1; //计时
664 //老师身份的时候要记录录制的时间 697 //老师身份的时候要记录录制的时间
665 if (GlobalConfig.isHost||this.rosterLen<=1) { 698 if (GlobalConfig.isHost||this.rosterLen<=1) {
666 GlobalConfig.recordTimestamp = GlobalConfig.recordTimestamp + 1; 699 GlobalConfig.recordTimestamp = GlobalConfig.recordTimestamp + 1;
@@ -700,7 +733,7 @@ class ConferApe extends Ape { @@ -700,7 +733,7 @@ class ConferApe extends Ape {
700 this.sendUpdaterClassStatusInfo({"actionType": ApeConsts.CLASS_STATUS_STARTED, isStopAllPublishMedia: false}); 733 this.sendUpdaterClassStatusInfo({"actionType": ApeConsts.CLASS_STATUS_STARTED, isStopAllPublishMedia: false});
701 } 734 }
702 } 735 }
703 - } 736 + }*/
704 737
705 /* //如果还没开始或已经暂停、关闭,不做计时处理 738 /* //如果还没开始或已经暂停、关闭,不做计时处理
706 if (GlobalConfig.classStatus != ApeConsts.CLASS_STATUS_STARTED) { 739 if (GlobalConfig.classStatus != ApeConsts.CLASS_STATUS_STARTED) {
@@ -939,11 +972,11 @@ class ConferApe extends Ape { @@ -939,11 +972,11 @@ class ConferApe extends Ape {
939 // 1.当前课堂只有自己;2.自己的身份不是host;3当前的课堂状态为(CLASS_STATUS_STARTED= 1;//直播中) 972 // 1.当前课堂只有自己;2.自己的身份不是host;3当前的课堂状态为(CLASS_STATUS_STARTED= 1;//直播中)
940 this.rosterLen = Object.keys(this.rosters).length; 973 this.rosterLen = Object.keys(this.rosters).length;
941 GlobalConfig.rosterNumber = this.rosterLen;//记录当前的总人数 974 GlobalConfig.rosterNumber = this.rosterLen;//记录当前的总人数
942 - if (this.rosterLen <=1 && !GlobalConfig.isHost && GlobalConfig.classStatus == ApeConsts.CLASS_STATUS_STARTED) { 975 + /* if (this.rosterLen <=1 && !GlobalConfig.isHost && GlobalConfig.classStatus == ApeConsts.CLASS_STATUS_STARTED) {
943 loger.warn("当前课堂没有老师->暂停课堂"); 976 loger.warn("当前课堂没有老师->暂停课堂");
944 this.pauseClass({isForce: true}); 977 this.pauseClass({isForce: true});
945 //this.stopRecord(true); 978 //this.stopRecord(true);
946 - } 979 + }*/
947 //处理用户信息 980 //处理用户信息
948 this.unPackRosterInfo(nodeId, nodeData); 981 this.unPackRosterInfo(nodeId, nodeData);
949 return; 982 return;
@@ -963,7 +996,7 @@ class ConferApe extends Ape { @@ -963,7 +996,7 @@ class ConferApe extends Ape {
963 deviceType: nodeData.deviceType 996 deviceType: nodeData.deviceType
964 } 997 }
965 if (nodeData.role == ApeConsts.NR_HOST && GlobalConfig.isHost) { 998 if (nodeData.role == ApeConsts.NR_HOST && GlobalConfig.isHost) {
966 - loger.warn("相同身份的人进入->自己被踢出->进入的人员信息", nodeData); 999 + loger.warn("相同身份的人进入->自己被踢出->进入的人员信息","userName:"+ nodeData.name,"userId:"+ nodeData.userId,"userRole:"+ nodeData.userRole,"nodeId:"+ nodeData.nodeId,"deviceType:"+ nodeData.deviceType);
967 this.kickOutRoster(newUserInfo); 1000 this.kickOutRoster(newUserInfo);
968 return; 1001 return;
969 } else if (nodeData.userId == GlobalConfig.userId && GlobalConfig.userId != "0") { 1002 } else if (nodeData.userId == GlobalConfig.userId && GlobalConfig.userId != "0") {
@@ -599,7 +599,7 @@ class VideoApe extends Ape { @@ -599,7 +599,7 @@ class VideoApe extends Ape {
599 599
600 //更新媒体文件模块的录制信息,每次开启录制的时候需要把当前媒体文件的信息更新一次 600 //更新媒体文件模块的录制信息,每次开启录制的时候需要把当前媒体文件的信息更新一次
601 updaterRecordApeStatus(_param) { 601 updaterRecordApeStatus(_param) {
602 - console.warn("录制状态发送改变->更新当前的状态->", this.mediaModule.mediaChannels); 602 + loger.warn("录制状态发送改变->更新当前的状态->", this.mediaModule.mediaChannels);
603 for (let i in this.mediaModule.mediaChannels) { 603 for (let i in this.mediaModule.mediaChannels) {
604 let channelInfo = this.mediaModule.mediaChannels[i]; 604 let channelInfo = this.mediaModule.mediaChannels[i];
605 if (channelInfo) { 605 if (channelInfo) {
@@ -608,6 +608,10 @@ class VideoApe extends Ape { @@ -608,6 +608,10 @@ class VideoApe extends Ape {
608 } else { 608 } else {
609 channelInfo.owner = channelInfo.fromNodeId; 609 channelInfo.owner = channelInfo.fromNodeId;
610 } 610 }
  611 + //owner为0就是没有使用
  612 + if(channelInfo.owner==0){
  613 + channelInfo.status == ApeConsts.CHANNEL_STATUS_RELEASED
  614 + }
611 this.sendTableUpdateHandler(channelInfo); 615 this.sendTableUpdateHandler(channelInfo);
612 } 616 }
613 } 617 }