修改音视频模块的channel占用释放,更新table数据RCRegistryTableItemPdu的时候,owner的值非常重要,占用频道的时候设置为自己的…
…nodeId,释放占用的时候必须要设置为0,否则其他人无法使用;正在占用channel的人异常掉线之后,MCU服务器会把owner设置为0,其他用户同步的消息中如果owner为0就可以使用
正在显示
4 个修改的文件
包含
75 行增加
和
89 行删除
| @@ -92,16 +92,12 @@ class AudioApe extends Ape { | @@ -92,16 +92,12 @@ class AudioApe extends Ape { | ||
| 92 | return {"code": ApeConsts.RETURN_FAILED, "data":"频道已经被占用!"}; | 92 | return {"code": ApeConsts.RETURN_FAILED, "data":"频道已经被占用!"}; |
| 93 | } | 93 | } |
| 94 | 94 | ||
| 95 | - let channelInfo={}; | 95 | + let channelInfo=this.mediaModule.getDefaultChannelInfo(); |
| 96 | + channelInfo.owner=GlobalConfig.nodeId; | ||
| 96 | channelInfo.status=ApeConsts.CHANNEL_STATUS_OPENING; | 97 | channelInfo.status=ApeConsts.CHANNEL_STATUS_OPENING; |
| 97 | - channelInfo.fromNodeId=GlobalConfig.nodeId; | ||
| 98 | channelInfo.channelId=needPublishChannelInfo.channelId;//freeChannel | 98 | channelInfo.channelId=needPublishChannelInfo.channelId;//freeChannel |
| 99 | channelInfo.streamId=needPublishChannelInfo.streamId;//按规则拼接的流名称 | 99 | channelInfo.streamId=needPublishChannelInfo.streamId;//按规则拼接的流名称 |
| 100 | channelInfo.timestamp=needPublishChannelInfo.timestamp;//EngineUtils.creatTimestamp(); | 100 | channelInfo.timestamp=needPublishChannelInfo.timestamp;//EngineUtils.creatTimestamp(); |
| 101 | - channelInfo.classId=GlobalConfig.classId;//GlobalConfig.classId; | ||
| 102 | - channelInfo.siteId=GlobalConfig.siteId;//GlobalConfig.siteId; | ||
| 103 | - channelInfo.toNodeId=0; | ||
| 104 | - channelInfo.userId=GlobalConfig.userId; | ||
| 105 | channelInfo.mediaType=ApeConsts.MEDIA_TYPE_AUDIO; | 101 | channelInfo.mediaType=ApeConsts.MEDIA_TYPE_AUDIO; |
| 106 | this.sendTableUpdateHandler(channelInfo); | 102 | this.sendTableUpdateHandler(channelInfo); |
| 107 | return {"code": ApeConsts.RETURN_SUCCESS, "data":"推流成功!","mediaId":needPublishChannelInfo.channelId}; | 103 | return {"code": ApeConsts.RETURN_SUCCESS, "data":"推流成功!","mediaId":needPublishChannelInfo.channelId}; |
| @@ -143,15 +139,11 @@ class AudioApe extends Ape { | @@ -143,15 +139,11 @@ class AudioApe extends Ape { | ||
| 143 | let channelInfo=this.mediaModule.mediaChannels[channelId]; | 139 | let channelInfo=this.mediaModule.mediaChannels[channelId]; |
| 144 | if(channelInfo&&channelInfo.status==ApeConsts.CHANNEL_STATUS_OPENING){ | 140 | if(channelInfo&&channelInfo.status==ApeConsts.CHANNEL_STATUS_OPENING){ |
| 145 | if(channelInfo.fromNodeId==nodeId){ | 141 | if(channelInfo.fromNodeId==nodeId){ |
| 146 | - let channelInfo={}; | 142 | + |
| 143 | + let channelInfo=this.mediaModule.getDefaultChannelInfo(); | ||
| 147 | channelInfo.status=ApeConsts.CHANNEL_STATUS_RELEASED; | 144 | channelInfo.status=ApeConsts.CHANNEL_STATUS_RELEASED; |
| 148 | - channelInfo.fromNodeId=0; | ||
| 149 | channelInfo.channelId=channelId; | 145 | channelInfo.channelId=channelId; |
| 150 | - channelInfo.timestamp=0; | ||
| 151 | - channelInfo.classId=GlobalConfig.classId; | ||
| 152 | - channelInfo.toNodeId=0; | ||
| 153 | - channelInfo.userId=GlobalConfig.userId; | ||
| 154 | - channelInfo.mediaType=ApeConsts.MEDIA_TYPE_DEFAULT; | 146 | + |
| 155 | this.sendTableUpdateHandler(channelInfo); | 147 | this.sendTableUpdateHandler(channelInfo); |
| 156 | }else { | 148 | }else { |
| 157 | loger.warn(channelId,"不属于nodeId",nodeId,"不能释放",channelInfo); | 149 | loger.warn(channelId,"不属于nodeId",nodeId,"不能释放",channelInfo); |
| @@ -174,15 +166,10 @@ class AudioApe extends Ape { | @@ -174,15 +166,10 @@ class AudioApe extends Ape { | ||
| 174 | return {"code": ApeConsts.RETURN_FAILED, "data": "没有占用channel不需要处理"}; | 166 | return {"code": ApeConsts.RETURN_FAILED, "data": "没有占用channel不需要处理"}; |
| 175 | } | 167 | } |
| 176 | 168 | ||
| 177 | - let channelInfo={}; | 169 | + let channelInfo=this.mediaModule.getDefaultChannelInfo(); |
| 178 | channelInfo.status=ApeConsts.CHANNEL_STATUS_RELEASED; | 170 | channelInfo.status=ApeConsts.CHANNEL_STATUS_RELEASED; |
| 179 | - channelInfo.fromNodeId=0; | ||
| 180 | channelInfo.channelId=openingChannel; | 171 | channelInfo.channelId=openingChannel; |
| 181 | - channelInfo.timestamp=0; | ||
| 182 | - channelInfo.classId=GlobalConfig.classId; | ||
| 183 | - channelInfo.toNodeId=0; | ||
| 184 | - channelInfo.userId=GlobalConfig.userId; | ||
| 185 | - channelInfo.mediaType=ApeConsts.MEDIA_TYPE_DEFAULT; | 172 | + |
| 186 | this.sendTableUpdateHandler(channelInfo); | 173 | this.sendTableUpdateHandler(channelInfo); |
| 187 | //递归检查,800毫秒之后执行 | 174 | //递归检查,800毫秒之后执行 |
| 188 | setTimeout(function(){ | 175 | setTimeout(function(){ |
| @@ -254,14 +241,12 @@ class AudioApe extends Ape { | @@ -254,14 +241,12 @@ class AudioApe extends Ape { | ||
| 254 | 241 | ||
| 255 | let tableItemPdu = new pdu['RCRegistryTableItemPdu']; | 242 | let tableItemPdu = new pdu['RCRegistryTableItemPdu']; |
| 256 | tableItemPdu.itemIdx = _channelInfo.channelId; | 243 | tableItemPdu.itemIdx = _channelInfo.channelId; |
| 257 | - tableItemPdu.owner = 0;//收到flash的是这个值,不清楚先写固定 | 244 | + tableItemPdu.owner = _channelInfo.owner;//0收到flash的是这个值,MCU做了了用户掉线处理,30秒之后会清理owner为0 |
| 258 | tableItemPdu.itemData = updateModelPdu.toArrayBuffer(); | 245 | tableItemPdu.itemData = updateModelPdu.toArrayBuffer(); |
| 259 | 246 | ||
| 260 | //insert | 247 | //insert |
| 261 | let tableInsertItemPdu = new pdu['RCRegistryTableUpdateItemPdu']; | 248 | let tableInsertItemPdu = new pdu['RCRegistryTableUpdateItemPdu']; |
| 262 | - //optional RCPduType_E type = 1 [default = RCPDU_REG_TABLE_UPDATE_PDU]; | ||
| 263 | - //repeated RCRegistryTableItemPdu items = 2; | ||
| 264 | - tableInsertItemPdu.type = pdu.RCPDU_REG_TABLE_UPDATE_PDU;// | 249 | + tableInsertItemPdu.type = pdu.RCPDU_REG_TABLE_UPDATE_PDU; |
| 265 | tableInsertItemPdu.items.push(tableItemPdu); | 250 | tableInsertItemPdu.items.push(tableItemPdu); |
| 266 | 251 | ||
| 267 | let updateObjPdu = new pdu['RCRegistryUpdateObjPdu']; | 252 | let updateObjPdu = new pdu['RCRegistryUpdateObjPdu']; |
| @@ -303,13 +288,16 @@ class AudioApe extends Ape { | @@ -303,13 +288,16 @@ class AudioApe extends Ape { | ||
| 303 | } | 288 | } |
| 304 | 289 | ||
| 305 | tableUpdateHandler(owner, itemIdx, itemData) { | 290 | tableUpdateHandler(owner, itemIdx, itemData) { |
| 306 | - // debugger; | ||
| 307 | - /* let updateChannelInfo = this.unPackPdu(owner, itemIdx, itemData); | 291 | + let unpackChannelInfo = this.unPackPdu(owner, itemIdx, itemData); |
| 292 | + loger.log("tableUpdateHandler,channel",itemIdx); | ||
| 308 | 293 | ||
| 309 | - this.mediaModule.mediaChannels[itemIdx] = updateChannelInfo; | 294 | + //****很重要******** |
| 295 | + //如果owner的值为0,代表的是这个歌频道已经被释放了(mcu服务端对于占用channel的掉线用户,就是把owner设置为0) | ||
| 296 | + if(owner==0){ | ||
| 297 | + loger.log("释放占用的频道,channel",itemIdx); | ||
| 298 | + unpackChannelInfo.status=ApeConsts.CHANNEL_STATUS_RELEASED; | ||
| 299 | + } | ||
| 310 | 300 | ||
| 311 | - this._emit(MessageTypes.AUDIO_UPDATE, updateChannelInfo);*/ | ||
| 312 | - let unpackChannelInfo = this.unPackPdu(owner, itemIdx, itemData); | ||
| 313 | this.mediaModule.mediaChannels[itemIdx] = unpackChannelInfo; | 301 | this.mediaModule.mediaChannels[itemIdx] = unpackChannelInfo; |
| 314 | 302 | ||
| 315 | if(unpackChannelInfo&&unpackChannelInfo.fromNodeId!=GlobalConfig.nodeId){ | 303 | if(unpackChannelInfo&&unpackChannelInfo.fromNodeId!=GlobalConfig.nodeId){ |
| @@ -330,13 +318,11 @@ class AudioApe extends Ape { | @@ -330,13 +318,11 @@ class AudioApe extends Ape { | ||
| 330 | if(rtmpStream.code==0){ | 318 | if(rtmpStream.code==0){ |
| 331 | receiveChannelInfo.rtmpUrl=rtmpStream.playUrl; | 319 | receiveChannelInfo.rtmpUrl=rtmpStream.playUrl; |
| 332 | } | 320 | } |
| 333 | - loger.log("AUDIO_PLAY"); | ||
| 334 | - console.log(receiveChannelInfo); | 321 | + loger.log("AUDIO_PLAY",receiveChannelInfo); |
| 335 | //广播播放视频的消息 | 322 | //广播播放视频的消息 |
| 336 | this._emit(MessageTypes.AUDIO_PLAY, receiveChannelInfo); | 323 | this._emit(MessageTypes.AUDIO_PLAY, receiveChannelInfo); |
| 337 | }else { | 324 | }else { |
| 338 | - loger.log("AUDIO_STOP"); | ||
| 339 | - console.log(receiveChannelInfo); | 325 | + loger.log("AUDIO_STOP",receiveChannelInfo); |
| 340 | //流已经停止 | 326 | //流已经停止 |
| 341 | this._emit(MessageTypes.AUDIO_STOP, receiveChannelInfo); | 327 | this._emit(MessageTypes.AUDIO_STOP, receiveChannelInfo); |
| 342 | } | 328 | } |
| @@ -481,9 +481,9 @@ class ConferApe extends Ape { | @@ -481,9 +481,9 @@ class ConferApe extends Ape { | ||
| 481 | 481 | ||
| 482 | rosterInsertHandler(nodeId, nodeData) { | 482 | rosterInsertHandler(nodeId, nodeData) { |
| 483 | if (GlobalConfig.nodeId == nodeId) { | 483 | if (GlobalConfig.nodeId == nodeId) { |
| 484 | - loger.log("自己加入 rosterInsertHandler"); | 484 | + // loger.log("自己加入 rosterInsertHandler"); |
| 485 | } else { | 485 | } else { |
| 486 | - loger.log("有人加入 rosterInsertHandler"); | 486 | + // loger.log("有人加入 rosterInsertHandler"); |
| 487 | this.rosterUpdateHandler(nodeId, nodeData); | 487 | this.rosterUpdateHandler(nodeId, nodeData); |
| 488 | } | 488 | } |
| 489 | } | 489 | } |
| @@ -532,8 +532,16 @@ class ConferApe extends Ape { | @@ -532,8 +532,16 @@ class ConferApe extends Ape { | ||
| 532 | 532 | ||
| 533 | let newNodeData = nodeData; | 533 | let newNodeData = nodeData; |
| 534 | newNodeData.userData = userDataObj; | 534 | newNodeData.userData = userDataObj; |
| 535 | + | ||
| 536 | + //如果是监课,不告诉其他人 | ||
| 537 | + if (nodeData.role == ApeConsts.NR_INVISIBLE) { | ||
| 538 | + loger.log("NR_INVISIBLE"); | ||
| 539 | + return; | ||
| 540 | + } | ||
| 541 | + | ||
| 535 | this._emit(MessageTypes.CLASS_INSERT_ROSTER, {"nodeId": nodeId, "nodeData": newNodeData}); | 542 | this._emit(MessageTypes.CLASS_INSERT_ROSTER, {"nodeId": nodeId, "nodeData": newNodeData}); |
| 536 | this.emitRosterChange(); | 543 | this.emitRosterChange(); |
| 544 | + | ||
| 537 | } else { | 545 | } else { |
| 538 | //loger.log("更新人员列表数据,rosterExists已经存在",rosterExists); | 546 | //loger.log("更新人员列表数据,rosterExists已经存在",rosterExists); |
| 539 | } | 547 | } |
| @@ -547,20 +555,11 @@ class ConferApe extends Ape { | @@ -547,20 +555,11 @@ class ConferApe extends Ape { | ||
| 547 | 555 | ||
| 548 | //视频模块发生更新,人员状态需要更新 | 556 | //视频模块发生更新,人员状态需要更新 |
| 549 | updaterRosterStatus(_param) { | 557 | updaterRosterStatus(_param) { |
| 550 | - if (_param) { | ||
| 551 | - //loger.log("媒体模块发生更新,人员状态需要更新,fromNodeId->",_param.fromNodeId); | ||
| 552 | - //loger.log(_param.status,_param.fromNodeId); | ||
| 553 | - //console.log(_param.fromNodeId); | ||
| 554 | - //如果是自己。改变自己的状态同步到MCU | ||
| 555 | - //if(_param.fromNodeId==GlobalConfig.nodeId){ | ||
| 556 | - // | ||
| 557 | - //} | ||
| 558 | - | ||
| 559 | - //如果视频消息中channel的占用人 fromNodeId在人员列表中不存在,需要释放这channel,因为这个有可能是之前没释放成功的 | ||
| 560 | - if (_param.status == ApeConsts.CHANNEL_STATUS_OPENING && this.rosters[_param.fromNodeId] == null) { | ||
| 561 | - loger.log("媒体模块被占用,占有人已经不存在课堂中,释放Channel,_param->", _param); | ||
| 562 | - this._emit(MessageTypes.CLASS_NONENTITY_ROSTER, {"nodeId": _param.fromNodeId}); | ||
| 563 | - } | 558 | + //loger.log("媒体模块发生更新,人员状态需要更新,fromNodeId->",_param.fromNodeId); |
| 559 | + //如果视频消息中channel的占用人 fromNodeId在人员列表中不存在,需要释放这channel,因为这个有可能是之前没释放成功的 | ||
| 560 | + if (_param && _param.status == ApeConsts.CHANNEL_STATUS_OPENING && this.rosters[_param.fromNodeId] == null) { | ||
| 561 | + loger.log("媒体模块被占用,占有人已经不存在课堂中,释放Channel,_param->", _param); | ||
| 562 | + this._emit(MessageTypes.CLASS_NONENTITY_ROSTER, {"nodeId": _param.fromNodeId}); | ||
| 564 | } | 563 | } |
| 565 | } | 564 | } |
| 566 | 565 |
| @@ -137,6 +137,22 @@ class MediaModule { | @@ -137,6 +137,22 @@ class MediaModule { | ||
| 137 | } | 137 | } |
| 138 | return true; | 138 | return true; |
| 139 | } | 139 | } |
| 140 | + | ||
| 141 | + //获取默认的频道信息 | ||
| 142 | + getDefaultChannelInfo(){ | ||
| 143 | + let channelInfo={}; | ||
| 144 | + channelInfo.owner=0;//这个很重要,释放的时候必须设置为0,占用的时候设置为自己的nodeId | ||
| 145 | + channelInfo.status=ApeConsts.CHANNEL_STATUS_RELEASED; | ||
| 146 | + channelInfo.fromNodeId=GlobalConfig.nodeId; | ||
| 147 | + channelInfo.channelId=0; | ||
| 148 | + channelInfo.streamId="" | ||
| 149 | + channelInfo.classId=GlobalConfig.classId; | ||
| 150 | + channelInfo.siteId=GlobalConfig.siteId; | ||
| 151 | + channelInfo.toNodeId=0; | ||
| 152 | + channelInfo.userId=GlobalConfig.userId; | ||
| 153 | + channelInfo.mediaType=ApeConsts.MEDIA_TYPE_DEFAULT; | ||
| 154 | + return channelInfo; | ||
| 155 | + } | ||
| 140 | } | 156 | } |
| 141 | 157 | ||
| 142 | export default MediaModule; | 158 | export default MediaModule; |
| @@ -72,7 +72,6 @@ class VideoApe extends Ape { | @@ -72,7 +72,6 @@ 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 修改频道占用规则,同一个人可以推多路流,暂停下面的限制 | 75 | /* //20170302 修改频道占用规则,同一个人可以推多路流,暂停下面的限制 |
| 77 | 76 | ||
| 78 | //同一个nodeId只允许推一个流,如果已经推了就不能再推 | 77 | //同一个nodeId只允许推一个流,如果已经推了就不能再推 |
| @@ -81,7 +80,6 @@ class VideoApe extends Ape { | @@ -81,7 +80,6 @@ class VideoApe extends Ape { | ||
| 81 | return {"code": ApeConsts.RETURN_FAILED, "data": "已经存在一个流,不能再推"}; | 80 | return {"code": ApeConsts.RETURN_FAILED, "data": "已经存在一个流,不能再推"}; |
| 82 | }*/ | 81 | }*/ |
| 83 | 82 | ||
| 84 | - | ||
| 85 | //判断当前是否还有空闲的channle | 83 | //判断当前是否还有空闲的channle |
| 86 | let freeChannel = this.mediaModule.getFreeMediaChannel(); | 84 | let freeChannel = this.mediaModule.getFreeMediaChannel(); |
| 87 | if (freeChannel == 0) { | 85 | if (freeChannel == 0) { |
| @@ -96,17 +94,14 @@ class VideoApe extends Ape { | @@ -96,17 +94,14 @@ class VideoApe extends Ape { | ||
| 96 | return {"code": ApeConsts.RETURN_FAILED, "data":"频道已经被占用!","mediaChannels":this.mediaModule.mediaChannels}; | 94 | return {"code": ApeConsts.RETURN_FAILED, "data":"频道已经被占用!","mediaChannels":this.mediaModule.mediaChannels}; |
| 97 | } | 95 | } |
| 98 | 96 | ||
| 99 | - let channelInfo={}; | 97 | + let channelInfo=this.mediaModule.getDefaultChannelInfo(); |
| 98 | + channelInfo.owner=GlobalConfig.nodeId; | ||
| 100 | channelInfo.status=ApeConsts.CHANNEL_STATUS_OPENING; | 99 | channelInfo.status=ApeConsts.CHANNEL_STATUS_OPENING; |
| 101 | - channelInfo.fromNodeId=GlobalConfig.nodeId; | ||
| 102 | channelInfo.channelId=needPublishChannelInfo.channelId; | 100 | channelInfo.channelId=needPublishChannelInfo.channelId; |
| 103 | channelInfo.streamId=needPublishChannelInfo.streamId;//按规则拼接的流名称 | 101 | channelInfo.streamId=needPublishChannelInfo.streamId;//按规则拼接的流名称 |
| 104 | - channelInfo.classId=GlobalConfig.classId; | ||
| 105 | - channelInfo.siteId=GlobalConfig.siteId; | ||
| 106 | - channelInfo.toNodeId=0; | ||
| 107 | - channelInfo.userId=GlobalConfig.userId; | ||
| 108 | channelInfo.mediaType=ApeConsts.MEDIA_TYPE_VIDEO; | 102 | channelInfo.mediaType=ApeConsts.MEDIA_TYPE_VIDEO; |
| 109 | this.sendTableUpdateHandler(channelInfo); | 103 | this.sendTableUpdateHandler(channelInfo); |
| 104 | + | ||
| 110 | return {"code": ApeConsts.RETURN_SUCCESS, "data":"推流成功!","mediaId":needPublishChannelInfo.channelId}; | 105 | return {"code": ApeConsts.RETURN_SUCCESS, "data":"推流成功!","mediaId":needPublishChannelInfo.channelId}; |
| 111 | } | 106 | } |
| 112 | 107 | ||
| @@ -145,15 +140,11 @@ class VideoApe extends Ape { | @@ -145,15 +140,11 @@ class VideoApe extends Ape { | ||
| 145 | let channelInfo=this.mediaModule.mediaChannels[channelId]; | 140 | let channelInfo=this.mediaModule.mediaChannels[channelId]; |
| 146 | if(channelInfo&&channelInfo.status==ApeConsts.CHANNEL_STATUS_OPENING){ | 141 | if(channelInfo&&channelInfo.status==ApeConsts.CHANNEL_STATUS_OPENING){ |
| 147 | if(channelInfo.fromNodeId==nodeId){ | 142 | if(channelInfo.fromNodeId==nodeId){ |
| 148 | - let channelInfo={}; | 143 | + |
| 144 | + let channelInfo=this.mediaModule.getDefaultChannelInfo(); | ||
| 149 | channelInfo.status=ApeConsts.CHANNEL_STATUS_RELEASED; | 145 | channelInfo.status=ApeConsts.CHANNEL_STATUS_RELEASED; |
| 150 | - channelInfo.fromNodeId=0; | ||
| 151 | channelInfo.channelId=channelId; | 146 | channelInfo.channelId=channelId; |
| 152 | - channelInfo.timestamp=0; | ||
| 153 | - channelInfo.classId=GlobalConfig.classId; | ||
| 154 | - channelInfo.toNodeId=0; | ||
| 155 | - channelInfo.userId=GlobalConfig.userId; | ||
| 156 | - channelInfo.mediaType=ApeConsts.MEDIA_TYPE_DEFAULT; | 147 | + |
| 157 | this.sendTableUpdateHandler(channelInfo); | 148 | this.sendTableUpdateHandler(channelInfo); |
| 158 | }else { | 149 | }else { |
| 159 | loger.warn(channelId,"不属于nodeId",nodeId,"不能释放",channelInfo); | 150 | loger.warn(channelId,"不属于nodeId",nodeId,"不能释放",channelInfo); |
| @@ -176,15 +167,10 @@ class VideoApe extends Ape { | @@ -176,15 +167,10 @@ class VideoApe extends Ape { | ||
| 176 | return {"code": ApeConsts.RETURN_FAILED, "data": "没有占用channel不需要处理"}; | 167 | return {"code": ApeConsts.RETURN_FAILED, "data": "没有占用channel不需要处理"}; |
| 177 | } | 168 | } |
| 178 | 169 | ||
| 179 | - let channelInfo={}; | 170 | + let channelInfo=this.mediaModule.getDefaultChannelInfo(); |
| 180 | channelInfo.status=ApeConsts.CHANNEL_STATUS_RELEASED; | 171 | channelInfo.status=ApeConsts.CHANNEL_STATUS_RELEASED; |
| 181 | - channelInfo.fromNodeId=0; | ||
| 182 | channelInfo.channelId=openingChannel; | 172 | channelInfo.channelId=openingChannel; |
| 183 | - channelInfo.timestamp=0; | ||
| 184 | - channelInfo.classId=GlobalConfig.classId; | ||
| 185 | - channelInfo.toNodeId=0; | ||
| 186 | - channelInfo.userId=GlobalConfig.userId; | ||
| 187 | - channelInfo.mediaType=ApeConsts.MEDIA_TYPE_DEFAULT; | 173 | + |
| 188 | this.sendTableUpdateHandler(channelInfo); | 174 | this.sendTableUpdateHandler(channelInfo); |
| 189 | //递归检查,800毫秒之后执行 | 175 | //递归检查,800毫秒之后执行 |
| 190 | setTimeout(function(){ | 176 | setTimeout(function(){ |
| @@ -223,12 +209,6 @@ class VideoApe extends Ape { | @@ -223,12 +209,6 @@ class VideoApe extends Ape { | ||
| 223 | return {"code": ApeConsts.RETURN_FAILED, "data": "不能再打开更多的设备","mediaChannels":this.mediaModule.mediaChannels}; | 209 | return {"code": ApeConsts.RETURN_FAILED, "data": "不能再打开更多的设备","mediaChannels":this.mediaModule.mediaChannels}; |
| 224 | } | 210 | } |
| 225 | } | 211 | } |
| 226 | - /* message RCVideoSendDataRequestPdu { | ||
| 227 | - required uint32 from_node_id = 1;//发起人 | ||
| 228 | - optional uint32 to_node_id = 2;//接收人,如果是0就是所有人都接收 | ||
| 229 | - optional uint32 actionType = 3;//消息指令类型; | ||
| 230 | - optional bytes data = 4;//其他数据,这个根据actionType来确定数据的结构 | ||
| 231 | - }*/ | ||
| 232 | 212 | ||
| 233 | let videoSendPdu = new pdu['RCVideoSendDataRequestPdu']; | 213 | let videoSendPdu = new pdu['RCVideoSendDataRequestPdu']; |
| 234 | videoSendPdu.type = pdu.RCPDU_SEND_VIDEO_DATA_REQUEST; | 214 | videoSendPdu.type = pdu.RCPDU_SEND_VIDEO_DATA_REQUEST; |
| @@ -255,6 +235,7 @@ class VideoApe extends Ape { | @@ -255,6 +235,7 @@ class VideoApe extends Ape { | ||
| 255 | sendTableUpdateHandler(_channelInfo) { | 235 | sendTableUpdateHandler(_channelInfo) { |
| 256 | loger.log("video===sendTableUpdateHandler "); | 236 | loger.log("video===sendTableUpdateHandler "); |
| 257 | let updateModelPdu = this.packPdu(_channelInfo, _channelInfo.channelId);//let updateModelPdu=this.packPdu({},ApeConsts.VIDEO_OBJ_TABLE_ID+2); | 237 | let updateModelPdu = this.packPdu(_channelInfo, _channelInfo.channelId);//let updateModelPdu=this.packPdu({},ApeConsts.VIDEO_OBJ_TABLE_ID+2); |
| 238 | + | ||
| 258 | if(updateModelPdu==null){ | 239 | if(updateModelPdu==null){ |
| 259 | loger.warn("sendTableUpdateHandler error,updateModelPdu=null"); | 240 | loger.warn("sendTableUpdateHandler error,updateModelPdu=null"); |
| 260 | return; | 241 | return; |
| @@ -262,13 +243,11 @@ class VideoApe extends Ape { | @@ -262,13 +243,11 @@ class VideoApe extends Ape { | ||
| 262 | 243 | ||
| 263 | let tableItemPdu = new pdu['RCRegistryTableItemPdu']; | 244 | let tableItemPdu = new pdu['RCRegistryTableItemPdu']; |
| 264 | tableItemPdu.itemIdx = _channelInfo.channelId;//tableItemPdu.itemIdx=ApeConsts.VIDEO_OBJ_TABLE_ID+2; | 245 | tableItemPdu.itemIdx = _channelInfo.channelId;//tableItemPdu.itemIdx=ApeConsts.VIDEO_OBJ_TABLE_ID+2; |
| 265 | - tableItemPdu.owner = 0;//收到flash的是这个值,不清楚先写固定 | 246 | + tableItemPdu.owner = _channelInfo.owner;//0收到flash的是这个值,MCU做了了用户掉线处理,30秒之后会清理owner为0 |
| 266 | tableItemPdu.itemData = updateModelPdu.toArrayBuffer(); | 247 | tableItemPdu.itemData = updateModelPdu.toArrayBuffer(); |
| 267 | 248 | ||
| 268 | //insert | 249 | //insert |
| 269 | let tableInsertItemPdu = new pdu['RCRegistryTableUpdateItemPdu']; | 250 | let tableInsertItemPdu = new pdu['RCRegistryTableUpdateItemPdu']; |
| 270 | - //optional RCPduType_E type = 1 [default = RCPDU_REG_TABLE_UPDATE_PDU]; | ||
| 271 | - //repeated RCRegistryTableItemPdu items = 2; | ||
| 272 | tableInsertItemPdu.type = pdu.RCPDU_REG_TABLE_UPDATE_PDU;// | 251 | tableInsertItemPdu.type = pdu.RCPDU_REG_TABLE_UPDATE_PDU;// |
| 273 | tableInsertItemPdu.items.push(tableItemPdu); | 252 | tableInsertItemPdu.items.push(tableItemPdu); |
| 274 | 253 | ||
| @@ -296,11 +275,11 @@ class VideoApe extends Ape { | @@ -296,11 +275,11 @@ class VideoApe extends Ape { | ||
| 296 | receiveVideoCommandHandler(_data) { | 275 | receiveVideoCommandHandler(_data) { |
| 297 | let videoReceivePdu = pdu['RCVideoSendDataRequestPdu'].decode(_data); | 276 | let videoReceivePdu = pdu['RCVideoSendDataRequestPdu'].decode(_data); |
| 298 | if (videoReceivePdu == null) { | 277 | if (videoReceivePdu == null) { |
| 299 | - loger.warn("视频消息处理,收到的消息为null,不做处理"); | 278 | + loger.warn("视频控制消息处理,收到的消息为null,不做处理"); |
| 300 | return; | 279 | return; |
| 301 | } | 280 | } |
| 302 | videoReceivePdu.data = this._rCArrayBufferUtil.uint8ArrayToStr(videoReceivePdu.data, 2);//开头两个字会乱码 | 281 | videoReceivePdu.data = this._rCArrayBufferUtil.uint8ArrayToStr(videoReceivePdu.data, 2);//开头两个字会乱码 |
| 303 | - loger.log('视频消息处理 receiveVideoCommandHandler.'); | 282 | + loger.log('视频控制消息处理 .',videoReceivePdu); |
| 304 | console.log(videoReceivePdu); | 283 | console.log(videoReceivePdu); |
| 305 | 284 | ||
| 306 | //判断接收者的id,如果不是0,并且也不是自己的nodeId,那么消息不做处理 | 285 | //判断接收者的id,如果不是0,并且也不是自己的nodeId,那么消息不做处理 |
| @@ -314,6 +293,15 @@ class VideoApe extends Ape { | @@ -314,6 +293,15 @@ class VideoApe extends Ape { | ||
| 314 | tableUpdateHandler(owner, itemIdx, itemData) { | 293 | tableUpdateHandler(owner, itemIdx, itemData) { |
| 315 | // debugger; | 294 | // debugger; |
| 316 | let unpackChannelInfo = this.unPackPdu(owner, itemIdx, itemData); | 295 | let unpackChannelInfo = this.unPackPdu(owner, itemIdx, itemData); |
| 296 | + loger.log("tableUpdateHandler,channel",itemIdx); | ||
| 297 | + | ||
| 298 | + //****很重要******** | ||
| 299 | + //如果owner的值为0,代表的是这个歌频道已经被释放了(mcu服务端对于占用channel的掉线用户,就是把owner设置为0) | ||
| 300 | + if(owner==0){ | ||
| 301 | + loger.log("释放占用的频道,channel",itemIdx); | ||
| 302 | + unpackChannelInfo.status=ApeConsts.CHANNEL_STATUS_RELEASED; | ||
| 303 | + } | ||
| 304 | + | ||
| 317 | this.mediaModule.mediaChannels[itemIdx] = unpackChannelInfo; | 305 | this.mediaModule.mediaChannels[itemIdx] = unpackChannelInfo; |
| 318 | 306 | ||
| 319 | if(unpackChannelInfo&&unpackChannelInfo.fromNodeId!=GlobalConfig.nodeId){ | 307 | if(unpackChannelInfo&&unpackChannelInfo.fromNodeId!=GlobalConfig.nodeId){ |
| @@ -334,13 +322,11 @@ class VideoApe extends Ape { | @@ -334,13 +322,11 @@ class VideoApe extends Ape { | ||
| 334 | if(rtmpStream.code==0){ | 322 | if(rtmpStream.code==0){ |
| 335 | receiveChannelInfo.rtmpUrl=rtmpStream.playUrl; | 323 | receiveChannelInfo.rtmpUrl=rtmpStream.playUrl; |
| 336 | } | 324 | } |
| 337 | - loger.log("VIDEO_PLAY"); | ||
| 338 | - console.log(receiveChannelInfo); | 325 | + loger.log("VIDEO_PLAY",receiveChannelInfo); |
| 339 | //广播播放视频的消息 | 326 | //广播播放视频的消息 |
| 340 | this._emit(MessageTypes.VIDEO_PLAY, receiveChannelInfo); | 327 | this._emit(MessageTypes.VIDEO_PLAY, receiveChannelInfo); |
| 341 | }else { | 328 | }else { |
| 342 | - loger.log("VIDEO_STOP"); | ||
| 343 | - console.log(receiveChannelInfo); | 329 | + loger.log("VIDEO_STOP",receiveChannelInfo); |
| 344 | //流已经停止 | 330 | //流已经停止 |
| 345 | this._emit(MessageTypes.VIDEO_STOP, receiveChannelInfo); | 331 | this._emit(MessageTypes.VIDEO_STOP, receiveChannelInfo); |
| 346 | } | 332 | } |
| @@ -374,18 +360,17 @@ class VideoApe extends Ape { | @@ -374,18 +360,17 @@ class VideoApe extends Ape { | ||
| 374 | packPduModel.timestamp =_param.timestamp||EngineUtils.creatTimestamp(); | 360 | packPduModel.timestamp =_param.timestamp||EngineUtils.creatTimestamp(); |
| 375 | packPduModel.fromNodeId = GlobalConfig.nodeId; | 361 | packPduModel.fromNodeId = GlobalConfig.nodeId; |
| 376 | packPduModel.toNodeId = 0; | 362 | packPduModel.toNodeId = 0; |
| 377 | - console.log("packPdu",packPduModel); | 363 | + console.log(packPduModel); |
| 378 | return packPduModel; | 364 | return packPduModel; |
| 379 | } | 365 | } |
| 380 | 366 | ||
| 381 | unPackPdu(owner, itemIdx, itemData) { | 367 | unPackPdu(owner, itemIdx, itemData) { |
| 382 | - loger.log("unPackPdu "); | 368 | + loger.log("unPackPdu->owner:",owner,"itemIdx->",itemIdx); |
| 383 | if (owner == null || itemIdx == null || itemData == null) { | 369 | if (owner == null || itemIdx == null || itemData == null) { |
| 384 | this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_APE_INTERFACE_PARAM_WRONG); | 370 | this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_APE_INTERFACE_PARAM_WRONG); |
| 385 | return null; | 371 | return null; |
| 386 | } | 372 | } |
| 387 | try { | 373 | try { |
| 388 | - | ||
| 389 | let videoChannelInfo = pdu['RCVideoChannelInfoPdu'].decode(itemData); | 374 | let videoChannelInfo = pdu['RCVideoChannelInfoPdu'].decode(itemData); |
| 390 | console.log(videoChannelInfo); | 375 | console.log(videoChannelInfo); |
| 391 | return videoChannelInfo; | 376 | return videoChannelInfo; |
-
请 注册 或 登录 后发表评论