李勇

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

... ... @@ -63,7 +63,7 @@ export default class MessageEntrance extends Emiter {
super();
this.lastClassActiveTime=0;//最后一次课堂激活的时间戳
//sdk 信息
GlobalConfig.sdkVersion = "v2.25.0.20171030";
GlobalConfig.sdkVersion = "v2.25.6.20171031";
loger.warn("sdkVersion:" + GlobalConfig.sdkVersion);
console.log("sdkVersion:" + GlobalConfig.sdkVersion);
//设置
... ... @@ -101,6 +101,7 @@ export default class MessageEntrance extends Emiter {
_webRtc.on('*', (type, data) => this._emit(type, data));
_webRtc.on(MessageTypes.USER_DEVICE_STATUS_CHAANGE, this.userDeviecStatusChange.bind(this)); //监听摄像头和麦克风的开启状态
_webRtc.on(MessageTypes.MEDIA_PUBLISH_STATUS_CHANGE, this.mediaPublishStatusChange.bind(this)); //webRtc推流状态发生改变
_webRtc.on(WebRtcApe.RE_JOIN_CHANNEL, this._webRtcRejoinChannel.bind(this)); //重先加入音视频频道
// Sass平台层
_sass = Sass;
... ... @@ -1070,7 +1071,7 @@ export default class MessageEntrance extends Emiter {
clearTimeout(this.saveClassStatusTimer);
this.saveClassStatusTimer = setTimeout(()=> {
_sass.saveClassStatusInfo({"classStatusInfo": GlobalConfig.classStatusInfo}); //保存课堂状态信息
}, 1000);
}, 1600);
} else {
loger.log("没有保存课堂状态信息的权限->当前身份->" + GlobalConfig.userRole);
}
... ... @@ -1922,6 +1923,7 @@ export default class MessageEntrance extends Emiter {
dataObj.recordStatus = false;
GlobalConfig.setClassStatusInfo(dataObj);
this.lastClassActiveTime=dataObj.lastClassActiveTime||0;
loger.log(dataObj);
} catch (err) {
loger.warn("getClassRecordInfo获取的课堂数据JSON转换失败->");
}
... ... @@ -2089,6 +2091,13 @@ export default class MessageEntrance extends Emiter {
}
}
/*
* 监听webRtc
* */
_webRtcRejoinChannel(_data){
this._reJoinChannel(_data)
}
//监听摄像头麦克风状态
userDeviecStatusChange(_data) {
/* nodeId:GlobalConfig.nodeId,
... ... @@ -2508,12 +2517,13 @@ export default class MessageEntrance extends Emiter {
//文档加入频道成功,同步到MCU服务器上的数据
docJoinChannelSuccess() {
let distance=new Date().getTime()-parseInt(this.lastClassActiveTime);
loger.log("最后一次记录的时间->"+this.lastClassActiveTime,"当前时间:"+new Date().getTime(),"间隔:"+distance/1000);
let interval=new Date().getTime()-parseInt(this.lastClassActiveTime);
loger.log("最后一次记录的时间->"+this.lastClassActiveTime,"当前时间:"+new Date().getTime(),"间隔:"+interval/1000);
loger.log("文档加入频道成功->isHost=", GlobalConfig.isHost, "当前总人数:", GlobalConfig.rosterNumber, "sassDoclength=", GlobalConfig.docListPrepare.length);
//如果当前课堂内只有自己或者离开上次课堂的时间大于15分钟,需要停止服务端的视频录制
if(GlobalConfig.rosterNumber<=1||distance>=(15*60)){
//如果当前课堂内只有自己或者离开上次课堂的时间大于8分钟,需要停止服务端的视频录制
if(GlobalConfig.rosterNumber<=1&&interval>=(8*60)){
loger.log("调用服务端音视频停止录制->interval:"+interval);
this._mediaRecordControl({"status": WebRtcApe.RECORD_STATUS_2});
}
... ... @@ -3010,19 +3020,25 @@ export default class MessageEntrance extends Emiter {
* 重新加入频道
* */
_reJoinChannel(_params) {
//{publish:false}
if (GlobalConfig.appId && !GlobalConfig.openFlash) {
//获取当前用户的推流状态,重新加入频道之后如果之前正在推流,重连后需要自动重推
//1.获取当前用户的推流状态,重新加入频道之后如果之前正在推流,重连后需要自动重推
let isPublish=false;
if(_webRtc){
isPublish=_webRtc.isPublish||false;
}
//2.检测是否调用接口的时候传入了开启推流的参数
if(_params&&_params.publish==true){
isPublish=true;
}
loger.log("离开视频通话频道时的推流状态->"+isPublish);
//先离开频道
this._leaveChannel();
//主讲人和老师可以设置旁录
//加入之前先设置旁录地址,只有直播支持旁路(1路流)
if (_webRtc && GlobalConfig.isTeachOrAssistant && GlobalConfig.maxMediaChannels == 1) {
if (_webRtc && GlobalConfig.isTeachOrAssistant) {
let curTimestamp = new Date().getTime();
let streamId = GlobalConfig.siteId + "_" + GlobalConfig.classId + "_" + GlobalConfig.userId + "_" + curTimestamp;
//传入固定的流Id
... ... @@ -3045,7 +3061,7 @@ export default class MessageEntrance extends Emiter {
info: "" + GlobalConfig.userRole,
immediatePublish:isPublish
});
}, 1600);
}, 1000);
}
}
... ...
... ... @@ -46,7 +46,7 @@ class LogManager {
clearTimeout(this.logDelayTimer);
this.logDelayTimer = setTimeout(function () {
_this.checkAndSendLog();
}, 1600);
}, 2000);
}
}
... ... @@ -69,50 +69,6 @@ class LogManager {
let msgData = "";
let tempArr = [];
let msgLen = 0;
/* switch (msgType) {
case LogManager.ERROR:
msgLen = this.errorList.length;
for (let i = 0; i < msgLen; i++) {
let item = this.errorList.shift();
if (item) {
tempArr.push(item);
msgData += item + " \n ";
}
}
break;
case LogManager.WARN:
msgLen = this.warnList.length;
for (let i = 0; i < msgLen; i++) {
let item = this.warnList.shift();
if (item) {
tempArr.push(item);
msgData += item + " \n ";
}
}
break;
case LogManager.LOG:
msgLen = this.logList.length;
for (let i = 0; i < msgLen; i++) {
let item = this.logList.shift();
if (item) {
tempArr.push(item);
msgData += item + " \n ";
}
}
break;
default:
msgLen = this.allLogList.length;
for (let i = 0; i < msgLen; i++) {
let item = this.allLogList.shift();
if (item) {
tempArr.push(item);
msgData += item + " \n ";
}
}
break;
}
*/
msgLen = this.allLogList.length;
for (let i = 0; i < msgLen; i++) {
let item = this.allLogList.shift();
... ... @@ -165,12 +121,6 @@ class LogManager {
//计算当前服务器时间
static getCurrentDateTime() {
/* let currentServerTime = new Date().getTime() - this.serverAndLoacTimeDistanc * 1000;//计算当前服务器时间
let timeStr = new Date(currentServerTime).toLocaleString();
if (timeStr) {
timeStr = timeStr.replace(/年|月/g, "-").replace(/日/g, " ");
}
return timeStr;*/
let currentServerTime = new Date().getTime() - this.serverAndLoacTimeDistanc * 1000;//计算当前服务器时间
let time=new Date(currentServerTime);
//显示格式20170729 16:42:00 INFO _msg
... ...
... ... @@ -24,6 +24,7 @@ class WebRtcApe extends Emiter {
this.appCertificate = "";
this.appRecordingKey = "";
this.setConfigTimestamp=0;//设置旁路地址的时间戳
this.configPublisherUrl = "";//旁路地址;
this.m3u8Url="";//旁路拉流地址
this.rtmpUrl="";//旁路拉流地址
... ... @@ -57,6 +58,8 @@ class WebRtcApe extends Emiter {
this.videoResolution = "240P";
this.isOpenVideo = true;
this.firstPublishSuccess=false;//记录加入频道成功之后是否推流成功过,离开频道之后需要设置为false
this.isPublish = false;//当前是否正在推流
this.videoScale=1;//视图的缩放比例,默认为1;
... ... @@ -143,6 +146,7 @@ class WebRtcApe extends Emiter {
this.client.on('stream-published', (evt)=> {
loger.log("webRtc->推流成功->", new Date().getTime());
this.isPublish = true;
this.firstPublishSuccess=true;
GlobalConfig.openCamera = EngineUtils.creatTimestamp();
GlobalConfig.openMicrophones = GlobalConfig.openCamera;
this._emit(MessageTypes.USER_DEVICE_STATUS_CHAANGE, {
... ... @@ -389,7 +393,7 @@ class WebRtcApe extends Emiter {
clearTimeout(this.rePublishDelay);
this.rePublishDelay=setTimeout(()=>{
this.publish();
},600);
},200);
}
}, (err)=> {
loger.error("加入视频通话频道->失败->", err);
... ... @@ -439,6 +443,7 @@ class WebRtcApe extends Emiter {
if (!this.client) {
return;
}
this.firstPublishSuccess=false;
this.unpublish();
this.client.leave(() => {
loger.log("离开视频通话频道->成功");
... ... @@ -465,6 +470,8 @@ class WebRtcApe extends Emiter {
* 设置旁录地址
* */
setConfigPublisherUrl(_publishUrl){
this.firstPublishSuccess=true;
this.setConfigTimestamp=new Date().getTime()/1000;
this.configPublisherUrl=_publishUrl;
if(this.client&& this.configPublisherUrl){
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 {
if (!this.client || !this.localStream) {
return;
}
//老师-助教-主讲人-->设置旁路大于30秒没有推流,推流服务会停止,需要重设旁录和重加频道;
if(this.setConfigTimestamp>0&&GlobalConfig.isTeachOrAssistant){
//如果间隔大于28秒并且没有推过流需要重新加入频道,推成功一次之后就不需要
let interval=parseInt(new Date().getTime()/1000-this.setConfigTimestamp);
loger.log("设置旁路的时间和推流时间的间隔->"+interval+" firstPublishSuccess:"+ this.firstPublishSuccess);
if(interval>=28&&!this.firstPublishSuccess){
loger.warn("设置旁路大于30秒没有推流,推流服务会停止,需要重设旁录和重加频道");
this._emit(WebRtcApe.RE_JOIN_CHANNEL,{publish:true});
return;
}
}
this.localStream.init(()=> {
this.clearLocalView();
let viewName = 'localVideoBox_' + this.uid;
... ... @@ -877,6 +897,8 @@ class WebRtcApe extends Emiter {
WebRtcApe.prototype.RECORD_STATUS_0 = WebRtcApe.RECORD_STATUS_0 = 0; //停止推流
WebRtcApe.prototype.RECORD_STATUS_1 = WebRtcApe.RECORD_STATUS_1 = 1; //开始推流
WebRtcApe.prototype.RECORD_STATUS_2 = WebRtcApe.RECORD_STATUS_2 = 2; //停止录制
WebRtcApe.prototype.RE_JOIN_CHANNEL = WebRtcApe.RE_JOIN_CHANNEL = "reJoninChanel";//重加入频道
export default new WebRtcApe;
... ...