李勇

1.处理设置旁路地址后30秒内不推流地址失效的问题,超过30秒后推流会重新加入频道再推流

@@ -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.0.20171030"; 66 + GlobalConfig.sdkVersion = "v2.25.6.20171031";
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 //设置
@@ -101,6 +101,7 @@ export default class MessageEntrance extends Emiter { @@ -101,6 +101,7 @@ export default class MessageEntrance extends Emiter {
101 _webRtc.on('*', (type, data) => this._emit(type, data)); 101 _webRtc.on('*', (type, data) => this._emit(type, data));
102 _webRtc.on(MessageTypes.USER_DEVICE_STATUS_CHAANGE, this.userDeviecStatusChange.bind(this)); //监听摄像头和麦克风的开启状态 102 _webRtc.on(MessageTypes.USER_DEVICE_STATUS_CHAANGE, this.userDeviecStatusChange.bind(this)); //监听摄像头和麦克风的开启状态
103 _webRtc.on(MessageTypes.MEDIA_PUBLISH_STATUS_CHANGE, this.mediaPublishStatusChange.bind(this)); //webRtc推流状态发生改变 103 _webRtc.on(MessageTypes.MEDIA_PUBLISH_STATUS_CHANGE, this.mediaPublishStatusChange.bind(this)); //webRtc推流状态发生改变
  104 + _webRtc.on(WebRtcApe.RE_JOIN_CHANNEL, this._webRtcRejoinChannel.bind(this)); //重先加入音视频频道
104 105
105 // Sass平台层 106 // Sass平台层
106 _sass = Sass; 107 _sass = Sass;
@@ -1070,7 +1071,7 @@ export default class MessageEntrance extends Emiter { @@ -1070,7 +1071,7 @@ export default class MessageEntrance extends Emiter {
1070 clearTimeout(this.saveClassStatusTimer); 1071 clearTimeout(this.saveClassStatusTimer);
1071 this.saveClassStatusTimer = setTimeout(()=> { 1072 this.saveClassStatusTimer = setTimeout(()=> {
1072 _sass.saveClassStatusInfo({"classStatusInfo": GlobalConfig.classStatusInfo}); //保存课堂状态信息 1073 _sass.saveClassStatusInfo({"classStatusInfo": GlobalConfig.classStatusInfo}); //保存课堂状态信息
1073 - }, 1000); 1074 + }, 1600);
1074 } else { 1075 } else {
1075 loger.log("没有保存课堂状态信息的权限->当前身份->" + GlobalConfig.userRole); 1076 loger.log("没有保存课堂状态信息的权限->当前身份->" + GlobalConfig.userRole);
1076 } 1077 }
@@ -1922,6 +1923,7 @@ export default class MessageEntrance extends Emiter { @@ -1922,6 +1923,7 @@ export default class MessageEntrance extends Emiter {
1922 dataObj.recordStatus = false; 1923 dataObj.recordStatus = false;
1923 GlobalConfig.setClassStatusInfo(dataObj); 1924 GlobalConfig.setClassStatusInfo(dataObj);
1924 this.lastClassActiveTime=dataObj.lastClassActiveTime||0; 1925 this.lastClassActiveTime=dataObj.lastClassActiveTime||0;
  1926 + loger.log(dataObj);
1925 } catch (err) { 1927 } catch (err) {
1926 loger.warn("getClassRecordInfo获取的课堂数据JSON转换失败->"); 1928 loger.warn("getClassRecordInfo获取的课堂数据JSON转换失败->");
1927 } 1929 }
@@ -2089,6 +2091,13 @@ export default class MessageEntrance extends Emiter { @@ -2089,6 +2091,13 @@ export default class MessageEntrance extends Emiter {
2089 } 2091 }
2090 } 2092 }
2091 2093
  2094 + /*
  2095 + * 监听webRtc
  2096 + * */
  2097 + _webRtcRejoinChannel(_data){
  2098 + this._reJoinChannel(_data)
  2099 + }
  2100 +
