李勇

修改音视频模块的channel占用释放,更新table数据RCRegistryTableItemPdu的时候,owner的值非常重要,占用频道的时候设置为自己的…

…nodeId,释放占用的时候必须要设置为0,否则其他人无法使用;正在占用channel的人异常掉线之后,MCU服务器会把owner设置为0,其他用户同步的消息中如果owner为0就可以使用
@@ -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;