李勇

增加MS地址无效时的判断

@@ -35,7 +35,7 @@ import QuestionApe from 'apes/QuestionApe'; @@ -35,7 +35,7 @@ import QuestionApe from 'apes/QuestionApe';
35 import UTF8 from 'utf-8'; 35 import UTF8 from 'utf-8';
36 36
37 let loger = Loger.getLoger('McuClient'); 37 let loger = Loger.getLoger('McuClient');
38 -let _sdkInfo = {"version": "v1.59.0.20170729", "author": "www.3mang.com"}; 38 +let _sdkInfo = {"version": "v1.60.0.20170729", "author": "www.3mang.com"};
39 39
40 //APE 40 //APE
41 let _sass; 41 let _sass;
@@ -907,6 +907,21 @@ export default class MessageEntrance extends Emiter { @@ -907,6 +907,21 @@ export default class MessageEntrance extends Emiter {
907 loger.warn('HLS拉流地址->HLS->', GlobalConfig.MS_PLAY_HLS_IP, GlobalConfig.MS_PLAY_HLS_PORT); 907 loger.warn('HLS拉流地址->HLS->', GlobalConfig.MS_PLAY_HLS_IP, GlobalConfig.MS_PLAY_HLS_PORT);
908 loger.warn('HLS录制回放拉流地址->HLS->', GlobalConfig.RS_RECORD_PLAY_IP, GlobalConfig.RS_RECORD_PLAY_PORT); 908 loger.warn('HLS录制回放拉流地址->HLS->', GlobalConfig.RS_RECORD_PLAY_IP, GlobalConfig.RS_RECORD_PLAY_PORT);
909 909
  910 + if(!GlobalConfig.MS_PUBLISH_IP){
  911 + loger.error("推流MS地址地址无效");
  912 + }
  913 + if(!GlobalConfig.MS_PLAY_RTMP_IP){
  914 + loger.warn("RTMP拉流地址无效->使用推流地址作为RTMP拉流地址");
  915 + GlobalConfig.MS_PLAY_RTMP_IP=GlobalConfig.MS_PUBLISH_IP;
  916 + GlobalConfig.MS_PLAY_RTMP_PORT=GlobalConfig.MS_PUBLISH_PORT
  917 + }
  918 +
  919 + if(!GlobalConfig.MS_PLAY_HLS_IP){
  920 + loger.warn("HLS拉流地址无效->使用HLS回放地址作为HLS拉流地址");
  921 + GlobalConfig.MS_PLAY_HLS_IP=GlobalConfig.MS_PLAY_HLS_PORT;
  922 + GlobalConfig.RS_RECORD_PLAY_IP=GlobalConfig.RS_RECORD_PLAY_PORT
  923 + }
  924 +
910 if (_mcu) { 925 if (_mcu) {
911 _mcu.joinMCU(GlobalConfig.getClassInfo()); 926 _mcu.joinMCU(GlobalConfig.getClassInfo());
912 } 927 }
@@ -11,299 +11,308 @@ import EngineUtils from 'EngineUtils'; @@ -11,299 +11,308 @@ import EngineUtils from 'EngineUtils';
11 let loger = Loger.getLoger('MediaModule'); 11 let loger = Loger.getLoger('MediaModule');
12 12
13 class MediaModule { 13 class MediaModule {
14 - constructor() {  
15 - this.needPublishMediaChannel={};//记录准备推流的频道信息  
16 - this.mediaChannels = {};  
17 - this.maxMediaChannel=0;  
18 - this.mediaType=ApeConsts.MEDIA_TYPE_DEFAULT;  
19 - this.MEDIA_OBJ_TABLE_ID=0;  
20 - this.SCREENSHARING_OBJ_TABLE_ID=ApeConsts.SCREENSHARING_OBJ_TABLE_ID; 14 + constructor() {
  15 + this.needPublishMediaChannel = {};//记录准备推流的频道信息
  16 + this.mediaChannels = {};
  17 + this.maxMediaChannel = 0;
  18 + this.mediaType = ApeConsts.MEDIA_TYPE_DEFAULT;
  19 + this.MEDIA_OBJ_TABLE_ID = 0;
  20 + this.SCREENSHARING_OBJ_TABLE_ID = ApeConsts.SCREENSHARING_OBJ_TABLE_ID;
  21 + }
  22 +
  23 + //获取播流地址
  24 + getMediaPlayPath(_param) {
  25 + loger.log('获取播放地址->');
  26 + if (_param == null || _param.streamId == null) {
  27 + loger.warn('获取播放地址->参数错误', _param);
  28 + //this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_APE_INTERFACE_PARAM_WRONG);
  29 + return {"code": ApeConsts.RETURN_FAILED, "data": ""};
21 } 30 }
22 31
23 - //获取播流地址  
24 - getMediaPlayPath(_param) {  
25 - loger.log('获取播放地址->');  
26 - if (_param == null||_param.streamId == null)  
27 - {  
28 - loger.warn('获取播放地址->参数错误', _param);  
29 - //this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_APE_INTERFACE_PARAM_WRONG);  
30 - return {"code": ApeConsts.RETURN_FAILED, "data": ""};  
31 - }  
32 -  
33 - let path = "";  
34 - let port="";  
35 - let fileName='';  
36 - if (_param.type == "m3u8") {  
37 - //M3U8  
38 - //http://123.56.73.119:6001/live/h5dev_2106728010_8ab3b0ed5a3a9220015a3a958f0d0003_983041_1489113860/index.m3u8  
39 - if(GlobalConfig.siteId==GlobalConfig.siteId_letv){  
40 - //乐视的hls地址规则  
41 - fileName='desc.m3u8';  
42 - }else {  
43 - //fileName='index.m3u8';  
44 - fileName='playlist.m3u8';  
45 - }  
46 - port = (GlobalConfig.MS_PLAY_HLS_PORT == "" || GlobalConfig.MS_PLAY_HLS_PORT == null) ? "":":" + GlobalConfig.MS_PLAY_HLS_PORT;  
47 - path = "http://" + GlobalConfig.MS_PLAY_HLS_IP  
48 - + port + "/live/"  
49 - + _param.streamId  
50 - + ".m3u8";//  
51 - //+ "/"+fileName;//  
52 -  
53 -  
54 - } else {  
55 - //RTMP  
56 - port = (GlobalConfig.MS_PLAY_RTMP_PORT == "" || GlobalConfig.MS_PLAY_RTMP_PORT == null) ? "":":" + GlobalConfig.MS_PLAY_RTMP_PORT;  
57 - path = "rtmp://" + GlobalConfig.MS_PLAY_RTMP_IP  
58 - + port + "/live/"  
59 - + _param.streamId;  
60 - }  
61 -  
62 -  
63 - path=path.replace("::",":");//如果ip和port之间有多的:需要去掉  
64 - return {"code": ApeConsts.RETURN_SUCCESS, "data": "","playUrl": path}; 32 + let path = "";
  33 + let port = "";
  34 + let fileName = '';
  35 + if (_param.type == "m3u8") {
  36 + //M3U8
  37 + if (!GlobalConfig.MS_PLAY_HLS_IP) {
  38 + loger.error("HLS拉流地址地址无效");
  39 + }
  40 + //http://123.56.73.119:6001/live/h5dev_2106728010_8ab3b0ed5a3a9220015a3a958f0d0003_983041_1489113860/index.m3u8
  41 + if (GlobalConfig.siteId == GlobalConfig.siteId_letv) {
  42 + //乐视的hls地址规则
  43 + fileName = 'desc.m3u8';
  44 + } else {
  45 + //fileName='index.m3u8';
  46 + fileName = 'playlist.m3u8';
  47 + }
  48 + port = (GlobalConfig.MS_PLAY_HLS_PORT == "" || GlobalConfig.MS_PLAY_HLS_PORT == null) ? "" : ":" + GlobalConfig.MS_PLAY_HLS_PORT;
  49 + path = "http://" + GlobalConfig.MS_PLAY_HLS_IP
  50 + + port + "/live/"
  51 + + _param.streamId
  52 + + ".m3u8";//
  53 + //+ "/"+fileName;//
  54 +
  55 +
  56 + } else {
  57 + //RTMP
  58 + if (!GlobalConfig.MS_PLAY_RTMP_IP) {
  59 + loger.error("RTMP拉流地址地址无效");
  60 + }
  61 + port = (GlobalConfig.MS_PLAY_RTMP_PORT == "" || GlobalConfig.MS_PLAY_RTMP_PORT == null) ? "" : ":" + GlobalConfig.MS_PLAY_RTMP_PORT;
  62 + path = "rtmp://" + GlobalConfig.MS_PLAY_RTMP_IP
  63 + + port + "/live/"
  64 + + _param.streamId;
65 } 65 }
66 66
67 67
68 - //获取录制回放时点播的地址,只有m3u8  
69 - getMediaRecordPlaybackPath(_param) {  
70 - loger.log('获取录制回放时点播的地址->m3u8');  
71 - if (_param == null||_param.streamId == null)  
72 - {  
73 - loger.warn('获取录制回放时点播的地址->参数错误', _param);  
74 - return {"code": ApeConsts.RETURN_FAILED, "data": ""};  
75 - }  
76 - //M3U8 http://123.56.73.119:6001/live/h5dev_2106728010_8ab3b0ed5a3a9220015a3a958f0d0003_983041_1489113860/total.m3u8  
77 - let port = (GlobalConfig.RS_RECORD_PLAY_PORT == "" || GlobalConfig.RS_RECORD_PLAY_PORT == null) ? "":":" + GlobalConfig.RS_RECORD_PLAY_PORT;  
78 - let path = "http://" + GlobalConfig.RS_RECORD_PLAY_IP  
79 - + port + "/live/"  
80 - + _param.streamId  
81 - + "/total.m3u8";  
82 -  
83 - path=path.replace("::",":");//如果ip和port之间有多的:需要去掉  
84 - return {"code": ApeConsts.RETURN_SUCCESS, "data": "","playUrl": path};  
85 - } 68 + path = path.replace("::", ":");//如果ip和port之间有多的:需要去掉
  69 + return {"code": ApeConsts.RETURN_SUCCESS, "data": "", "playUrl": path};
  70 + }
  71 +
86 72
87 - //获取推流地址  
88 - getMediaPublishPath(_param) {  
89 - loger.log('获取推流地址->');  
90 - //判断当前开启的视频数量是否已经是最大值,如果已经是最大值,不能再开启  
91 - let freeChannel = this.getFreeMediaChannel();  
92 - if (freeChannel == 0) {  
93 - return {"code":ApeConsts.RETURN_FAILED, "data": "不能再打开更多的设备","mediaChannels":this.mediaChannels};  
94 - }  
95 -  
96 - //默认方式推流  
97 - let pubType="live";  
98 - ////flash推流  
99 - //if(_param&&_param.type=="flash"){  
100 - // pubType ="flash";  
101 - //}  
102 -  
103 - //端口,有端口就显示 ":xxx",没有端口就是""  
104 - let port = (GlobalConfig.MS_PUBLISH_PORT == "" || GlobalConfig.MS_PUBLISH_PORT == null) ? "":":" + GlobalConfig.MS_PUBLISH_PORT;  
105 - //时间戳  
106 - let timestamp = EngineUtils.creatTimestamp();  
107 -  
108 - let streamId=GlobalConfig.siteId+"_"  
109 - + GlobalConfig.classId + "_"+GlobalConfig.userId  
110 - +"_" + freeChannel + "_" + timestamp;  
111 -  
112 - //生成推流地址和推流数据(同步数据的时候用)  
113 - let publishUrl = "rtmp://" + GlobalConfig.MS_PUBLISH_IP  
114 - + port + "/"+pubType+"/" +streamId;  
115 -  
116 - publishUrl=publishUrl.replace("::",":");//如果ip和port之间有多的:需要去掉  
117 - this.needPublishMediaChannel[publishUrl]={  
118 - "channelId":freeChannel,  
119 - "publishUrl":publishUrl,  
120 - "streamId":streamId,  
121 - "timestamp":timestamp,  
122 - "nodeId":GlobalConfig.nodeId  
123 - };  
124 - return {"code": ApeConsts.RETURN_SUCCESS,  
125 - "data":"",  
126 - "mediaId":freeChannel,  
127 - "userId":GlobalConfig.userId,  
128 - "userName":GlobalConfig.userName,  
129 - "userRole":GlobalConfig.userRole,  
130 - "publishUrl": publishUrl  
131 - }; 73 + //获取录制回放时点播的地址,只有m3u8
  74 + getMediaRecordPlaybackPath(_param) {
  75 + loger.log('获取录制回放时点播的地址->m3u8');
  76 + if (_param == null || _param.streamId == null) {
  77 + loger.warn('获取录制回放时点播的地址->参数错误', _param);
  78 + return {"code": ApeConsts.RETURN_FAILED, "data": ""};
132 } 79 }
133 - //监课获取推流地址  
134 - getMediaPublishPathForInVisible(_param) {  
135 - let mediaLen=Object.keys(MediaModule.allMediaChannelsList).length;  
136 - let freeChannel=(this.MEDIA_OBJ_TABLE_ID-20-mediaLen)||GlobalConfig.nodeId;  
137 - loger.log('监课获取推流地址->'+freeChannel+" mediaLen:"+mediaLen);  
138 - //默认方式推流  
139 - let pubType="live";  
140 - ////flash推流  
141 - //if(_param&&_param.type=="flash"){  
142 - // pubType ="flash";  
143 - //}  
144 -  
145 - //端口,有端口就显示 ":xxx",没有端口就是""  
146 - let port = (GlobalConfig.MS_PUBLISH_PORT == "" || GlobalConfig.MS_PUBLISH_PORT == null) ? "":":" + GlobalConfig.MS_PUBLISH_PORT;  
147 - //时间戳  
148 - let timestamp = EngineUtils.creatTimestamp();  
149 -  
150 - let streamId=GlobalConfig.siteId+"_"  
151 - + GlobalConfig.classId + "_"+GlobalConfig.userId  
152 - +"_" + freeChannel + "_" + timestamp;  
153 -  
154 - //生成推流地址和推流数据(同步数据的时候用)  
155 - let publishUrl = "rtmp://" + GlobalConfig.MS_PUBLISH_IP  
156 - + port + "/"+pubType+"/" +streamId;  
157 -  
158 - publishUrl=publishUrl.replace("::",":");//如果ip和port之间有多的:需要去掉  
159 - this.needPublishMediaChannel[publishUrl]={  
160 - "channelId":freeChannel,  
161 - "publishUrl":publishUrl,  
162 - "streamId":streamId,  
163 - "timestamp":timestamp,  
164 - "nodeId":GlobalConfig.nodeId  
165 - };  
166 - return {"code": ApeConsts.RETURN_SUCCESS,  
167 - "data":"",  
168 - "userId":GlobalConfig.userId,  
169 - "userName":GlobalConfig.userName,  
170 - "userRole":GlobalConfig.userRole,  
171 - "mediaId":freeChannel,  
172 - "publishUrl": publishUrl  
173 - }; 80 + //M3U8 http://123.56.73.119:6001/live/h5dev_2106728010_8ab3b0ed5a3a9220015a3a958f0d0003_983041_1489113860/total.m3u8
  81 + let port = (GlobalConfig.RS_RECORD_PLAY_PORT == "" || GlobalConfig.RS_RECORD_PLAY_PORT == null) ? "" : ":" + GlobalConfig.RS_RECORD_PLAY_PORT;
  82 + let path = "http://" + GlobalConfig.RS_RECORD_PLAY_IP
  83 + + port + "/live/"
  84 + + _param.streamId
  85 + + "/total.m3u8";
  86 +
  87 + path = path.replace("::", ":");//如果ip和port之间有多的:需要去掉
  88 + return {"code": ApeConsts.RETURN_SUCCESS, "data": "", "playUrl": path};
  89 + }
  90 +
  91 + //获取推流地址
  92 + getMediaPublishPath(_param) {
  93 + loger.log('获取推流地址->');
  94 + //判断当前开启的视频数量是否已经是最大值,如果已经是最大值,不能再开启
  95 + let freeChannel = this.getFreeMediaChannel();
  96 + if (freeChannel == 0) {
  97 + return {"code": ApeConsts.RETURN_FAILED, "data": "不能再打开更多的设备", "mediaChannels": this.mediaChannels};
174 } 98 }
175 99
176 - //桌面共享获取推流地址,频道号由外部传入  
177 - getMediaPublishPathForScreenShare(_shareChannel,_publishType) {  
178 -  
179 - let shareChannel=_shareChannel||this.SCREENSHARING_OBJ_TABLE_ID;  
180 - loger.log('桌面共享获取推流地址->'+shareChannel);  
181 - //默认方式推流  
182 - let pubType="live";//统一使用live 20170615  
183 - /*//flash推流  
184 - if(_publishType=="live"){  
185 - pubType ="live";  
186 - }*/  
187 -  
188 - //端口,有端口就显示 ":xxx",没有端口就是""  
189 - let port = (GlobalConfig.MS_PUBLISH_PORT == "" || GlobalConfig.MS_PUBLISH_PORT == null) ? "":":" + GlobalConfig.MS_PUBLISH_PORT;  
190 - //时间戳  
191 - let timestamp = EngineUtils.creatTimestamp();  
192 -  
193 - let streamId=GlobalConfig.siteId+"_"  
194 - + GlobalConfig.classId + "_"+GlobalConfig.userId  
195 - +"_" + shareChannel + "_" + timestamp;  
196 -  
197 - //生成推流地址和推流数据(同步数据的时候用)  
198 - let publishUrl = "rtmp://" + GlobalConfig.MS_PUBLISH_IP  
199 - + port + "/"+pubType+"/" +streamId;  
200 -  
201 - publishUrl=publishUrl.replace("::",":");//如果ip和port之间有多的:需要去掉  
202 - /* this.needPublishMediaChannel[publishUrl]={  
203 - "channelId":shareChannel,  
204 - "publishUrl":publishUrl,  
205 - "streamId":streamId,  
206 - "timestamp":timestamp,  
207 - "nodeId":GlobalConfig.nodeId  
208 - };*/  
209 - return {"code": ApeConsts.RETURN_SUCCESS,  
210 - "data":"",  
211 - "mediaId":shareChannel,  
212 - "userId":GlobalConfig.userId,  
213 - "userName":GlobalConfig.userName,  
214 - "userRole":GlobalConfig.userRole,  
215 - "publishUrl": publishUrl,  
216 - "streamId":streamId  
217 - };  
218 - } 100 + //默认方式推流
  101 + let pubType = "live";
219 102
220 - //获取当前空闲的channel,返回值为0代表没有空闲的,否则返回的就是空闲的channelId  
221 - getFreeMediaChannel() {  
222 - let counter = 0;  
223 - for (let key in this.mediaChannels) {  
224 - let item = this.mediaChannels[key];  
225 - if (item && item.status == ApeConsts.CHANNEL_STATUS_RELEASED) {  
226 - loger.log("已获取空闲的通道->channelId:"+item.channelId);  
227 - return item.channelId;  
228 - }  
229 - counter++;  
230 - }  
231 - loger.log("获取空闲的通道","mediaChannels",this.mediaChannels,"counter:",counter);  
232 - //loger.log(this.mediaChannels);  
233 - if (counter < this.maxMediaChannel) {  
234 - return this.MEDIA_OBJ_TABLE_ID + (counter);  
235 - }  
236 - return 0;//没有空闲的 103 + if (!GlobalConfig.MS_PUBLISH_IP) {
  104 + loger.error("MS推流地址地址无效");
237 } 105 }
238 106
239 - //获取准备推流的频道信息  
240 - getNeedPublishMediaChannel(_publishUrl){  
241 - return this.needPublishMediaChannel[_publishUrl]; 107 + //端口,有端口就显示 ":xxx",没有端口就是""
  108 + let port = (GlobalConfig.MS_PUBLISH_PORT == "" || GlobalConfig.MS_PUBLISH_PORT == null) ? "" : ":" + GlobalConfig.MS_PUBLISH_PORT;
  109 + //时间戳
  110 + let timestamp = EngineUtils.creatTimestamp();
  111 +
  112 + let streamId = GlobalConfig.siteId + "_"
  113 + + GlobalConfig.classId + "_" + GlobalConfig.userId
  114 + + "_" + freeChannel + "_" + timestamp;
  115 +
  116 + //生成推流地址和推流数据(同步数据的时候用)
  117 + let publishUrl = "rtmp://" + GlobalConfig.MS_PUBLISH_IP
  118 + + port + "/" + pubType + "/" + streamId;
  119 +
  120 + publishUrl = publishUrl.replace("::", ":");//如果ip和port之间有多的:需要去掉
  121 + this.needPublishMediaChannel[publishUrl] = {
  122 + "channelId": freeChannel,
  123 + "publishUrl": publishUrl,
  124 + "streamId": streamId,
  125 + "timestamp": timestamp,
  126 + "nodeId": GlobalConfig.nodeId
  127 + };
  128 + return {
  129 + "code": ApeConsts.RETURN_SUCCESS,
  130 + "data": "",
  131 + "mediaId": freeChannel,
  132 + "userId": GlobalConfig.userId,
  133 + "userName": GlobalConfig.userName,
  134 + "userRole": GlobalConfig.userRole,
  135 + "publishUrl": publishUrl
  136 + };
  137 + }
  138 +
  139 + //监课获取推流地址
  140 + getMediaPublishPathForInVisible(_param) {
  141 + let mediaLen = Object.keys(MediaModule.allMediaChannelsList).length;
  142 + let freeChannel = (this.MEDIA_OBJ_TABLE_ID - 20 - mediaLen) || GlobalConfig.nodeId;
  143 + loger.log('监课获取推流地址->' + freeChannel + " mediaLen:" + mediaLen);
  144 + //默认方式推流
  145 + let pubType = "live";
  146 + ////flash推流
  147 + //if(_param&&_param.type=="flash"){
  148 + // pubType ="flash";
  149 + //}
  150 +
  151 + //端口,有端口就显示 ":xxx",没有端口就是""
  152 + let port = (GlobalConfig.MS_PUBLISH_PORT == "" || GlobalConfig.MS_PUBLISH_PORT == null) ? "" : ":" + GlobalConfig.MS_PUBLISH_PORT;
  153 + //时间戳
  154 + let timestamp = EngineUtils.creatTimestamp();
  155 +
  156 + let streamId = GlobalConfig.siteId + "_"
  157 + + GlobalConfig.classId + "_" + GlobalConfig.userId
  158 + + "_" + freeChannel + "_" + timestamp;
  159 +
  160 + //生成推流地址和推流数据(同步数据的时候用)
  161 + let publishUrl = "rtmp://" + GlobalConfig.MS_PUBLISH_IP
  162 + + port + "/" + pubType + "/" + streamId;
  163 +
  164 + publishUrl = publishUrl.replace("::", ":");//如果ip和port之间有多的:需要去掉
  165 + this.needPublishMediaChannel[publishUrl] = {
  166 + "channelId": freeChannel,
  167 + "publishUrl": publishUrl,
  168 + "streamId": streamId,
  169 + "timestamp": timestamp,
  170 + "nodeId": GlobalConfig.nodeId
  171 + };
  172 + return {
  173 + "code": ApeConsts.RETURN_SUCCESS,
  174 + "data": "",
  175 + "userId": GlobalConfig.userId,
  176 + "userName": GlobalConfig.userName,
  177 + "userRole": GlobalConfig.userRole,
  178 + "mediaId": freeChannel,
  179 + "publishUrl": publishUrl
  180 + };
  181 + }
  182 +
  183 + //桌面共享获取推流地址,频道号由外部传入
  184 + getMediaPublishPathForScreenShare(_shareChannel, _publishType) {
  185 +
  186 + let shareChannel = _shareChannel || this.SCREENSHARING_OBJ_TABLE_ID;
  187 + loger.log('桌面共享获取推流地址->' + shareChannel);
  188 + //默认方式推流
  189 + let pubType = "live";//统一使用live 20170615
  190 + /*//flash推流
  191 + if(_publishType=="live"){
  192 + pubType ="live";
  193 + }*/
  194 +
  195 + //端口,有端口就显示 ":xxx",没有端口就是""
  196 + let port = (GlobalConfig.MS_PUBLISH_PORT == "" || GlobalConfig.MS_PUBLISH_PORT == null) ? "" : ":" + GlobalConfig.MS_PUBLISH_PORT;
  197 + //时间戳
  198 + let timestamp = EngineUtils.creatTimestamp();
  199 +
  200 + let streamId = GlobalConfig.siteId + "_"
  201 + + GlobalConfig.classId + "_" + GlobalConfig.userId
  202 + + "_" + shareChannel + "_" + timestamp;
  203 +
  204 + //生成推流地址和推流数据(同步数据的时候用)
  205 + let publishUrl = "rtmp://" + GlobalConfig.MS_PUBLISH_IP
  206 + + port + "/" + pubType + "/" + streamId;
  207 +
  208 + publishUrl = publishUrl.replace("::", ":");//如果ip和port之间有多的:需要去掉
  209 + /* this.needPublishMediaChannel[publishUrl]={
  210 + "channelId":shareChannel,
  211 + "publishUrl":publishUrl,
  212 + "streamId":streamId,
  213 + "timestamp":timestamp,
  214 + "nodeId":GlobalConfig.nodeId
  215 + };*/
  216 + return {
  217 + "code": ApeConsts.RETURN_SUCCESS,
  218 + "data": "",
  219 + "mediaId": shareChannel,
  220 + "userId": GlobalConfig.userId,
  221 + "userName": GlobalConfig.userName,
  222 + "userRole": GlobalConfig.userRole,
  223 + "publishUrl": publishUrl,
  224 + "streamId": streamId
  225 + };
  226 + }
  227 +
  228 + //获取当前空闲的channel,返回值为0代表没有空闲的,否则返回的就是空闲的channelId
  229 + getFreeMediaChannel() {
  230 + let counter = 0;
  231 + for (let key in this.mediaChannels) {
  232 + let item = this.mediaChannels[key];
  233 + if (item && item.status == ApeConsts.CHANNEL_STATUS_RELEASED) {
  234 + loger.log("已获取空闲的通道->channelId:" + item.channelId);
  235 + return item.channelId;
  236 + }
  237 + counter++;
242 } 238 }
243 -  
244 - //获取当前属于nodeId的已经打开的的channel,返回值为0代表没有打开的,否则返回的就是打开的channelId  
245 - getOpeningMediaChannelForNodeId(_nodeId){  
246 - loger.log("getOpeningMediaChannel","nodeId",_nodeId,"mediaChannels:",this.mediaChannels);  
247 - let channelInfo={};  
248 - channelInfo.channelId=0;  
249 - if(_nodeId==null||_nodeId==0){  
250 - return channelInfo;  
251 - }  
252 - for (let key in this.mediaChannels) {  
253 - let item = this.mediaChannels[key];  
254 - if (item && item.status == ApeConsts.CHANNEL_STATUS_OPENING&&item.fromNodeId==_nodeId) {  
255 - return item;  
256 - }  
257 - }  
258 - return channelInfo; 239 + loger.log("获取空闲的通道", "mediaChannels", this.mediaChannels, "counter:", counter);
  240 + //loger.log(this.mediaChannels);
  241 + if (counter < this.maxMediaChannel) {
  242 + return this.MEDIA_OBJ_TABLE_ID + (counter);
259 } 243 }
260 -  
261 - //检查频道是否已经被占用  
262 - checkChannelIsOpening(_channelId){  
263 - if(_channelId==null){  
264 - loger.warn("checkChannelIsOpening error,channel=",_channelId);  
265 - return true;  
266 - }  
267 - let channelInfo=this.mediaChannels[_channelId];  
268 - if(channelInfo==null||channelInfo.status==ApeConsts.CHANNEL_STATUS_RELEASED){  
269 - return false;  
270 - }  
271 - return true; 244 + return 0;//没有空闲的
  245 + }
  246 +
  247 + //获取准备推流的频道信息
  248 + getNeedPublishMediaChannel(_publishUrl) {
  249 + return this.needPublishMediaChannel[_publishUrl];
  250 + }
  251 +
  252 + //获取当前属于nodeId的已经打开的的channel,返回值为0代表没有打开的,否则返回的就是打开的channelId
  253 + getOpeningMediaChannelForNodeId(_nodeId) {
  254 + loger.log("getOpeningMediaChannel", "nodeId", _nodeId, "mediaChannels:", this.mediaChannels);
  255 + let channelInfo = {};
  256 + channelInfo.channelId = 0;
  257 + if (_nodeId == null || _nodeId == 0) {
  258 + return channelInfo;
272 } 259 }
273 -  
274 - //获取当前所有频道的信息  
275 - getAllMediaChannelInfo(){  
276 - let channels=[];  
277 - for (let key in this.mediaChannels){  
278 - let channel=this.mediaChannels[key];  
279 - if(channel){  
280 - channels.push({"mediaId":channel.channelId,"status":channel.status,"fromNodeId":channel.fromNodeId});  
281 - }  
282 - }  
283 - if(channels.length<this.maxMediaChannel){  
284 - for (let i=channels.length;i<this.maxMediaChannel;i++){  
285 - let channelId=this.MEDIA_OBJ_TABLE_ID + (i);  
286 - channels.push({"mediaId":channelId,"status":ApeConsts.CHANNEL_STATUS_RELEASED,"fromNodeId":0});  
287 - }  
288 - }  
289 - return channels; 260 + for (let key in this.mediaChannels) {
  261 + let item = this.mediaChannels[key];
  262 + if (item && item.status == ApeConsts.CHANNEL_STATUS_OPENING && item.fromNodeId == _nodeId) {
  263 + return item;
  264 + }
  265 + }
  266 + return channelInfo;
  267 + }
  268 +
  269 + //检查频道是否已经被占用
  270 + checkChannelIsOpening(_channelId) {
  271 + if (_channelId == null) {
  272 + loger.warn("checkChannelIsOpening error,channel=", _channelId);
  273 + return true;
  274 + }
  275 + let channelInfo = this.mediaChannels[_channelId];
  276 + if (channelInfo == null || channelInfo.status == ApeConsts.CHANNEL_STATUS_RELEASED) {
  277 + return false;
  278 + }
  279 + return true;
  280 + }
  281 +
  282 + //获取当前所有频道的信息
  283 + getAllMediaChannelInfo() {
  284 + let channels = [];
  285 + for (let key in this.mediaChannels) {
  286 + let channel = this.mediaChannels[key];
  287 + if (channel) {
  288 + channels.push({"mediaId": channel.channelId, "status": channel.status, "fromNodeId": channel.fromNodeId});
  289 + }
290 } 290 }
291 - //获取默认的频道信息  
292 - getDefaultChannelInfo(){  
293 - let channelInfo={};  
294 - channelInfo.owner=0;//这个很重要,释放的时候必须设置为0,占用的时候设置为自己的nodeId  
295 - channelInfo.status=ApeConsts.CHANNEL_STATUS_RELEASED;  
296 - channelInfo.fromNodeId=GlobalConfig.nodeId;  
297 - channelInfo.channelId=0;//channelId不能为0  
298 - channelInfo.streamId="";  
299 - channelInfo.classId=GlobalConfig.classId;  
300 - channelInfo.siteId=GlobalConfig.siteId;  
301 - channelInfo.toNodeId=0;  
302 - channelInfo.userId=GlobalConfig.userId;  
303 - channelInfo.mediaType=this.mediaType||ApeConsts.MEDIA_TYPE_DEFAULT;  
304 - return channelInfo; 291 + if (channels.length < this.maxMediaChannel) {
  292 + for (let i = channels.length; i < this.maxMediaChannel; i++) {
  293 + let channelId = this.MEDIA_OBJ_TABLE_ID + (i);
  294 + channels.push({"mediaId": channelId, "status": ApeConsts.CHANNEL_STATUS_RELEASED, "fromNodeId": 0});
  295 + }
305 } 296 }
  297 + return channels;
  298 + }
  299 +
  300 + //获取默认的频道信息
  301 + getDefaultChannelInfo() {
  302 + let channelInfo = {};
  303 + channelInfo.owner = 0;//这个很重要,释放的时候必须设置为0,占用的时候设置为自己的nodeId
  304 + channelInfo.status = ApeConsts.CHANNEL_STATUS_RELEASED;
  305 + channelInfo.fromNodeId = GlobalConfig.nodeId;
  306 + channelInfo.channelId = 0;//channelId不能为0
  307 + channelInfo.streamId = "";
  308 + channelInfo.classId = GlobalConfig.classId;
  309 + channelInfo.siteId = GlobalConfig.siteId;
  310 + channelInfo.toNodeId = 0;
  311 + channelInfo.userId = GlobalConfig.userId;
  312 + channelInfo.mediaType = this.mediaType || ApeConsts.MEDIA_TYPE_DEFAULT;
  313 + return channelInfo;
  314 + }
306 } 315 }
307 -MediaModule.allMediaChannelsList={};//当前已经创建的所有音视频通道(包含释放或未未释放的) 316 +MediaModule.allMediaChannelsList = {};//当前已经创建的所有音视频通道(包含释放或未未释放的)
308 export default MediaModule; 317 export default MediaModule;
309 318