李勇

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

2.处理视频消息更新时的释放检测处理,必须是当前课堂人人数大于0的时候才处理,否则会把正常的视频消息释放掉,因为加入课堂之后有先收到视频消息后收到课堂人员加入的消息;H5不做释放处理;
3.默认的白板增加文件type类型;
4.360chrome浏览器的判断  版本增加到55
... ... @@ -63,7 +63,7 @@ export default class MessageEntrance extends Emiter {
super();
this.lastClassActiveTime=0;//最后一次课堂激活的时间戳
//sdk 信息
GlobalConfig.sdkVersion = "v2.25.7.20171031";
GlobalConfig.sdkVersion = "v2.26.2.20171102";
loger.warn("sdkVersion:" + GlobalConfig.sdkVersion);
console.log("sdkVersion:" + GlobalConfig.sdkVersion);
//设置
... ... @@ -413,6 +413,7 @@ export default class MessageEntrance extends Emiter {
errorMessage = {"code": _data.type, "reson": MessageTypes.ErrorReson[_data.type], "data": _data.data};
}
break;
default :
errorMessage = {"code": _data, "reson": MessageTypes.ErrorReson[_data], "data": {}};
break;
... ... @@ -439,7 +440,14 @@ export default class MessageEntrance extends Emiter {
//执行离开课堂断开连接的流程
_runClassExit(_type) {
if( GlobalConfig.classExit){
console.log("已经离开课堂");
return;
}
this._leaveClass(_type);
//记录是否已经离开课堂,离开之后不做MCU重连
GlobalConfig.classExit=true;
LogManager.IS_OPEN_SEND_LOG = false;//断开之后不再上报日志
}
//当前的课堂状态信息发生改变,需要保存课堂状态到Sass
... ... @@ -1811,7 +1819,8 @@ export default class MessageEntrance extends Emiter {
url: "http://pclive.xuedianyun.com/DocSharing/data/whiteboard/default/whiteboard.pdf",
dynamicTransferStatic: "0",
relativeUrl: "/DocSharing/data/whiteboard/default/whiteboard.pdf",
fileType: "pdf"
fileType: "pdf",
type:"pdf"
}
GlobalConfig.docListPrepare.push(whiteBoradData);
... ... @@ -2538,7 +2547,7 @@ export default class MessageEntrance extends Emiter {
let paramInfo = {
"pageNum": value.pdfSize || value.pageNum,
"fileName": value.name,
"fileType": value.type,
"fileType": value.type||value.fileType,
"relativeUrl": value.relativeLocation || value.relativeUrl,
"url": value.absoluteLocation || value.url,
"creatUserId": value.createUserID || 0,
... ...
... ... @@ -412,6 +412,8 @@ GlobalConfig.msType = 1; //目前固定用这个
GlobalConfig.messageDelay = false; //是否启用消息延迟
GlobalConfig.mcuDelay = 0; //默认的延迟时间(单位-秒)
GlobalConfig.classExit=false;//是否关闭课堂,如果关闭之后不再连接MCU
GlobalConfig.docDelay = 1600; //文档模块加入成功之后延迟发送送成功的消息给主模块(sdk内部使用)
GlobalConfig.portal = ""; //Sass IP
... ...
... ... @@ -180,7 +180,7 @@ class SystemConfig {
if (window.clientInformation.languages.length > 2) {
Sys.explorer = "chrome";
loger.log("chrome", Sys);
} else if (window.clientInformation.languages.length == 2&&versionNum<55) {
} else if (window.clientInformation.languages.length == 2&&versionNum<=55) {
var _track = 'track' in document.createElement('track');
var webstoreKeysLength = window.chrome && window.chrome.webstore ? Object.keys(window.chrome.webstore).length : 0;
if (_track) {
... ...
... ... @@ -931,7 +931,7 @@ class ConferApe extends Ape {
rosterInsertHandler(nodeId, nodeData) {
//loger.log("人员进入--->");
if (GlobalConfig.nodeId == nodeId) {
loger.log("人员进入课堂模块--->自己");
} else {
// loger.log("有人加入 rosterInsertHandler");
this.rosterUpdateHandler(nodeId, nodeData);
... ... @@ -1038,9 +1038,19 @@ class ConferApe extends Ape {
updaterRosterStatus(_param) {
//loger.log("媒体模块发生更新,人员状态需要更新,fromNodeId->",_param);
//如果视频消息中channel的占用人 fromNodeId在人员列表中不存在,需要释放这channel,因为这个有可能是之前没释放成功的
if (_param && _param.status == ApeConsts.CHANNEL_STATUS_OPENING && this.rosters[_param.fromNodeId] == null) {
loger.log("媒体模块被占用->占有人已经不存在课堂中->释放->", _param);
this._emit(MessageTypes.CLASS_NONENTITY_ROSTER, {"nodeId": _param.fromNodeId});
if (_param && _param.status == ApeConsts.CHANNEL_STATUS_OPENING) {
//如果推流的人员已经不存在,并且当前课堂内人员大于0;
// 如果不判断当前的人数,会出现把正常的视频消息释放的情况;
// 因为会出现先收到视频消息后收到人员加入和更新的消息
if(this.rosters[_param.fromNodeId] == null&&this.rosterLen>0){
//H5不做释放处理
if(GlobalConfig.deviceType==3){
loger.warn("H5不做媒体模块的频道释放->当前总人数->"+this.rosterLen, _param);
return ;
}
loger.warn("媒体模块被占用->占有人已经不存在课堂中->释放->当前总人数->"+this.rosterLen, _param);
this._emit(MessageTypes.CLASS_NONENTITY_ROSTER, {"nodeId": _param.fromNodeId});
}
}
}
... ...
... ... @@ -151,7 +151,8 @@ class MediaModule {
txTime=txTime.toString(16);
let txSecret= MD5(publishSuffix + streamId+txTime);
//rtmp://11220.livepush.myqcloud.com/live/11220_c5a1ea0bce?bizid=11220&txSecret=b1d8af72bf62366eef31cbb5dc5c8778&txTime=59C5337F
newUrl=url +"?bizid=11220&txSecret="+txSecret+"&txTime="+txTime+"&record=hls|flv&record_interval=5400";
//newUrl=url +"?bizid=11220&txSecret="+txSecret+"&txTime="+txTime+"&record=hls|flv&record_interval=5400";
newUrl=url +"?bizid=11220&txSecret="+txSecret+"&txTime="+txTime+"&record=hls&record_interval=5400";
loger.log("生成的推流地址->"+newUrl);
return newUrl;
}
... ...
... ... @@ -45,6 +45,7 @@ class VideoApe extends Ape {
//ape加入成功
onJoinChannelHandlerSuccess() {
//这个设置很重要,因为只有Sass流程完成之后,APE才能取得GlobalConfig中的数据
loger.log('视频模块初始完成->');
this.mediaModule.maxMediaChannel = GlobalConfig.maxVideoChannels;
}
... ... @@ -524,7 +525,7 @@ class VideoApe extends Ape {
adapterPdu.type = pdu.RCPDU_REG_ADAPTER;
adapterPdu.item.push(adapterItemPdu);
loger.log("发送更新VIDEO " + tableItemPdu.itemIdx);
loger.log("发送消息MCU更新VIDEO模块->channel:" + tableItemPdu.itemIdx);
this.sendUniform(adapterPdu, true);
}
... ... @@ -590,11 +591,10 @@ class VideoApe extends Ape {
}else {
//判断接收者的id,如果不是0,并且也不是自己的nodeId,那么消息不做处理
if (videoReceivePdu.toNodeId != 0 && videoReceivePdu.toNodeId != GlobalConfig.nodeId) {
loger.log('视频消息不处理 toNodeId=', videoReceivePdu.toNodeId, "my nodeId=", GlobalConfig.nodeId);
loger.log('视频消息不处理->接收人ID:'+videoReceivePdu.toNodeId, "自己的ID:"+GlobalConfig.nodeId);
} else {
loger.log('视频控制消息处理 .', videoReceivePdu);
this._emit(MessageTypes.VIDEO_BROADCAST, videoReceivePdu);
let data=videoReceivePdu.data;
if(data){
switch (videoReceivePdu.actionType){
... ... @@ -633,12 +633,11 @@ class VideoApe extends Ape {
}
tableUpdateHandler(owner, itemIdx, itemData, seek) {
let unpackChannelInfo = this.unPackPdu(owner, itemIdx, itemData);
loger.log("视频模块数据更新->channel", itemIdx, 'mediaType', unpackChannelInfo.mediaType, 'status->', unpackChannelInfo.status, "seek->", seek);
loger.log("视频模块数据更新->channel:"+itemIdx+' mediaType:'+unpackChannelInfo.mediaType+' status->'+unpackChannelInfo.status+" seek->", seek);
//****很重要********
//如果owner的值为0,代表的是这个歌频道已经被释放了(mcu服务端对于占用channel的掉线用户,就是把owner设置为0)
if (owner == 0) {
loger.log("释放占用的频道,channel", itemIdx);
loger.log("MCU返回值owner=0->释放占用的频道,channel:"+itemIdx);
unpackChannelInfo.status = ApeConsts.CHANNEL_STATUS_RELEASED;
unpackChannelInfo.streamId = "";
}
... ...
... ... @@ -202,6 +202,10 @@ class MCU extends Emiter {
// 主动建立MCU连接
joinMCU(_classInfo) {
if(GlobalConfig.classExit==true){
loger.warn("已经关闭课堂->不再连接MCU");
return;
}
loger.log('开始建立EverSocket通道.');
GlobalConfig.classJoinSuccess = false;
loger.log(_classInfo);
... ...