1.修改ape消息延迟处理的 mcuDelay
2.增加离开人员音视频模块channel占用的检查,如果存在占用,由当前人员列表中最早进入的人来释放channle
正在显示
9 个修改的文件
包含
60 行增加
和
38 行删除
| @@ -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 | ///////数据的封包和解包///////////////////////////////////////// |
-
请 注册 或 登录 后发表评论