正在显示
2 个修改的文件
包含
301 行增加
和
277 行删除
| @@ -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 |
-
请 注册 或 登录 后发表评论