李勇

1.修改ape消息延迟处理的 mcuDelay

2.增加离开人员音视频模块channel占用的检查,如果存在占用,由当前人员列表中最早进入的人来释放channle
@@ -89,11 +89,12 @@ export default class MessageEntrance extends Emiter { @@ -89,11 +89,12 @@ export default class MessageEntrance extends Emiter {
89 89
90 _video_ape = new VideoApe(); 90 _video_ape = new VideoApe();
91 _video_ape.on('*', (type, data) => this._emit(type, data)); 91 _video_ape.on('*', (type, data) => this._emit(type, data));
92 - //_video_ape.on(MessageTypes.VIDEO_UPDATE, this.videoUpdate.bind(this)); 92 + _video_ape.on(MessageTypes.VIDEO_UPDATE, this.videoUpdate.bind(this));//这个监听事件不能删除,需要通知会议模块,检查channel占用
  93 +
93 94
94 _audio_ape= new AudioApe(); 95 _audio_ape= new AudioApe();
95 _audio_ape.on('*', (type, data) => this._emit(type, data)); 96 _audio_ape.on('*', (type, data) => this._emit(type, data));
96 - //_audio_ape.on(MessageTypes.AUDIO_UPDATE, this.audioUpdate.bind(this)); 97 + _audio_ape.on(MessageTypes.AUDIO_UPDATE, this.audioUpdate.bind(this));//这个监听事件不能删除,需要通知会议模块,检查channel占用
97 98
98 _whiteboard_ape = new WhiteBoardApe(); 99 _whiteboard_ape = new WhiteBoardApe();
99 _whiteboard_ape.on('*', (type, data) => this._emit(type, data)); 100 _whiteboard_ape.on('*', (type, data) => this._emit(type, data));
@@ -220,8 +221,7 @@ export default class MessageEntrance extends Emiter { @@ -220,8 +221,7 @@ export default class MessageEntrance extends Emiter {
220 _onClassDeleteRoster(_data){ 221 _onClassDeleteRoster(_data){
221 //{"nodeId":nodeId} 222 //{"nodeId":nodeId}
222 //当有人员离开的时候,如果离开的人员已经推流,那么需要停止推流,然后释放channel; 223 //当有人员离开的时候,如果离开的人员已经推流,那么需要停止推流,然后释放channel;
223 - //只有自己是主持人的时候出才处理下面的事情  
224 - if(_data!=null&&_data.nodeId!=null&&GlobalConfig.isHost){ 224 +/* if(_data!=null&&_data.nodeId!=null){
225 loger.log("有人员离开,检查一下离开的人员是否关闭推流"); 225 loger.log("有人员离开,检查一下离开的人员是否关闭推流");
226 if(_video_ape){ 226 if(_video_ape){
227 _video_ape.stopPublishVideo(_data); 227 _video_ape.stopPublishVideo(_data);
@@ -229,7 +229,7 @@ export default class MessageEntrance extends Emiter { @@ -229,7 +229,7 @@ export default class MessageEntrance extends Emiter {
229 if(_audio_ape){ 229 if(_audio_ape){
230 _audio_ape.stopPublishAudio(_data); 230 _audio_ape.stopPublishAudio(_data);
231 } 231 }
232 - } 232 + }*/
233 } 233 }
234 234
235 //当前会议中视频或音频占用channel的nodeId ,在人员列表中不存在,这种情况是占用channel的人员掉线或离开的时候没有释放channel 235 //当前会议中视频或音频占用channel的nodeId ,在人员列表中不存在,这种情况是占用channel的人员掉线或离开的时候没有释放channel
@@ -469,6 +469,7 @@ export default class MessageEntrance extends Emiter { @@ -469,6 +469,7 @@ export default class MessageEntrance extends Emiter {
469 // console.log(_data); 469 // console.log(_data);
470 //包含整个会议最全的信息,储存数据 470 //包含整个会议最全的信息,储存数据
471 if (_data) { 471 if (_data) {
  472 + GlobalConfig.mcuDelay=_data.mcuDelay || 60;//mcu消息延迟,用于文档模块
472 GlobalConfig.className = _data.meetingName || ""; 473 GlobalConfig.className = _data.meetingName || "";
473 GlobalConfig.classBeginTime = _data.beginTime || ""; 474 GlobalConfig.classBeginTime = _data.beginTime || "";
474 GlobalConfig.classEndTime = _data.endTime || ""; 475 GlobalConfig.classEndTime = _data.endTime || "";
@@ -241,7 +241,7 @@ GlobalConfig.statusCode_4={"code":4,message:"未知状态"}; @@ -241,7 +241,7 @@ GlobalConfig.statusCode_4={"code":4,message:"未知状态"};
241 241
242 GlobalConfig.md5=""; 242 GlobalConfig.md5="";
243 GlobalConfig.msType=1;//目前固定用这个 243 GlobalConfig.msType=1;//目前固定用这个
244 -GlobalConfig.mcuDelay=3000;//默认的延迟时间 244 +GlobalConfig.mcuDelay=60;//默认的延迟时间 flash中使用的是3000毫秒
245 GlobalConfig.docDelay=1600;//文档模块加入成功之后延迟发送送成功的消息给主模块 245 GlobalConfig.docDelay=1600;//文档模块加入成功之后延迟发送送成功的消息给主模块
246 GlobalConfig.portal="112.126.80.182:80";//Sass IP 246 GlobalConfig.portal="112.126.80.182:80";//Sass IP
247 247
@@ -37,13 +37,13 @@ MessageTypes.CHAT_RECEIVE ="chat_receive_message";// 'chat.receive'; @@ -37,13 +37,13 @@ MessageTypes.CHAT_RECEIVE ="chat_receive_message";// 'chat.receive';
37 //视频模块事件定义 37 //视频模块事件定义
38 MessageTypes.VIDEO_PLAY ="video_play";// 'video.play';//播放视频 38 MessageTypes.VIDEO_PLAY ="video_play";// 'video.play';//播放视频
39 MessageTypes.VIDEO_STOP ="video_stop"; //'video.stop';//停止视频 39 MessageTypes.VIDEO_STOP ="video_stop"; //'video.stop';//停止视频
40 -//MessageTypes.VIDEO_UPDATE ="video.update";// 'video.update';//废弃,400、401取代 40 +MessageTypes.VIDEO_UPDATE ="video_update";// //这个监听事件不能删除,需要通知会议模块,检查channel占用(内部使用)
41 MessageTypes.VIDEO_BROADCAST= "video_broadcast";//'video.broadcast'; 41 MessageTypes.VIDEO_BROADCAST= "video_broadcast";//'video.broadcast';
42 42
43 //音频模块事件定义 43 //音频模块事件定义
44 MessageTypes.AUDIO_PLAY ="audio_play";// 'audio.play';//播放 44 MessageTypes.AUDIO_PLAY ="audio_play";// 'audio.play';//播放
45 MessageTypes.AUDIO_STOP = "audio_stop";//'audio.stop';//停止 45 MessageTypes.AUDIO_STOP = "audio_stop";//'audio.stop';//停止
46 -//MessageTypes.AUDIO_UPDATE = "502";//'audio.update'; 46 +MessageTypes.AUDIO_UPDATE = "audio_update";//这个监听事件不能删除,需要通知会议模块,检查channel占用(内部使用)
47 MessageTypes.AUDIO_BROADCAST= "audio_broadcast";//'audio.broadcast'; 47 MessageTypes.AUDIO_BROADCAST= "audio_broadcast";//'audio.broadcast';
48 48
49 49
@@ -70,7 +70,7 @@ export default class Ape extends Emiter { @@ -70,7 +70,7 @@ export default class Ape extends Emiter {
70 // this._apeDelayedStart(); 70 // this._apeDelayedStart();
71 setTimeout(() => { 71 setTimeout(() => {
72 this._pduRegAdapterHandler(regBuffer); 72 this._pduRegAdapterHandler(regBuffer);
73 - },GlobalConfig.mcuDelay|| 12000); 73 + },GlobalConfig.mcuDelay|| 2000);
74 return; 74 return;
75 } 75 }
76 this._pduRegAdapterHandler(regBuffer); 76 this._pduRegAdapterHandler(regBuffer);
@@ -71,18 +71,19 @@ class AudioApe extends Ape { @@ -71,18 +71,19 @@ class AudioApe extends Ape {
71 return {"code": ApeConsts.RETURN_FAILED, "data": "推流数据已经无效"}; 71 return {"code": ApeConsts.RETURN_FAILED, "data": "推流数据已经无效"};
72 } 72 }
73 73
74 - 74 + /* //20170302 修改频道占用规则,同一个人可以推多路流,暂停下面的限制
75 //同一个nodeId只允许推一个流,如果已经推了就不能再推 75 //同一个nodeId只允许推一个流,如果已经推了就不能再推
76 if(this.mediaModule.getOpeningMediaChannel(GlobalConfig.nodeId)!=0){ 76 if(this.mediaModule.getOpeningMediaChannel(GlobalConfig.nodeId)!=0){
77 loger.warn("publishAudio,已经存在一个流,不能再推"); 77 loger.warn("publishAudio,已经存在一个流,不能再推");
78 - return {"code": ApeConsts.RETURN_FAILED, "data": "已经存在一个流,不能再推"};  
79 - } 78 + return {"code": ApeConsts.RETURN_FAILED, "data": "已经存在一个流,不能再推","mediaChannels":this.mediaModule.mediaChannels};
  79 + }*/
  80 +
80 81
81 //判断当前是否还有空闲的channle 82 //判断当前是否还有空闲的channle
82 let freeChannel = this.mediaModule.getFreeMediaChannel(); 83 let freeChannel = this.mediaModule.getFreeMediaChannel();
83 if (freeChannel == 0) { 84 if (freeChannel == 0) {
84 loger.warn("publishAudio,没有空闲的channel "); 85 loger.warn("publishAudio,没有空闲的channel ");
85 - return {"code": ApeConsts.RETURN_FAILED, "data": "不能再打开更多的设备"}; 86 + return {"code": ApeConsts.RETURN_FAILED, "data": "不能再打开更多的设备","mediaChannels":this.mediaModule.mediaChannels};
86 } 87 }
87 88
88 //判断当前的频道是否已经占用 89 //判断当前的频道是否已经占用
@@ -100,6 +101,7 @@ class AudioApe extends Ape { @@ -100,6 +101,7 @@ class AudioApe extends Ape {
100 channelInfo.classId=GlobalConfig.classId;//GlobalConfig.classId; 101 channelInfo.classId=GlobalConfig.classId;//GlobalConfig.classId;
101 channelInfo.siteId=GlobalConfig.siteId;//GlobalConfig.siteId; 102 channelInfo.siteId=GlobalConfig.siteId;//GlobalConfig.siteId;
102 channelInfo.toNodeId=0; 103 channelInfo.toNodeId=0;
  104 + channelInfo.userId=GlobalConfig.userId;
103 channelInfo.mediaType=ApeConsts.MEDIA_TYPE_AUDIO; 105 channelInfo.mediaType=ApeConsts.MEDIA_TYPE_AUDIO;
104 this.sendTableUpdateHandler(channelInfo); 106 this.sendTableUpdateHandler(channelInfo);
105 return {"code": ApeConsts.RETURN_SUCCESS, "data":"推流成功!"} 107 return {"code": ApeConsts.RETURN_SUCCESS, "data":"推流成功!"}
@@ -133,11 +135,13 @@ class AudioApe extends Ape { @@ -133,11 +135,13 @@ class AudioApe extends Ape {
133 channelInfo.timestamp=0; 135 channelInfo.timestamp=0;
134 channelInfo.classId=GlobalConfig.classId; 136 channelInfo.classId=GlobalConfig.classId;
135 channelInfo.toNodeId=0; 137 channelInfo.toNodeId=0;
  138 + channelInfo.userId=GlobalConfig.userId;
136 channelInfo.mediaType=ApeConsts.MEDIA_TYPE_DEFAULT; 139 channelInfo.mediaType=ApeConsts.MEDIA_TYPE_DEFAULT;
137 this.sendTableUpdateHandler(channelInfo); 140 this.sendTableUpdateHandler(channelInfo);
138 } 141 }
139 142
140 sendAudioBroadcastMsg(_param) { 143 sendAudioBroadcastMsg(_param) {
  144 + loger.log('sendAudioBroadcastMsg',_param);
141 if(!this.mcu.connected){ 145 if(!this.mcu.connected){
142 loger.warn(GlobalConfig.getCurrentStatus()); 146 loger.warn(GlobalConfig.getCurrentStatus());
143 return {"code": ApeConsts.RETURN_FAILED, "data": "已经断开连接"}; 147 return {"code": ApeConsts.RETURN_FAILED, "data": "已经断开连接"};
@@ -163,7 +167,7 @@ class AudioApe extends Ape { @@ -163,7 +167,7 @@ class AudioApe extends Ape {
163 let freeChannel = this.mediaModule.getFreeMediaChannel(); 167 let freeChannel = this.mediaModule.getFreeMediaChannel();
164 if (freeChannel == 0) { 168 if (freeChannel == 0) {
165 loger.warn('sendAudioBroadcastMsg,不能再打开更多的设备', _param); 169 loger.warn('sendAudioBroadcastMsg,不能再打开更多的设备', _param);
166 - return {"code": ApeConsts.RETURN_FAILED, "data": "不能再打开更多的设备"}; 170 + return {"code": ApeConsts.RETURN_FAILED, "data": "不能再打开更多的设备","mediaChannels":this.mediaModule.mediaChannels};
167 } 171 }
168 } 172 }
169 173
@@ -173,7 +177,7 @@ class AudioApe extends Ape { @@ -173,7 +177,7 @@ class AudioApe extends Ape {
173 audioSendPdu.isPublic = true; 177 audioSendPdu.isPublic = true;
174 178
175 audioSendPdu.fromNodeId = GlobalConfig.nodeId;//发起人 179 audioSendPdu.fromNodeId = GlobalConfig.nodeId;//发起人
176 - audioSendPdu.toNodeId = parseInt(_param.toNodeID) || 0;//接收者,0就是所有人 180 + audioSendPdu.toNodeId = parseInt(_param.toNodeId) || 0;//接收者,0就是所有人
177 audioSendPdu.actionType = parseInt(_param.actionType) || ApeConsts.MEDIA_ACTION_DEFAULT; 181 audioSendPdu.actionType = parseInt(_param.actionType) || ApeConsts.MEDIA_ACTION_DEFAULT;
178 182
179 audioSendPdu.data = this._rCArrayBufferUtil.strToUint8Array("h5" + _param.data);//开头两个字会乱码 183 audioSendPdu.data = this._rCArrayBufferUtil.strToUint8Array("h5" + _param.data);//开头两个字会乱码
@@ -291,6 +295,7 @@ class AudioApe extends Ape { @@ -291,6 +295,7 @@ class AudioApe extends Ape {
291 console.log(unpackChannelInfo); 295 console.log(unpackChannelInfo);
292 296
293 } 297 }
  298 + this._emit(MessageTypes.AUDIO_UPDATE, unpackChannelInfo);
294 } 299 }
295 300
296 ///////数据的封包和解包///////////////////////////////////////// 301 ///////数据的封包和解包/////////////////////////////////////////
@@ -493,6 +493,10 @@ class ConferApe extends Ape { @@ -493,6 +493,10 @@ class ConferApe extends Ape {
493 this.hostNodeId = -1; 493 this.hostNodeId = -1;
494 this.hostUserId = ''; 494 this.hostUserId = '';
495 } 495 }
  496 +
  497 + //判断进入的用户身份,如果进入的人身份是host,助教,监课,并且和自己的身份冲突,自己会被踢掉
  498 +
  499 +
496 let rosterExists = this.rosters[nodeId]; 500 let rosterExists = this.rosters[nodeId];
497 this.rosters[nodeId] = nodeData; 501 this.rosters[nodeId] = nodeData;
498 let userDataObj=null; 502 let userDataObj=null;
@@ -508,6 +512,8 @@ class ConferApe extends Ape { @@ -508,6 +512,8 @@ class ConferApe extends Ape {
508 loger.log("更新人员列表数据 rosterUpdateHandler",{"nodeId":nodeId}); 512 loger.log("更新人员列表数据 rosterUpdateHandler",{"nodeId":nodeId});
509 this._emit(MessageTypes.CLASS_INSERT_ROSTER, {"nodeId":nodeId,"nodeData":newNodeData}); 513 this._emit(MessageTypes.CLASS_INSERT_ROSTER, {"nodeId":nodeId,"nodeData":newNodeData});
510 this.emitRosterChange(); 514 this.emitRosterChange();
  515 +
  516 +
511 }else { 517 }else {
512 //loger.log("更新人员列表数据,rosterExists已经存在",rosterExists); 518 //loger.log("更新人员列表数据,rosterExists已经存在",rosterExists);
513 } 519 }
@@ -516,15 +522,14 @@ class ConferApe extends Ape { @@ -516,15 +522,14 @@ class ConferApe extends Ape {
516 //视频模块发生更新,人员状态需要更新 522 //视频模块发生更新,人员状态需要更新
517 updaterRosterStatus(_param){ 523 updaterRosterStatus(_param){
518 if(_param){ 524 if(_param){
519 - loger.log("媒体模块发生更新,人员状态需要更新,fromNodeId->",_param.fromNodeId);  
520 - loger.log(_param.status,_param.fromNodeId); 525 + //loger.log("媒体模块发生更新,人员状态需要更新,fromNodeId->",_param.fromNodeId);
  526 + //loger.log(_param.status,_param.fromNodeId);
521 //console.log(_param.fromNodeId); 527 //console.log(_param.fromNodeId);
522 //如果是自己。改变自己的状态同步到MCU 528 //如果是自己。改变自己的状态同步到MCU
523 //if(_param.fromNodeId==GlobalConfig.nodeId){ 529 //if(_param.fromNodeId==GlobalConfig.nodeId){
524 // 530 //
525 //} 531 //}
526 532
527 -  
528 //如果视频消息中channel的占用人 fromNodeId在人员列表中不存在,需要释放这channel,因为这个有可能是之前没释放成功的 533 //如果视频消息中channel的占用人 fromNodeId在人员列表中不存在,需要释放这channel,因为这个有可能是之前没释放成功的
529 if(_param.status==ApeConsts.CHANNEL_STATUS_OPENING&&this.rosters[_param.fromNodeId]==null){ 534 if(_param.status==ApeConsts.CHANNEL_STATUS_OPENING&&this.rosters[_param.fromNodeId]==null){
530 loger.log("媒体模块被占用,占有人已经不存在课堂中,释放Channel,_param->",_param); 535 loger.log("媒体模块被占用,占有人已经不存在课堂中,释放Channel,_param->",_param);
@@ -541,8 +546,20 @@ class ConferApe extends Ape { @@ -541,8 +546,20 @@ class ConferApe extends Ape {
541 }else { 546 }else {
542 loger.log("有人离开 rosterDelHandler"); 547 loger.log("有人离开 rosterDelHandler");
543 delete this.rosters[nodeId]; 548 delete this.rosters[nodeId];
544 - this._emit(MessageTypes.CLASS_DELETE_ROSTER, {"nodeId":nodeId});  
545 this.emitRosterChange(); 549 this.emitRosterChange();
  550 + this._emit(MessageTypes.CLASS_DELETE_ROSTER, {"nodeId":nodeId});
  551 +
  552 + //当前人员列表中抽一个人来检查离开人员是否占用频道
  553 + for (let key in this.rosters){
  554 + let randNodeId=parseInt(key);
  555 + if(randNodeId==GlobalConfig.nodeId){
  556 + loger.log(randNodeId,"有权限检查离开的人员是否占用channel");
  557 + this._emit(MessageTypes.CLASS_NONENTITY_ROSTER, {"nodeId":nodeId});
  558 + }else {
  559 + loger.warn(GlobalConfig.nodeId,"没有权限检查离开的人员是否占用channel");
  560 + }
  561 + return;
  562 + }
546 } 563 }
547 } 564 }
548 565
@@ -35,7 +35,7 @@ class DocApe extends Ape { @@ -35,7 +35,7 @@ class DocApe extends Ape {
35 //this.activeDocItemIdx =0;//当前激活的文档itemIdx 35 //this.activeDocItemIdx =0;//当前激活的文档itemIdx
36 //this.activeDocCurPage=1;//当前激活的文档的当前页 36 //this.activeDocCurPage=1;//当前激活的文档的当前页
37 // 延迟 37 // 延迟
38 - this._apeDelayed = true; 38 + this._apeDelayed = false;
39 39
40 // Ape Models 40 // Ape Models
41 this.registerKey(this._session_id, this._session_name, this._session_tag, new ArrayBuffer); 41 this.registerKey(this._session_id, this._session_name, this._session_tag, new ArrayBuffer);
@@ -440,7 +440,9 @@ class DocApe extends Ape { @@ -440,7 +440,9 @@ class DocApe extends Ape {
440 this._emit(DocApe.DOC_JOIN_CHANNEL_SUCCESS); 440 this._emit(DocApe.DOC_JOIN_CHANNEL_SUCCESS);
441 },(GlobalConfig.mcuDelay+GlobalConfig.docDelay)|| 12000+GlobalConfig.docDelay); 441 },(GlobalConfig.mcuDelay+GlobalConfig.docDelay)|| 12000+GlobalConfig.docDelay);
442 }else { 442 }else {
443 - this._emit(DocApe.DOC_JOIN_CHANNEL_SUCCESS); 443 + setTimeout(() => {
  444 + this._emit(DocApe.DOC_JOIN_CHANNEL_SUCCESS);
  445 + },GlobalConfig.docDelay);
444 } 446 }
445 } 447 }
446 448
@@ -112,6 +112,7 @@ class MediaModule { @@ -112,6 +112,7 @@ class MediaModule {
112 112
113 //获取当前属于nodeId的已经打开的的channel,返回值为0代表没有打开的,否则返回的就是打开的channelId 113 //获取当前属于nodeId的已经打开的的channel,返回值为0代表没有打开的,否则返回的就是打开的channelId
114 getOpeningMediaChannel(_nodeId){ 114 getOpeningMediaChannel(_nodeId){
  115 + loger.log("getOpeningMediaChannel","nodeId",_nodeId,"mediaChannels:",this.mediaChannels);
115 if(_nodeId==null||_nodeId==0){ 116 if(_nodeId==null||_nodeId==0){
116 return 0; 117 return 0;
117 } 118 }
@@ -72,24 +72,28 @@ class VideoApe extends Ape { @@ -72,24 +72,28 @@ class VideoApe extends Ape {
72 return {"code": ApeConsts.RETURN_FAILED, "data": "推流数据已经无效"}; 72 return {"code": ApeConsts.RETURN_FAILED, "data": "推流数据已经无效"};
73 } 73 }
74 74
  75 +
  76 + /* //20170302 修改频道占用规则,同一个人可以推多路流,暂停下面的限制
  77 +
75 //同一个nodeId只允许推一个流,如果已经推了就不能再推 78 //同一个nodeId只允许推一个流,如果已经推了就不能再推
76 if(this.mediaModule.getOpeningMediaChannel(GlobalConfig.nodeId)!=0){ 79 if(this.mediaModule.getOpeningMediaChannel(GlobalConfig.nodeId)!=0){
77 loger.warn("publishVideo,已经存在一个流,不能再推"); 80 loger.warn("publishVideo,已经存在一个流,不能再推");
78 return {"code": ApeConsts.RETURN_FAILED, "data": "已经存在一个流,不能再推"}; 81 return {"code": ApeConsts.RETURN_FAILED, "data": "已经存在一个流,不能再推"};
79 - } 82 + }*/
  83 +
80 84
81 //判断当前是否还有空闲的channle 85 //判断当前是否还有空闲的channle
82 let freeChannel = this.mediaModule.getFreeMediaChannel(); 86 let freeChannel = this.mediaModule.getFreeMediaChannel();
83 if (freeChannel == 0) { 87 if (freeChannel == 0) {
84 loger.warn("publishVideo,没有空闲的channel "); 88 loger.warn("publishVideo,没有空闲的channel ");
85 - return {"code": ApeConsts.RETURN_FAILED, "data": "不能再打开更多的设备"}; 89 + return {"code": ApeConsts.RETURN_FAILED, "data": "不能再打开更多的设备","mediaChannels":this.mediaModule.mediaChannels};
86 } 90 }
87 91
88 92
89 //判断当前的频道是否已经占用 93 //判断当前的频道是否已经占用
90 if(this.mediaModule.checkChannelIsOpening(needPublishChannelInfo.channelId)){ 94 if(this.mediaModule.checkChannelIsOpening(needPublishChannelInfo.channelId)){
91 loger.warn(needPublishChannelInfo.channelId,"频道已经被占用"); 95 loger.warn(needPublishChannelInfo.channelId,"频道已经被占用");
92 - return {"code": ApeConsts.RETURN_FAILED, "data":"频道已经被占用!"}; 96 + return {"code": ApeConsts.RETURN_FAILED, "data":"频道已经被占用!","mediaChannels":this.mediaModule.mediaChannels};
93 } 97 }
94 98
95 let channelInfo={}; 99 let channelInfo={};
@@ -100,6 +104,7 @@ class VideoApe extends Ape { @@ -100,6 +104,7 @@ class VideoApe extends Ape {
100 channelInfo.classId=GlobalConfig.classId; 104 channelInfo.classId=GlobalConfig.classId;
101 channelInfo.siteId=GlobalConfig.siteId; 105 channelInfo.siteId=GlobalConfig.siteId;
102 channelInfo.toNodeId=0; 106 channelInfo.toNodeId=0;
  107 + channelInfo.userId=GlobalConfig.userId;
103 channelInfo.mediaType=ApeConsts.MEDIA_TYPE_VIDEO; 108 channelInfo.mediaType=ApeConsts.MEDIA_TYPE_VIDEO;
104 this.sendTableUpdateHandler(channelInfo); 109 this.sendTableUpdateHandler(channelInfo);
105 return {"code": ApeConsts.RETURN_SUCCESS, "data":"推流成功!"} 110 return {"code": ApeConsts.RETURN_SUCCESS, "data":"推流成功!"}
@@ -112,7 +117,6 @@ class VideoApe extends Ape { @@ -112,7 +117,6 @@ class VideoApe extends Ape {
112 return {"code": ApeConsts.RETURN_FAILED, "data": "已经断开连接"}; 117 return {"code": ApeConsts.RETURN_FAILED, "data": "已经断开连接"};
113 } 118 }
114 119
115 - loger.log('stopPublishVideo -> maxVideoChannels', GlobalConfig.maxVideoChannels);  
116 //_param如果为空,那么默认就是当前自己的nodeId,否则用_param 120 //_param如果为空,那么默认就是当前自己的nodeId,否则用_param
117 let nodeId; 121 let nodeId;
118 if(_param&&parseInt(_param.nodeId)>0){ 122 if(_param&&parseInt(_param.nodeId)>0){
@@ -121,6 +125,8 @@ class VideoApe extends Ape { @@ -121,6 +125,8 @@ class VideoApe extends Ape {
121 nodeId=GlobalConfig.nodeId; 125 nodeId=GlobalConfig.nodeId;
122 } 126 }
123 127
  128 + loger.log('stopPublishVideo ->nodeId',nodeId,' maxVideoChannels', GlobalConfig.maxVideoChannels);
  129 +
124 let openingChannel = this.mediaModule.getOpeningMediaChannel(nodeId); 130 let openingChannel = this.mediaModule.getOpeningMediaChannel(nodeId);
125 if (openingChannel == 0) { 131 if (openingChannel == 0) {
126 loger.warn(nodeId,"没有占用channel不需要处理"); 132 loger.warn(nodeId,"没有占用channel不需要处理");
@@ -134,6 +140,7 @@ class VideoApe extends Ape { @@ -134,6 +140,7 @@ class VideoApe extends Ape {
134 channelInfo.timestamp=0; 140 channelInfo.timestamp=0;
135 channelInfo.classId=GlobalConfig.classId; 141 channelInfo.classId=GlobalConfig.classId;
136 channelInfo.toNodeId=0; 142 channelInfo.toNodeId=0;
  143 + channelInfo.userId=GlobalConfig.userId;
137 channelInfo.mediaType=ApeConsts.MEDIA_TYPE_DEFAULT; 144 channelInfo.mediaType=ApeConsts.MEDIA_TYPE_DEFAULT;
138 this.sendTableUpdateHandler(channelInfo); 145 this.sendTableUpdateHandler(channelInfo);
139 } 146 }
@@ -180,7 +187,7 @@ class VideoApe extends Ape { @@ -180,7 +187,7 @@ class VideoApe extends Ape {
180 videoSendPdu.isPublic = true; 187 videoSendPdu.isPublic = true;
181 188
182 videoSendPdu.fromNodeId = GlobalConfig.nodeId;//发起人 189 videoSendPdu.fromNodeId = GlobalConfig.nodeId;//发起人
183 - videoSendPdu.toNodeId = parseInt(_param.toNodeID) || 0;//接收者,0就是所有人 190 + videoSendPdu.toNodeId = parseInt(_param.toNodeId) || 0;//接收者,0就是所有人
184 videoSendPdu.actionType = parseInt(_param.actionType) || ApeConsts.MEDIA_ACTION_DEFAULT; 191 videoSendPdu.actionType = parseInt(_param.actionType) || ApeConsts.MEDIA_ACTION_DEFAULT;
185 192
186 videoSendPdu.data = this._rCArrayBufferUtil.strToUint8Array("h5" + _param.data);//开头两个字会乱码 193 videoSendPdu.data = this._rCArrayBufferUtil.strToUint8Array("h5" + _param.data);//开头两个字会乱码
@@ -199,17 +206,6 @@ class VideoApe extends Ape { @@ -199,17 +206,6 @@ class VideoApe extends Ape {
199 206
200 sendTableUpdateHandler(_channelInfo) { 207 sendTableUpdateHandler(_channelInfo) {
201 loger.log("video===sendTableUpdateHandler "); 208 loger.log("video===sendTableUpdateHandler ");
202 - /* //验证坐标点集合数组是否合法  
203 - if(_docDataModel==null||_itemIdx==null){  
204 - this._emit(MessageTypes.MCU_ERROR,MessageTypes.ERR_APE_INTERFACE_PARAM_WRONG);  
205 - return null;  
206 - }*/  
207 -  
208 - //let freeChannel=this.getFreeVideoChannel();  
209 - //if(freeChannel==0){  
210 - // loger.warn("sendTableUpdateHandler,没有空闲的channel ");  
211 - // return;  
212 - //}  
213 let updateModelPdu = this.packPdu(_channelInfo, _channelInfo.channelId);//let updateModelPdu=this.packPdu({},ApeConsts.VIDEO_OBJ_TABLE_ID+2); 209 let updateModelPdu = this.packPdu(_channelInfo, _channelInfo.channelId);//let updateModelPdu=this.packPdu({},ApeConsts.VIDEO_OBJ_TABLE_ID+2);
214 if(updateModelPdu==null){ 210 if(updateModelPdu==null){
215 loger.warn("sendTableUpdateHandler error,updateModelPdu=null"); 211 loger.warn("sendTableUpdateHandler error,updateModelPdu=null");
@@ -306,7 +302,7 @@ class VideoApe extends Ape { @@ -306,7 +302,7 @@ class VideoApe extends Ape {
306 302
307 } 303 }
308 304
309 - //this._emit(MessageTypes.VIDEO_UPDATE, videoChannelInfo); 305 + this._emit(MessageTypes.VIDEO_UPDATE, unpackChannelInfo);
310 } 306 }
311 307
312 ///////数据的封包和解包///////////////////////////////////////// 308 ///////数据的封包和解包/////////////////////////////////////////