2092 //监听摄像头麦克风状态 2101 //监听摄像头麦克风状态
2093 userDeviecStatusChange(_data) { 2102 userDeviecStatusChange(_data) {
2094 /* nodeId:GlobalConfig.nodeId, 2103 /* nodeId:GlobalConfig.nodeId,
@@ -2508,12 +2517,13 @@ export default class MessageEntrance extends Emiter { @@ -2508,12 +2517,13 @@ export default class MessageEntrance extends Emiter {
2508 2517
2509 //文档加入频道成功,同步到MCU服务器上的数据 2518 //文档加入频道成功,同步到MCU服务器上的数据
2510 docJoinChannelSuccess() { 2519 docJoinChannelSuccess() {
2511 - let distance=new Date().getTime()-parseInt(this.lastClassActiveTime);  
2512 - loger.log("最后一次记录的时间->"+this.lastClassActiveTime,"当前时间:"+new Date().getTime(),"间隔:"+distance/1000); 2520 + let interval=new Date().getTime()-parseInt(this.lastClassActiveTime);
  2521 + loger.log("最后一次记录的时间->"+this.lastClassActiveTime,"当前时间:"+new Date().getTime(),"间隔:"+interval/1000);
2513 loger.log("文档加入频道成功->isHost=", GlobalConfig.isHost, "当前总人数:", GlobalConfig.rosterNumber, "sassDoclength=", GlobalConfig.docListPrepare.length); 2522 loger.log("文档加入频道成功->isHost=", GlobalConfig.isHost, "当前总人数:", GlobalConfig.rosterNumber, "sassDoclength=", GlobalConfig.docListPrepare.length);
2514 2523
2515 - //如果当前课堂内只有自己或者离开上次课堂的时间大于15分钟,需要停止服务端的视频录制  
2516 - if(GlobalConfig.rosterNumber<=1||distance>=(15*60)){ 2524 + //如果当前课堂内只有自己或者离开上次课堂的时间大于8分钟,需要停止服务端的视频录制
  2525 + if(GlobalConfig.rosterNumber<=1&&interval>=(8*60)){
  2526 + loger.log("调用服务端音视频停止录制->interval:"+interval);
2517 this._mediaRecordControl({"status": WebRtcApe.RECORD_STATUS_2}); 2527 this._mediaRecordControl({"status": WebRtcApe.RECORD_STATUS_2});
2518 } 2528 }
2519 2529
@@ -3010,19 +3020,25 @@ export default class MessageEntrance extends Emiter { @@ -3010,19 +3020,25 @@ export default class MessageEntrance extends Emiter {
3010 * 重新加入频道 3020 * 重新加入频道
3011 * */ 3021 * */
3012 _reJoinChannel(_params) { 3022 _reJoinChannel(_params) {
  3023 + //{publish:false}
3013 if (GlobalConfig.appId && !GlobalConfig.openFlash) { 3024 if (GlobalConfig.appId && !GlobalConfig.openFlash) {
3014 - //获取当前用户的推流状态,重新加入频道之后如果之前正在推流,重连后需要自动重推 3025 +
  3026 + //1.获取当前用户的推流状态,重新加入频道之后如果之前正在推流,重连后需要自动重推
3015 let isPublish=false; 3027 let isPublish=false;
3016 if(_webRtc){ 3028 if(_webRtc){
3017 isPublish=_webRtc.isPublish||false; 3029 isPublish=_webRtc.isPublish||false;
3018 } 3030 }
  3031 + //2.检测是否调用接口的时候传入了开启推流的参数
  3032 + if(_params&&_params.publish==true){
  3033 + isPublish=true;
  3034 + }
3019 loger.log("离开视频通话频道时的推流状态->"+isPublish); 3035 loger.log("离开视频通话频道时的推流状态->"+isPublish);
3020 //先离开频道 3036 //先离开频道
3021 this._leaveChannel(); 3037 this._leaveChannel();
3022 //主讲人和老师可以设置旁录 3038 //主讲人和老师可以设置旁录
3023 3039
3024 //加入之前先设置旁录地址,只有直播支持旁路(1路流) 3040 //加入之前先设置旁录地址,只有直播支持旁路(1路流)
3025 - if (_webRtc && GlobalConfig.isTeachOrAssistant && GlobalConfig.maxMediaChannels == 1) { 3041 + if (_webRtc && GlobalConfig.isTeachOrAssistant) {
3026 let curTimestamp = new Date().getTime(); 3042 let curTimestamp = new Date().getTime();
3027 let streamId = GlobalConfig.siteId + "_" + GlobalConfig.classId + "_" + GlobalConfig.userId + "_" + curTimestamp; 3043 let streamId = GlobalConfig.siteId + "_" + GlobalConfig.classId + "_" + GlobalConfig.userId + "_" + curTimestamp;
3028 //传入固定的流Id 3044 //传入固定的流Id
@@ -3045,7 +3061,7 @@ export default class MessageEntrance extends Emiter { @@ -3045,7 +3061,7 @@ export default class MessageEntrance extends Emiter {
3045 info: "" + GlobalConfig.userRole, 3061 info: "" + GlobalConfig.userRole,
3046 immediatePublish:isPublish 3062 immediatePublish:isPublish
3047 }); 3063 });
3048 - }, 1600); 3064 + }, 1000);
3049 } 3065 }
3050 } 3066 }
3051 3067
@@ -46,7 +46,7 @@ class LogManager { @@ -46,7 +46,7 @@ class LogManager {
46 clearTimeout(this.logDelayTimer); 46 clearTimeout(this.logDelayTimer);
47 this.logDelayTimer = setTimeout(function () { 47 this.logDelayTimer = setTimeout(function () {
48 _this.checkAndSendLog(); 48 _this.checkAndSendLog();
49 - }, 1600); 49 + }, 2000);
50 } 50 }
51 } 51 }
52 52
@@ -69,50 +69,6 @@ class LogManager { @@ -69,50 +69,6 @@ class LogManager {
69 let msgData = ""; 69 let msgData = "";
70 let tempArr = []; 70 let tempArr = [];
71 let msgLen = 0; 71 let msgLen = 0;
72 -  
73 - /* switch (msgType) {  
74 - case LogManager.ERROR:  
75 - msgLen = this.errorList.length;  
76 - for (let i = 0; i < msgLen; i++) {  
77 - let item = this.errorList.shift();  
78 - if (item) {  
79 - tempArr.push(item);  
80 - msgData += item + " \n ";  
81 - }  
82 - }  
83 - break;  
84 - case LogManager.WARN:  
85 - msgLen = this.warnList.length;  
86 - for (let i = 0; i < msgLen; i++) {  
87 - let item = this.warnList.shift();  
88 - if (item) {  
89 - tempArr.push(item);  
90 - msgData += item + " \n ";  
91 - }  
92 - }  
93 - break;  
94 - case LogManager.LOG:  
95 - msgLen = this.logList.length;  
96 - for (let i = 0; i < msgLen; i++) {  
97 - let item = this.logList.shift();  
98 - if (item) {  
99 - tempArr.push(item);  
100 - msgData += item + " \n ";  
101 - }  
102 - }  
103 - break;  
104 - default:  
105 - msgLen = this.allLogList.length;  
106 - for (let i = 0; i < msgLen; i++) {  
107 - let item = this.allLogList.shift();  
108 - if (item) {  
109 - tempArr.push(item);  
110 - msgData += item + " \n ";  
111 - }  
112 - }  
113 - break;  
114 - }  
115 - */  
116 msgLen = this.allLogList.length; 72 msgLen = this.allLogList.length;
117 for (let i = 0; i < msgLen; i++) { 73 for (let i = 0; i < msgLen; i++) {
118 let item = this.allLogList.shift(); 74 let item = this.allLogList.shift();
@@ -165,12 +121,6 @@ class LogManager { @@ -165,12 +121,6 @@ class LogManager {
165 121
166 //计算当前服务器时间 122 //计算当前服务器时间
167 static getCurrentDateTime() { 123 static getCurrentDateTime() {
168 - /* let currentServerTime = new Date().getTime() - this.serverAndLoacTimeDistanc * 1000;//计算当前服务器时间  
169 - let timeStr = new Date(currentServerTime).toLocaleString();  
170 - if (timeStr) {  
171 - timeStr = timeStr.replace(/年|月/g, "-").replace(/日/g, " ");  
172 - }  
173 - return timeStr;*/  
174 let currentServerTime = new Date().getTime() - this.serverAndLoacTimeDistanc * 1000;//计算当前服务器时间 124 let currentServerTime = new Date().getTime() - this.serverAndLoacTimeDistanc * 1000;//计算当前服务器时间
175 let time=new Date(currentServerTime); 125 let time=new Date(currentServerTime);
176 //显示格式20170729 16:42:00 INFO _msg 126 //显示格式20170729 16:42:00 INFO _msg
@@ -24,6 +24,7 @@ class WebRtcApe extends Emiter { @@ -24,6 +24,7 @@ class WebRtcApe extends Emiter {
24 this.appCertificate = ""; 24 this.appCertificate = "";
25 this.appRecordingKey = ""; 25 this.appRecordingKey = "";
26 26
  27 + this.setConfigTimestamp=0;//设置旁路地址的时间戳
27 this.configPublisherUrl = "";//旁路地址; 28 this.configPublisherUrl = "";//旁路地址;
28 this.m3u8Url="";//旁路拉流地址 29 this.m3u8Url="";//旁路拉流地址
29 this.rtmpUrl="";//旁路拉流地址 30 this.rtmpUrl="";//旁路拉流地址
@@ -57,6 +58,8 @@ class WebRtcApe extends Emiter { @@ -57,6 +58,8 @@ class WebRtcApe extends Emiter {
57 this.videoResolution = "240P"; 58 this.videoResolution = "240P";
58 this.isOpenVideo = true; 59 this.isOpenVideo = true;
59 60
  61 + this.firstPublishSuccess=false;//记录加入频道成功之后是否推流成功过,离开频道之后需要设置为false
  62 +
60 this.isPublish = false;//当前是否正在推流 63 this.isPublish = false;//当前是否正在推流
61 this.videoScale=1;//视图的缩放比例,默认为1; 64 this.videoScale=1;//视图的缩放比例,默认为1;
62 65
@@ -143,6 +146,7 @@ class WebRtcApe extends Emiter { @@ -143,6 +146,7 @@ class WebRtcApe extends Emiter {
143 this.client.on('stream-published', (evt)=> { 146 this.client.on('stream-published', (evt)=> {
144 loger.log("webRtc->推流成功->", new Date().getTime()); 147 loger.log("webRtc->推流成功->", new Date().getTime());
145 this.isPublish = true; 148 this.isPublish = true;
  149 + this.firstPublishSuccess=true;
146 GlobalConfig.openCamera = EngineUtils.creatTimestamp(); 150 GlobalConfig.openCamera = EngineUtils.creatTimestamp();
147 GlobalConfig.openMicrophones = GlobalConfig.openCamera; 151 GlobalConfig.openMicrophones = GlobalConfig.openCamera;
148 this._emit(MessageTypes.USER_DEVICE_STATUS_CHAANGE, { 152 this._emit(MessageTypes.USER_DEVICE_STATUS_CHAANGE, {
@@ -389,7 +393,7 @@ class WebRtcApe extends Emiter { @@ -389,7 +393,7 @@ class WebRtcApe extends Emiter {
389 clearTimeout(this.rePublishDelay); 393 clearTimeout(this.rePublishDelay);
390 this.rePublishDelay=setTimeout(()=>{ 394 this.rePublishDelay=setTimeout(()=>{
391 this.publish(); 395 this.publish();
392 - },600); 396 + },200);
393 } 397 }
394 }, (err)=> { 398 }, (err)=> {
395 loger.error("加入视频通话频道->失败->", err); 399 loger.error("加入视频通话频道->失败->", err);
@@ -439,6 +443,7 @@ class WebRtcApe extends Emiter { @@ -439,6 +443,7 @@ class WebRtcApe extends Emiter {
439 if (!this.client) { 443 if (!this.client) {
440 return; 444 return;
441 } 445 }
  446 + this.firstPublishSuccess=false;
442 this.unpublish(); 447 this.unpublish();
443 this.client.leave(() => { 448 this.client.leave(() => {
444 loger.log("离开视频通话频道->成功"); 449 loger.log("离开视频通话频道->成功");
@@ -465,6 +470,8 @@ class WebRtcApe extends Emiter { @@ -465,6 +470,8 @@ class WebRtcApe extends Emiter {
465 * 设置旁录地址 470 * 设置旁录地址
466 * */ 471 * */
467 setConfigPublisherUrl(_publishUrl){ 472 setConfigPublisherUrl(_publishUrl){
  473 + this.firstPublishSuccess=true;
  474 + this.setConfigTimestamp=new Date().getTime()/1000;
468 this.configPublisherUrl=_publishUrl; 475 this.configPublisherUrl=_publishUrl;
469 if(this.client&& this.configPublisherUrl){ 476 if(this.client&& this.configPublisherUrl){
470 let configObj={width: parseInt(this.pWidth), height: parseInt(this.pHeight), framerate: parseInt(this.pFrameRate), bitrate: parseInt(this.pBitrate), publishUrl:""+this.configPublisherUrl}; 477 let configObj={width: parseInt(this.pWidth), height: parseInt(this.pHeight), framerate: parseInt(this.pFrameRate), bitrate: parseInt(this.pBitrate), publishUrl:""+this.configPublisherUrl};
@@ -491,6 +498,19 @@ class WebRtcApe extends Emiter { @@ -491,6 +498,19 @@ class WebRtcApe extends Emiter {
491 if (!this.client || !this.localStream) { 498 if (!this.client || !this.localStream) {
492 return; 499 return;
493 } 500 }
  501 +
  502 + //老师-助教-主讲人-->设置旁路大于30秒没有推流,推流服务会停止,需要重设旁录和重加频道;
  503 + if(this.setConfigTimestamp>0&&GlobalConfig.isTeachOrAssistant){
  504 + //如果间隔大于28秒并且没有推过流需要重新加入频道,推成功一次之后就不需要
  505 + let interval=parseInt(new Date().getTime()/1000-this.setConfigTimestamp);
  506 + loger.log("设置旁路的时间和推流时间的间隔->"+interval+" firstPublishSuccess:"+ this.firstPublishSuccess);
  507 + if(interval>=28&&!this.firstPublishSuccess){
  508 + loger.warn("设置旁路大于30秒没有推流,推流服务会停止,需要重设旁录和重加频道");
  509 + this._emit(WebRtcApe.RE_JOIN_CHANNEL,{publish:true});
  510 + return;
  511 + }
  512 + }
  513 +
494 this.localStream.init(()=> { 514 this.localStream.init(()=> {
495 this.clearLocalView(); 515 this.clearLocalView();
496 let viewName = 'localVideoBox_' + this.uid; 516 let viewName = 'localVideoBox_' + this.uid;
@@ -877,6 +897,8 @@ class WebRtcApe extends Emiter { @@ -877,6 +897,8 @@ class WebRtcApe extends Emiter {
877 WebRtcApe.prototype.RECORD_STATUS_0 = WebRtcApe.RECORD_STATUS_0 = 0; //停止推流 897 WebRtcApe.prototype.RECORD_STATUS_0 = WebRtcApe.RECORD_STATUS_0 = 0; //停止推流
878 WebRtcApe.prototype.RECORD_STATUS_1 = WebRtcApe.RECORD_STATUS_1 = 1; //开始推流 898 WebRtcApe.prototype.RECORD_STATUS_1 = WebRtcApe.RECORD_STATUS_1 = 1; //开始推流
879 WebRtcApe.prototype.RECORD_STATUS_2 = WebRtcApe.RECORD_STATUS_2 = 2; //停止录制 899 WebRtcApe.prototype.RECORD_STATUS_2 = WebRtcApe.RECORD_STATUS_2 = 2; //停止录制
  900 +WebRtcApe.prototype.RE_JOIN_CHANNEL = WebRtcApe.RE_JOIN_CHANNEL = "reJoninChanel";//重加入频道
  901 +
880 export default new WebRtcApe; 902 export default new WebRtcApe;
881 903
882 904