李勇

1.腾讯云录制去掉flv录制 只保留hls

2.处理视频消息更新时的释放检测处理,必须是当前课堂人人数大于0的时候才处理,否则会把正常的视频消息释放掉,因为加入课堂之后有先收到视频消息后收到课堂人员加入的消息;H5不做释放处理;
3.默认的白板增加文件type类型;
4.360chrome浏览器的判断  版本增加到55
@@ -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.25.7.20171031"; 66 + GlobalConfig.sdkVersion = "v2.26.2.20171102";
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 //设置
@@ -413,6 +413,7 @@ export default class MessageEntrance extends Emiter { @@ -413,6 +413,7 @@ export default class MessageEntrance extends Emiter {
413 errorMessage = {"code": _data.type, "reson": MessageTypes.ErrorReson[_data.type], "data": _data.data}; 413 errorMessage = {"code": _data.type, "reson": MessageTypes.ErrorReson[_data.type], "data": _data.data};
414 } 414 }
415 break; 415 break;
  416 +
416 default : 417 default :
417 errorMessage = {"code": _data, "reson": MessageTypes.ErrorReson[_data], "data": {}}; 418 errorMessage = {"code": _data, "reson": MessageTypes.ErrorReson[_data], "data": {}};
418 break; 419 break;
@@ -439,7 +440,14 @@ export default class MessageEntrance extends Emiter { @@ -439,7 +440,14 @@ export default class MessageEntrance extends Emiter {
439 440
440 //执行离开课堂断开连接的流程 441 //执行离开课堂断开连接的流程
441 _runClassExit(_type) { 442 _runClassExit(_type) {
  443 + if( GlobalConfig.classExit){
  444 + console.log("已经离开课堂");
  445 + return;
  446 + }
442 this._leaveClass(_type); 447 this._leaveClass(_type);
  448 + //记录是否已经离开课堂,离开之后不做MCU重连
  449 + GlobalConfig.classExit=true;
  450 + LogManager.IS_OPEN_SEND_LOG = false;//断开之后不再上报日志
443 } 451 }
444 452
445 //当前的课堂状态信息发生改变,需要保存课堂状态到Sass 453 //当前的课堂状态信息发生改变,需要保存课堂状态到Sass
@@ -1811,7 +1819,8 @@ export default class MessageEntrance extends Emiter { @@ -1811,7 +1819,8 @@ export default class MessageEntrance extends Emiter {
1811 url: "http://pclive.xuedianyun.com/DocSharing/data/whiteboard/default/whiteboard.pdf", 1819 url: "http://pclive.xuedianyun.com/DocSharing/data/whiteboard/default/whiteboard.pdf",
1812 dynamicTransferStatic: "0", 1820 dynamicTransferStatic: "0",
1813 relativeUrl: "/DocSharing/data/whiteboard/default/whiteboard.pdf", 1821 relativeUrl: "/DocSharing/data/whiteboard/default/whiteboard.pdf",
1814 - fileType: "pdf" 1822 + fileType: "pdf",
  1823 + type:"pdf"
1815 } 1824 }
1816 GlobalConfig.docListPrepare.push(whiteBoradData); 1825 GlobalConfig.docListPrepare.push(whiteBoradData);
1817 1826
@@ -2538,7 +2547,7 @@ export default class MessageEntrance extends Emiter { @@ -2538,7 +2547,7 @@ export default class MessageEntrance extends Emiter {
2538 let paramInfo = { 2547 let paramInfo = {
2539 "pageNum": value.pdfSize || value.pageNum, 2548 "pageNum": value.pdfSize || value.pageNum,
2540 "fileName": value.name, 2549 "fileName": value.name,
2541 - "fileType": value.type, 2550 + "fileType": value.type||value.fileType,
2542 "relativeUrl": value.relativeLocation || value.relativeUrl, 2551 "relativeUrl": value.relativeLocation || value.relativeUrl,
2543 "url": value.absoluteLocation || value.url, 2552 "url": value.absoluteLocation || value.url,
2544 "creatUserId": value.createUserID || 0, 2553 "creatUserId": value.createUserID || 0,
@@ -412,6 +412,8 @@ GlobalConfig.msType = 1; //目前固定用这个 @@ -412,6 +412,8 @@ GlobalConfig.msType = 1; //目前固定用这个
412 GlobalConfig.messageDelay = false; //是否启用消息延迟 412 GlobalConfig.messageDelay = false; //是否启用消息延迟
413 GlobalConfig.mcuDelay = 0; //默认的延迟时间(单位-秒) 413 GlobalConfig.mcuDelay = 0; //默认的延迟时间(单位-秒)
414 414
  415 +GlobalConfig.classExit=false;//是否关闭课堂,如果关闭之后不再连接MCU
  416 +
415 GlobalConfig.docDelay = 1600; //文档模块加入成功之后延迟发送送成功的消息给主模块(sdk内部使用) 417 GlobalConfig.docDelay = 1600; //文档模块加入成功之后延迟发送送成功的消息给主模块(sdk内部使用)
416 GlobalConfig.portal = ""; //Sass IP 418 GlobalConfig.portal = ""; //Sass IP
417 419
@@ -180,7 +180,7 @@ class SystemConfig { @@ -180,7 +180,7 @@ class SystemConfig {
180 if (window.clientInformation.languages.length > 2) { 180 if (window.clientInformation.languages.length > 2) {
181 Sys.explorer = "chrome"; 181 Sys.explorer = "chrome";
182 loger.log("chrome", Sys); 182 loger.log("chrome", Sys);
183 - } else if (window.clientInformation.languages.length == 2&&versionNum<55) { 183 + } else if (window.clientInformation.languages.length == 2&&versionNum<=55) {
184 var _track = 'track' in document.createElement('track'); 184 var _track = 'track' in document.createElement('track');
185 var webstoreKeysLength = window.chrome && window.chrome.webstore ? Object.keys(window.chrome.webstore).length : 0; 185 var webstoreKeysLength = window.chrome && window.chrome.webstore ? Object.keys(window.chrome.webstore).length : 0;
186 if (_track) { 186 if (_track) {
@@ -931,7 +931,7 @@ class ConferApe extends Ape { @@ -931,7 +931,7 @@ class ConferApe extends Ape {
931 rosterInsertHandler(nodeId, nodeData) { 931 rosterInsertHandler(nodeId, nodeData) {
932 //loger.log("人员进入--->"); 932 //loger.log("人员进入--->");
933 if (GlobalConfig.nodeId == nodeId) { 933 if (GlobalConfig.nodeId == nodeId) {
934 - 934 + loger.log("人员进入课堂模块--->自己");
935 } else { 935 } else {
936 // loger.log("有人加入 rosterInsertHandler"); 936 // loger.log("有人加入 rosterInsertHandler");
937 this.rosterUpdateHandler(nodeId, nodeData); 937 this.rosterUpdateHandler(nodeId, nodeData);
@@ -1038,9 +1038,19 @@ class ConferApe extends Ape { @@ -1038,9 +1038,19 @@ class ConferApe extends Ape {
1038 updaterRosterStatus(_param) { 1038 updaterRosterStatus(_param) {
1039 //loger.log("媒体模块发生更新,人员状态需要更新,fromNodeId->",_param); 1039 //loger.log("媒体模块发生更新,人员状态需要更新,fromNodeId->",_param);
1040 //如果视频消息中channel的占用人 fromNodeId在人员列表中不存在,需要释放这channel,因为这个有可能是之前没释放成功的 1040 //如果视频消息中channel的占用人 fromNodeId在人员列表中不存在,需要释放这channel,因为这个有可能是之前没释放成功的
1041 - if (_param && _param.status == ApeConsts.CHANNEL_STATUS_OPENING && this.rosters[_param.fromNodeId] == null) {  
1042 - loger.log("媒体模块被占用->占有人已经不存在课堂中->释放->", _param);  
1043 - this._emit(MessageTypes.CLASS_NONENTITY_ROSTER, {"nodeId": _param.fromNodeId}); 1041 + if (_param && _param.status == ApeConsts.CHANNEL_STATUS_OPENING) {
  1042 + //如果推流的人员已经不存在,并且当前课堂内人员大于0;
  1043 + // 如果不判断当前的人数,会出现把正常的视频消息释放的情况;
  1044 + // 因为会出现先收到视频消息后收到人员加入和更新的消息
  1045 + if(this.rosters[_param.fromNodeId] == null&&this.rosterLen>0){
  1046 + //H5不做释放处理
  1047 + if(GlobalConfig.deviceType==3){
  1048 + loger.warn("H5不做媒体模块的频道释放->当前总人数->"+this.rosterLen, _param);
  1049 + return ;
  1050 + }
  1051 + loger.warn("媒体模块被占用->占有人已经不存在课堂中->释放->当前总人数->"+this.rosterLen, _param);
  1052 + this._emit(MessageTypes.CLASS_NONENTITY_ROSTER, {"nodeId": _param.fromNodeId});
  1053 + }
1044 } 1054 }
1045 } 1055 }
1046 1056
@@ -151,7 +151,8 @@ class MediaModule { @@ -151,7 +151,8 @@ class MediaModule {
151 txTime=txTime.toString(16); 151 txTime=txTime.toString(16);
152 let txSecret= MD5(publishSuffix + streamId+txTime); 152 let txSecret= MD5(publishSuffix + streamId+txTime);
153 //rtmp://11220.livepush.myqcloud.com/live/11220_c5a1ea0bce?bizid=11220&txSecret=b1d8af72bf62366eef31cbb5dc5c8778&txTime=59C5337F 153 //rtmp://11220.livepush.myqcloud.com/live/11220_c5a1ea0bce?bizid=11220&txSecret=b1d8af72bf62366eef31cbb5dc5c8778&txTime=59C5337F
154 - newUrl=url +"?bizid=11220&txSecret="+txSecret+"&txTime="+txTime+"&record=hls|flv&record_interval=5400"; 154 + //newUrl=url +"?bizid=11220&txSecret="+txSecret+"&txTime="+txTime+"&record=hls|flv&record_interval=5400";
  155 + newUrl=url +"?bizid=11220&txSecret="+txSecret+"&txTime="+txTime+"&record=hls&record_interval=5400";
155 loger.log("生成的推流地址->"+newUrl); 156 loger.log("生成的推流地址->"+newUrl);
156 return newUrl; 157 return newUrl;
157 } 158 }
@@ -45,6 +45,7 @@ class VideoApe extends Ape { @@ -45,6 +45,7 @@ class VideoApe extends Ape {
45 //ape加入成功 45 //ape加入成功
46 onJoinChannelHandlerSuccess() { 46 onJoinChannelHandlerSuccess() {
47 //这个设置很重要,因为只有Sass流程完成之后,APE才能取得GlobalConfig中的数据 47 //这个设置很重要,因为只有Sass流程完成之后,APE才能取得GlobalConfig中的数据
  48 + loger.log('视频模块初始完成->');
48 this.mediaModule.maxMediaChannel = GlobalConfig.maxVideoChannels; 49 this.mediaModule.maxMediaChannel = GlobalConfig.maxVideoChannels;
49 } 50 }
50 51
@@ -524,7 +525,7 @@ class VideoApe extends Ape { @@ -524,7 +525,7 @@ class VideoApe extends Ape {
524 adapterPdu.type = pdu.RCPDU_REG_ADAPTER; 525 adapterPdu.type = pdu.RCPDU_REG_ADAPTER;
525 adapterPdu.item.push(adapterItemPdu); 526 adapterPdu.item.push(adapterItemPdu);
526 527
527 - loger.log("发送更新VIDEO " + tableItemPdu.itemIdx); 528 + loger.log("发送消息MCU更新VIDEO模块->channel:" + tableItemPdu.itemIdx);
528 this.sendUniform(adapterPdu, true); 529 this.sendUniform(adapterPdu, true);
529 } 530 }
530 531
@@ -590,11 +591,10 @@ class VideoApe extends Ape { @@ -590,11 +591,10 @@ class VideoApe extends Ape {
590 }else { 591 }else {
591 //判断接收者的id,如果不是0,并且也不是自己的nodeId,那么消息不做处理 592 //判断接收者的id,如果不是0,并且也不是自己的nodeId,那么消息不做处理
592 if (videoReceivePdu.toNodeId != 0 && videoReceivePdu.toNodeId != GlobalConfig.nodeId) { 593 if (videoReceivePdu.toNodeId != 0 && videoReceivePdu.toNodeId != GlobalConfig.nodeId) {
593 - loger.log('视频消息不处理 toNodeId=', videoReceivePdu.toNodeId, "my nodeId=", GlobalConfig.nodeId); 594 + loger.log('视频消息不处理->接收人ID:'+videoReceivePdu.toNodeId, "自己的ID:"+GlobalConfig.nodeId);
594 } else { 595 } else {
595 loger.log('视频控制消息处理 .', videoReceivePdu); 596 loger.log('视频控制消息处理 .', videoReceivePdu);
596 this._emit(MessageTypes.VIDEO_BROADCAST, videoReceivePdu); 597 this._emit(MessageTypes.VIDEO_BROADCAST, videoReceivePdu);
597 -  
598 let data=videoReceivePdu.data; 598 let data=videoReceivePdu.data;
599 if(data){ 599 if(data){
600 switch (videoReceivePdu.actionType){ 600 switch (videoReceivePdu.actionType){
@@ -633,12 +633,11 @@ class VideoApe extends Ape { @@ -633,12 +633,11 @@ class VideoApe extends Ape {
633 } 633 }
634 tableUpdateHandler(owner, itemIdx, itemData, seek) { 634 tableUpdateHandler(owner, itemIdx, itemData, seek) {
635 let unpackChannelInfo = this.unPackPdu(owner, itemIdx, itemData); 635 let unpackChannelInfo = this.unPackPdu(owner, itemIdx, itemData);
636 - loger.log("视频模块数据更新->channel", itemIdx, 'mediaType', unpackChannelInfo.mediaType, 'status->', unpackChannelInfo.status, "seek->", seek);  
637 - 636 + loger.log("视频模块数据更新->channel:"+itemIdx+' mediaType:'+unpackChannelInfo.mediaType+' status->'+unpackChannelInfo.status+" seek->", seek);
638 //****很重要******** 637 //****很重要********
639 //如果owner的值为0,代表的是这个歌频道已经被释放了(mcu服务端对于占用channel的掉线用户,就是把owner设置为0) 638 //如果owner的值为0,代表的是这个歌频道已经被释放了(mcu服务端对于占用channel的掉线用户,就是把owner设置为0)
640 if (owner == 0) { 639 if (owner == 0) {
641 - loger.log("释放占用的频道,channel", itemIdx); 640 + loger.log("MCU返回值owner=0->释放占用的频道,channel:"+itemIdx);
642 unpackChannelInfo.status = ApeConsts.CHANNEL_STATUS_RELEASED; 641 unpackChannelInfo.status = ApeConsts.CHANNEL_STATUS_RELEASED;
643 unpackChannelInfo.streamId = ""; 642 unpackChannelInfo.streamId = "";
644 } 643 }
@@ -202,6 +202,10 @@ class MCU extends Emiter { @@ -202,6 +202,10 @@ class MCU extends Emiter {
202 202
203 // 主动建立MCU连接 203 // 主动建立MCU连接
204 joinMCU(_classInfo) { 204 joinMCU(_classInfo) {
  205 + if(GlobalConfig.classExit==true){
  206 + loger.warn("已经关闭课堂->不再连接MCU");
  207 + return;
  208 + }
205 loger.log('开始建立EverSocket通道.'); 209 loger.log('开始建立EverSocket通道.');
206 GlobalConfig.classJoinSuccess = false; 210 GlobalConfig.classJoinSuccess = false;
207 loger.log(_classInfo); 211 loger.log(_classInfo);