Commit 9fc3db1f5e381378fd54818e0ba017df6be96fa9
1 parent
f525b557
增加发流音视频分开发送
Showing
3 changed files
with
211 additions
and
79 deletions
src/main/java/com/genersoft/iot/vmp/media/zlm/dto/HookType.java
src/main/java/com/genersoft/iot/vmp/vmanager/bean/OtherRtpSendInfo.java
| @@ -5,12 +5,17 @@ public class OtherRtpSendInfo { | @@ -5,12 +5,17 @@ public class OtherRtpSendInfo { | ||
| 5 | /** | 5 | /** |
| 6 | * 发流IP | 6 | * 发流IP |
| 7 | */ | 7 | */ |
| 8 | - private String ip; | 8 | + private String sendLocalIp; |
| 9 | 9 | ||
| 10 | /** | 10 | /** |
| 11 | - * 发流端口 | 11 | + * 音频发流端口 |
| 12 | */ | 12 | */ |
| 13 | - private int port; | 13 | + private int sendLocalPortForAudio; |
| 14 | + | ||
| 15 | + /** | ||
| 16 | + * 视频发流端口 | ||
| 17 | + */ | ||
| 18 | + private int sendLocalPortForVideo; | ||
| 14 | 19 | ||
| 15 | /** | 20 | /** |
| 16 | * 收流IP | 21 | * 收流IP |
| @@ -18,9 +23,14 @@ public class OtherRtpSendInfo { | @@ -18,9 +23,14 @@ public class OtherRtpSendInfo { | ||
| 18 | private String receiveIp; | 23 | private String receiveIp; |
| 19 | 24 | ||
| 20 | /** | 25 | /** |
| 21 | - * 收流端口 | 26 | + * 音频收流端口 |
| 27 | + */ | ||
| 28 | + private int receivePortForAudio; | ||
| 29 | + | ||
| 30 | + /** | ||
| 31 | + * 视频收流端口 | ||
| 22 | */ | 32 | */ |
| 23 | - private int receivePort; | 33 | + private int receivePortForVideo; |
| 24 | 34 | ||
| 25 | /** | 35 | /** |
| 26 | * 会话ID | 36 | * 会话ID |
| @@ -48,23 +58,6 @@ public class OtherRtpSendInfo { | @@ -48,23 +58,6 @@ public class OtherRtpSendInfo { | ||
| 48 | private String pushSSRC; | 58 | private String pushSSRC; |
| 49 | 59 | ||
| 50 | 60 | ||
| 51 | - | ||
| 52 | - public String getIp() { | ||
| 53 | - return ip; | ||
| 54 | - } | ||
| 55 | - | ||
| 56 | - public void setIp(String ip) { | ||
| 57 | - this.ip = ip; | ||
| 58 | - } | ||
| 59 | - | ||
| 60 | - public int getPort() { | ||
| 61 | - return port; | ||
| 62 | - } | ||
| 63 | - | ||
| 64 | - public void setPort(int port) { | ||
| 65 | - this.port = port; | ||
| 66 | - } | ||
| 67 | - | ||
| 68 | public String getReceiveIp() { | 61 | public String getReceiveIp() { |
| 69 | return receiveIp; | 62 | return receiveIp; |
| 70 | } | 63 | } |
| @@ -73,12 +66,20 @@ public class OtherRtpSendInfo { | @@ -73,12 +66,20 @@ public class OtherRtpSendInfo { | ||
| 73 | this.receiveIp = receiveIp; | 66 | this.receiveIp = receiveIp; |
| 74 | } | 67 | } |
| 75 | 68 | ||
| 76 | - public int getReceivePort() { | ||
| 77 | - return receivePort; | 69 | + public int getReceivePortForAudio() { |
| 70 | + return receivePortForAudio; | ||
| 71 | + } | ||
| 72 | + | ||
| 73 | + public void setReceivePortForAudio(int receivePortForAudio) { | ||
| 74 | + this.receivePortForAudio = receivePortForAudio; | ||
| 75 | + } | ||
| 76 | + | ||
| 77 | + public int getReceivePortForVideo() { | ||
| 78 | + return receivePortForVideo; | ||
| 78 | } | 79 | } |
| 79 | 80 | ||
| 80 | - public void setReceivePort(int receivePort) { | ||
| 81 | - this.receivePort = receivePort; | 81 | + public void setReceivePortForVideo(int receivePortForVideo) { |
| 82 | + this.receivePortForVideo = receivePortForVideo; | ||
| 82 | } | 83 | } |
| 83 | 84 | ||
| 84 | public String getCallId() { | 85 | public String getCallId() { |
| @@ -121,15 +122,45 @@ public class OtherRtpSendInfo { | @@ -121,15 +122,45 @@ public class OtherRtpSendInfo { | ||
| 121 | this.pushSSRC = pushSSRC; | 122 | this.pushSSRC = pushSSRC; |
| 122 | } | 123 | } |
| 123 | 124 | ||
| 125 | + | ||
| 126 | + public String getSendLocalIp() { | ||
| 127 | + return sendLocalIp; | ||
| 128 | + } | ||
| 129 | + | ||
| 130 | + public void setSendLocalIp(String sendLocalIp) { | ||
| 131 | + this.sendLocalIp = sendLocalIp; | ||
| 132 | + } | ||
| 133 | + | ||
| 134 | + public int getSendLocalPortForAudio() { | ||
| 135 | + return sendLocalPortForAudio; | ||
| 136 | + } | ||
| 137 | + | ||
| 138 | + public void setSendLocalPortForAudio(int sendLocalPortForAudio) { | ||
| 139 | + this.sendLocalPortForAudio = sendLocalPortForAudio; | ||
| 140 | + } | ||
| 141 | + | ||
| 142 | + public int getSendLocalPortForVideo() { | ||
| 143 | + return sendLocalPortForVideo; | ||
| 144 | + } | ||
| 145 | + | ||
| 146 | + public void setSendLocalPortForVideo(int sendLocalPortForVideo) { | ||
| 147 | + this.sendLocalPortForVideo = sendLocalPortForVideo; | ||
| 148 | + } | ||
| 149 | + | ||
| 124 | @Override | 150 | @Override |
| 125 | public String toString() { | 151 | public String toString() { |
| 126 | return "OtherRtpSendInfo{" + | 152 | return "OtherRtpSendInfo{" + |
| 127 | - " ip='" + ip + '\'' + | ||
| 128 | - ", port=" + port + | 153 | + "sendLocalIp='" + sendLocalIp + '\'' + |
| 154 | + ", sendLocalPortForAudio=" + sendLocalPortForAudio + | ||
| 155 | + ", sendLocalPortForVideo=" + sendLocalPortForVideo + | ||
| 129 | ", receiveIp='" + receiveIp + '\'' + | 156 | ", receiveIp='" + receiveIp + '\'' + |
| 130 | - ", receivePort=" + receivePort + | 157 | + ", receivePortForAudio=" + receivePortForAudio + |
| 158 | + ", receivePortForVideo=" + receivePortForVideo + | ||
| 131 | ", callId='" + callId + '\'' + | 159 | ", callId='" + callId + '\'' + |
| 132 | ", stream='" + stream + '\'' + | 160 | ", stream='" + stream + '\'' + |
| 161 | + ", pushApp='" + pushApp + '\'' + | ||
| 162 | + ", pushStream='" + pushStream + '\'' + | ||
| 163 | + ", pushSSRC='" + pushSSRC + '\'' + | ||
| 133 | '}'; | 164 | '}'; |
| 134 | } | 165 | } |
| 135 | } | 166 | } |
src/main/java/com/genersoft/iot/vmp/vmanager/rtp/RtpController.java
| @@ -98,10 +98,13 @@ public class RtpController { | @@ -98,10 +98,13 @@ public class RtpController { | ||
| 98 | }catch (NumberFormatException e) { | 98 | }catch (NumberFormatException e) { |
| 99 | throw new ControllerException(ErrorCode.ERROR100.getCode(),"ssrc格式错误"); | 99 | throw new ControllerException(ErrorCode.ERROR100.getCode(),"ssrc格式错误"); |
| 100 | } | 100 | } |
| 101 | - | ||
| 102 | } | 101 | } |
| 103 | String receiveKey = VideoManagerConstants.WVP_OTHER_RECEIVE_RTP_INFO + userSetting.getServerId() + "_" + callId + "_" + stream; | 102 | String receiveKey = VideoManagerConstants.WVP_OTHER_RECEIVE_RTP_INFO + userSetting.getServerId() + "_" + callId + "_" + stream; |
| 104 | - int localPort = zlmServerFactory.createRTPServer(mediaServerItem, stream, ssrcInt, null, false, tcpMode); | 103 | + int localPortForVideo = zlmServerFactory.createRTPServer(mediaServerItem, stream, ssrcInt, null, false, tcpMode); |
| 104 | + int localPortForAudio = zlmServerFactory.createRTPServer(mediaServerItem, stream + "_a" , ssrcInt, null, false, tcpMode); | ||
| 105 | + if (localPortForVideo == 0 || localPortForAudio == 0) { | ||
| 106 | + throw new ControllerException(ErrorCode.ERROR100.getCode(), "获取端口失败"); | ||
| 107 | + } | ||
| 105 | // 注册回调如果rtp收流超时则通过回调发送通知 | 108 | // 注册回调如果rtp收流超时则通过回调发送通知 |
| 106 | if (callBack != null) { | 109 | if (callBack != null) { |
| 107 | HookSubscribeForRtpServerTimeout hookSubscribeForRtpServerTimeout = HookSubscribeFactory.on_rtp_server_timeout(stream, String.valueOf(ssrcInt), mediaServerItem.getId()); | 110 | HookSubscribeForRtpServerTimeout hookSubscribeForRtpServerTimeout = HookSubscribeFactory.on_rtp_server_timeout(stream, String.valueOf(ssrcInt), mediaServerItem.getId()); |
| @@ -121,12 +124,14 @@ public class RtpController { | @@ -121,12 +124,14 @@ public class RtpController { | ||
| 121 | } catch (IOException e) { | 124 | } catch (IOException e) { |
| 122 | logger.error("[第三方服务对接->开启收流和获取发流信息] 等待收流超时 callId->{}, 发送回调失败", callId, e); | 125 | logger.error("[第三方服务对接->开启收流和获取发流信息] 等待收流超时 callId->{}, 发送回调失败", callId, e); |
| 123 | } | 126 | } |
| 127 | + hookSubscribe.removeSubscribe(hookSubscribeForRtpServerTimeout); | ||
| 124 | } | 128 | } |
| 125 | }); | 129 | }); |
| 126 | } | 130 | } |
| 127 | OtherRtpSendInfo otherRtpSendInfo = new OtherRtpSendInfo(); | 131 | OtherRtpSendInfo otherRtpSendInfo = new OtherRtpSendInfo(); |
| 128 | otherRtpSendInfo.setReceiveIp(mediaServerItem.getSdpIp()); | 132 | otherRtpSendInfo.setReceiveIp(mediaServerItem.getSdpIp()); |
| 129 | - otherRtpSendInfo.setReceivePort(localPort); | 133 | + otherRtpSendInfo.setReceivePortForVideo(localPortForVideo); |
| 134 | + otherRtpSendInfo.setReceivePortForAudio(localPortForAudio); | ||
| 130 | otherRtpSendInfo.setCallId(callId); | 135 | otherRtpSendInfo.setCallId(callId); |
| 131 | otherRtpSendInfo.setStream(stream); | 136 | otherRtpSendInfo.setStream(stream); |
| 132 | 137 | ||
| @@ -135,11 +140,13 @@ public class RtpController { | @@ -135,11 +140,13 @@ public class RtpController { | ||
| 135 | if (isSend != null && isSend) { | 140 | if (isSend != null && isSend) { |
| 136 | String key = VideoManagerConstants.WVP_OTHER_SEND_RTP_INFO + userSetting.getServerId() + "_" + callId; | 141 | String key = VideoManagerConstants.WVP_OTHER_SEND_RTP_INFO + userSetting.getServerId() + "_" + callId; |
| 137 | // 预创建发流信息 | 142 | // 预创建发流信息 |
| 138 | - int port = sendRtpPortManager.getNextPort(mediaServerItem.getId()); | 143 | + int portForVideo = sendRtpPortManager.getNextPort(mediaServerItem.getId()); |
| 144 | + int portForAudio = sendRtpPortManager.getNextPort(mediaServerItem.getId()); | ||
| 139 | // 将信息写入redis中,以备后用 | 145 | // 将信息写入redis中,以备后用 |
| 140 | redisTemplate.opsForValue().set(key, otherRtpSendInfo, 300, TimeUnit.SECONDS); | 146 | redisTemplate.opsForValue().set(key, otherRtpSendInfo, 300, TimeUnit.SECONDS); |
| 141 | - otherRtpSendInfo.setIp(mediaServerItem.getSdpIp()); | ||
| 142 | - otherRtpSendInfo.setPort(port); | 147 | + otherRtpSendInfo.setSendLocalIp(mediaServerItem.getSdpIp()); |
| 148 | + otherRtpSendInfo.setSendLocalPortForVideo(portForVideo); | ||
| 149 | + otherRtpSendInfo.setSendLocalPortForAudio(portForAudio); | ||
| 143 | logger.info("[第三方服务对接->开启收流和获取发流信息] 结果,callId->{}, {}", callId, otherRtpSendInfo); | 150 | logger.info("[第三方服务对接->开启收流和获取发流信息] 结果,callId->{}, {}", callId, otherRtpSendInfo); |
| 144 | } | 151 | } |
| 145 | return otherRtpSendInfo; | 152 | return otherRtpSendInfo; |
| @@ -153,6 +160,7 @@ public class RtpController { | @@ -153,6 +160,7 @@ public class RtpController { | ||
| 153 | logger.info("[第三方服务对接->关闭收流] stream->{}", stream); | 160 | logger.info("[第三方服务对接->关闭收流] stream->{}", stream); |
| 154 | MediaServerItem mediaServerItem = mediaServerService.getDefaultMediaServer(); | 161 | MediaServerItem mediaServerItem = mediaServerService.getDefaultMediaServer(); |
| 155 | zlmServerFactory.closeRtpServer(mediaServerItem,stream); | 162 | zlmServerFactory.closeRtpServer(mediaServerItem,stream); |
| 163 | + zlmServerFactory.closeRtpServer(mediaServerItem,stream + "_a"); | ||
| 156 | String receiveKey = VideoManagerConstants.WVP_OTHER_RECEIVE_RTP_INFO + userSetting.getServerId() + "_*_" + stream; | 164 | String receiveKey = VideoManagerConstants.WVP_OTHER_RECEIVE_RTP_INFO + userSetting.getServerId() + "_*_" + stream; |
| 157 | List<Object> scan = RedisUtil.scan(redisTemplate, receiveKey); | 165 | List<Object> scan = RedisUtil.scan(redisTemplate, receiveKey); |
| 158 | if (scan.size() > 0) { | 166 | if (scan.size() > 0) { |
| @@ -167,20 +175,51 @@ public class RtpController { | @@ -167,20 +175,51 @@ public class RtpController { | ||
| 167 | @ResponseBody | 175 | @ResponseBody |
| 168 | @Operation(summary = "发送流") | 176 | @Operation(summary = "发送流") |
| 169 | @Parameter(name = "ssrc", description = "发送流的SSRC", required = true) | 177 | @Parameter(name = "ssrc", description = "发送流的SSRC", required = true) |
| 170 | - @Parameter(name = "ip", description = "目标IP", required = true) | ||
| 171 | - @Parameter(name = "port", description = "目标端口", required = true) | 178 | + @Parameter(name = "dstIpForAudio", description = "目标音频收流IP", required = false) |
| 179 | + @Parameter(name = "dstIpForVideo", description = "目标视频收流IP", required = false) | ||
| 180 | + @Parameter(name = "dstPortForAudio", description = "目标音频收流端口", required = false) | ||
| 181 | + @Parameter(name = "dstPortForVideo", description = "目标视频收流端口", required = false) | ||
| 172 | @Parameter(name = "app", description = "待发送应用名", required = true) | 182 | @Parameter(name = "app", description = "待发送应用名", required = true) |
| 173 | @Parameter(name = "stream", description = "待发送流Id", required = true) | 183 | @Parameter(name = "stream", description = "待发送流Id", required = true) |
| 174 | @Parameter(name = "callId", description = "整个过程的唯一标识,不传则使用随机端口发流", required = true) | 184 | @Parameter(name = "callId", description = "整个过程的唯一标识,不传则使用随机端口发流", required = true) |
| 175 | - @Parameter(name = "onlyAudio", description = "是否只有音频", required = true) | ||
| 176 | @Parameter(name = "isUdp", description = "是否为UDP", required = true) | 185 | @Parameter(name = "isUdp", description = "是否为UDP", required = true) |
| 177 | - @Parameter(name = "streamType", description = "流类型,1为es流,2为ps流, 默认es流", required = false) | ||
| 178 | - @Parameter(name = "pt", description = "rtp的pt", required = true) | ||
| 179 | - public void sendRTP(String ssrc, String ip, Integer port, String app, String stream, String callId, Boolean onlyAudio, Boolean isUdp, @RequestParam(required = false)Integer streamType, Integer pt) { | ||
| 180 | - logger.info("[第三方服务对接->发送流] ssrc->{}, ip->{}, port->{}, app->{}, stream->{}, callId->{}, onlyAudio->{}, streamType->{}, pt->{}", | ||
| 181 | - ssrc, ip, port, app, stream, callId, onlyAudio, streamType == 1? "ES":"PS", pt); | ||
| 182 | - if (ObjectUtils.isEmpty(streamType)) { | ||
| 183 | - streamType = 1; | 186 | + @Parameter(name = "ptForAudio", description = "rtp的音频pt", required = false) |
| 187 | + @Parameter(name = "ptForVideo", description = "rtp的视频pt", required = false) | ||
| 188 | + public void sendRTP(String ssrc, | ||
| 189 | + @RequestParam(required = false)String dstIpForAudio, | ||
| 190 | + @RequestParam(required = false)String dstIpForVideo, | ||
| 191 | + @RequestParam(required = false)Integer dstPortForAudio, | ||
| 192 | + @RequestParam(required = false)Integer dstPortForVideo, | ||
| 193 | + String app, | ||
| 194 | + String stream, | ||
| 195 | + String callId, | ||
| 196 | + Boolean isUdp, | ||
| 197 | + @RequestParam(required = false)Integer ptForAudio, | ||
| 198 | + @RequestParam(required = false)Integer ptForVideo | ||
| 199 | + ) { | ||
| 200 | + logger.info("[第三方服务对接->发送流] " + | ||
| 201 | + "ssrc->{}, \r\n" + | ||
| 202 | + "dstIpForAudio->{}, \n" + | ||
| 203 | + "dstIpForAudio->{}, \n" + | ||
| 204 | + "dstPortForAudio->{}, \n" + | ||
| 205 | + "dstPortForVideo->{}, \n" + | ||
| 206 | + "app->{}, \n" + | ||
| 207 | + "stream->{}, \n" + | ||
| 208 | + "callId->{}, \n" + | ||
| 209 | + "ptForAudio->{}, \n" + | ||
| 210 | + "ptForVideo->{}", | ||
| 211 | + ssrc, | ||
| 212 | + dstIpForAudio, | ||
| 213 | + dstIpForVideo, | ||
| 214 | + dstPortForAudio, | ||
| 215 | + dstPortForVideo, | ||
| 216 | + app, | ||
| 217 | + stream, | ||
| 218 | + callId, | ||
| 219 | + ptForAudio, | ||
| 220 | + ptForVideo); | ||
| 221 | + if (!((dstPortForAudio > 0 && !ObjectUtils.isEmpty(dstPortForAudio) || (dstPortForVideo > 0 && !ObjectUtils.isEmpty(dstIpForVideo))))) { | ||
| 222 | + throw new ControllerException(ErrorCode.ERROR400.getCode(), "至少应该存在一组音频或视频发送参数"); | ||
| 184 | } | 223 | } |
| 185 | MediaServerItem mediaServerItem = mediaServerService.getDefaultMediaServer(); | 224 | MediaServerItem mediaServerItem = mediaServerService.getDefaultMediaServer(); |
| 186 | String key = VideoManagerConstants.WVP_OTHER_SEND_RTP_INFO + userSetting.getServerId() + "_" + callId; | 225 | String key = VideoManagerConstants.WVP_OTHER_SEND_RTP_INFO + userSetting.getServerId() + "_" + callId; |
| @@ -192,32 +231,74 @@ public class RtpController { | @@ -192,32 +231,74 @@ public class RtpController { | ||
| 192 | sendInfo.setPushStream(stream); | 231 | sendInfo.setPushStream(stream); |
| 193 | sendInfo.setPushSSRC(ssrc); | 232 | sendInfo.setPushSSRC(ssrc); |
| 194 | 233 | ||
| 195 | - Map<String, Object> param = new HashMap<>(12); | ||
| 196 | - param.put("vhost","__defaultVhost__"); | ||
| 197 | - param.put("app",app); | ||
| 198 | - param.put("stream",stream); | ||
| 199 | - param.put("ssrc", ssrc); | 234 | + Map<String, Object> paramForAudio; |
| 235 | + Map<String, Object> paramForVideo; | ||
| 236 | + if (!ObjectUtils.isEmpty(dstIpForAudio) && dstPortForAudio > 0) { | ||
| 237 | + paramForAudio = new HashMap<>(); | ||
| 238 | + paramForAudio.put("vhost","__defaultVhost__"); | ||
| 239 | + paramForAudio.put("app",app); | ||
| 240 | + paramForAudio.put("stream",stream); | ||
| 241 | + paramForAudio.put("ssrc", ssrc); | ||
| 242 | + | ||
| 243 | + paramForAudio.put("dst_url", dstIpForAudio); | ||
| 244 | + paramForAudio.put("dst_port", dstPortForAudio); | ||
| 245 | + String is_Udp = isUdp ? "1" : "0"; | ||
| 246 | + paramForAudio.put("is_udp", is_Udp); | ||
| 247 | + paramForAudio.put("src_port", sendInfo.getSendLocalPortForAudio()); | ||
| 248 | + paramForAudio.put("use_ps", "0"); | ||
| 249 | + paramForAudio.put("only_audio", "1"); | ||
| 250 | + if (ptForAudio != null) { | ||
| 251 | + paramForAudio.put("pt", ptForAudio); | ||
| 252 | + } | ||
| 253 | + | ||
| 254 | + } else { | ||
| 255 | + paramForAudio = null; | ||
| 256 | + } | ||
| 257 | + if (!ObjectUtils.isEmpty(dstIpForVideo) && dstPortForVideo > 0) { | ||
| 258 | + paramForVideo = new HashMap<>(); | ||
| 259 | + paramForVideo.put("vhost","__defaultVhost__"); | ||
| 260 | + paramForVideo.put("app",app); | ||
| 261 | + paramForVideo.put("stream",stream); | ||
| 262 | + paramForVideo.put("ssrc", ssrc); | ||
| 263 | + | ||
| 264 | + paramForVideo.put("dst_url", dstIpForVideo); | ||
| 265 | + paramForVideo.put("dst_port", dstPortForVideo); | ||
| 266 | + String is_Udp = isUdp ? "1" : "0"; | ||
| 267 | + paramForVideo.put("is_udp", is_Udp); | ||
| 268 | + paramForVideo.put("src_port", sendInfo.getSendLocalPortForVideo()); | ||
| 269 | + paramForVideo.put("use_ps", "0"); | ||
| 270 | + paramForVideo.put("only_audio", "0"); | ||
| 271 | + if (ptForVideo != null) { | ||
| 272 | + paramForVideo.put("pt", ptForVideo); | ||
| 273 | + } | ||
| 200 | 274 | ||
| 201 | - param.put("dst_url",ip); | ||
| 202 | - param.put("dst_port", port); | ||
| 203 | - String is_Udp = isUdp ? "1" : "0"; | ||
| 204 | - param.put("is_udp", is_Udp); | ||
| 205 | - param.put("src_port", sendInfo.getPort()); | ||
| 206 | - param.put("use_ps", streamType==2 ? "1" : "0"); | ||
| 207 | - param.put("only_audio", onlyAudio ? "1" : "0"); | ||
| 208 | - param.put("pt", pt); | 275 | + } else { |
| 276 | + paramForVideo = null; | ||
| 277 | + } | ||
| 209 | 278 | ||
| 210 | Boolean streamReady = zlmServerFactory.isStreamReady(mediaServerItem, app, stream); | 279 | Boolean streamReady = zlmServerFactory.isStreamReady(mediaServerItem, app, stream); |
| 211 | if (streamReady) { | 280 | if (streamReady) { |
| 212 | - logger.info("[第三方服务对接->发送流] 流存在,开始发流,callId->{}", callId); | ||
| 213 | - JSONObject jsonObject = zlmServerFactory.startSendRtpStream(mediaServerItem, param); | ||
| 214 | - if (jsonObject.getInteger("code") == 0) { | ||
| 215 | - logger.info("[第三方服务对接->发送流] 发流成功,callId->{}", callId); | ||
| 216 | - redisTemplate.opsForValue().set(key, sendInfo); | ||
| 217 | - }else { | ||
| 218 | - redisTemplate.delete(key); | ||
| 219 | - logger.info("[第三方服务对接->发送流] 发流失败,callId->{}, {}", callId, jsonObject.getString("msg")); | ||
| 220 | - throw new ControllerException(ErrorCode.ERROR100.getCode(), "[发流失败] " + jsonObject.getString("msg")); | 281 | + if (paramForVideo != null) { |
| 282 | + JSONObject jsonObject = zlmServerFactory.startSendRtpStream(mediaServerItem, paramForVideo); | ||
| 283 | + if (jsonObject.getInteger("code") == 0) { | ||
| 284 | + logger.info("[第三方服务对接->发送流] 视频流发流成功,callId->{},param->{}", callId, paramForVideo); | ||
| 285 | + redisTemplate.opsForValue().set(key, sendInfo); | ||
| 286 | + }else { | ||
| 287 | + redisTemplate.delete(key); | ||
| 288 | + logger.info("[第三方服务对接->发送流] 视频流发流失败,callId->{}, {}", callId, jsonObject.getString("msg")); | ||
| 289 | + throw new ControllerException(ErrorCode.ERROR100.getCode(), "[视频流发流失败] " + jsonObject.getString("msg")); | ||
| 290 | + } | ||
| 291 | + } | ||
| 292 | + if(paramForAudio != null) { | ||
| 293 | + JSONObject jsonObject = zlmServerFactory.startSendRtpStream(mediaServerItem, paramForAudio); | ||
| 294 | + if (jsonObject.getInteger("code") == 0) { | ||
| 295 | + logger.info("[第三方服务对接->发送流] 音频流发流成功,callId->{},param->{}", callId, paramForAudio); | ||
| 296 | + redisTemplate.opsForValue().set(key, sendInfo); | ||
| 297 | + }else { | ||
| 298 | + redisTemplate.delete(key); | ||
| 299 | + logger.info("[第三方服务对接->发送流] 音频流发流失败,callId->{}, {}", callId, jsonObject.getString("msg")); | ||
| 300 | + throw new ControllerException(ErrorCode.ERROR100.getCode(), "[音频流发流失败] " + jsonObject.getString("msg")); | ||
| 301 | + } | ||
| 221 | } | 302 | } |
| 222 | }else { | 303 | }else { |
| 223 | logger.info("[第三方服务对接->发送流] 流不存在,等待流上线,callId->{}", callId); | 304 | logger.info("[第三方服务对接->发送流] 流不存在,等待流上线,callId->{}", callId); |
| @@ -231,21 +312,39 @@ public class RtpController { | @@ -231,21 +312,39 @@ public class RtpController { | ||
| 231 | 312 | ||
| 232 | // 订阅 zlm启动事件, 新的zlm也会从这里进入系统 | 313 | // 订阅 zlm启动事件, 新的zlm也会从这里进入系统 |
| 233 | OtherRtpSendInfo finalSendInfo = sendInfo; | 314 | OtherRtpSendInfo finalSendInfo = sendInfo; |
| 315 | + hookSubscribe.removeSubscribe(hookSubscribeForStreamChange); | ||
| 234 | hookSubscribe.addSubscribe(hookSubscribeForStreamChange, | 316 | hookSubscribe.addSubscribe(hookSubscribeForStreamChange, |
| 235 | (mediaServerItemInUse, response)->{ | 317 | (mediaServerItemInUse, response)->{ |
| 236 | dynamicTask.stop(uuid); | 318 | dynamicTask.stop(uuid); |
| 237 | - logger.info("[第三方服务对接->发送流] 流上线,开始发流 callId->{},param->{}", callId, JSONObject.toJSONString(param)); | ||
| 238 | - JSONObject jsonObject = zlmServerFactory.startSendRtpStream(mediaServerItem, param); | ||
| 239 | - System.out.println("========发流结果=========="); | ||
| 240 | - System.out.println(jsonObject); | ||
| 241 | - if (jsonObject.getInteger("code") == 0) { | ||
| 242 | - logger.info("[第三方服务对接->发送流] 发流成功,callId->{}", callId); | ||
| 243 | - redisTemplate.opsForValue().set(key, finalSendInfo); | ||
| 244 | - }else { | ||
| 245 | - redisTemplate.delete(key); | ||
| 246 | - logger.info("[第三方服务对接->发送流] 发流失败,callId->{}, {}", callId, jsonObject.getString("msg")); | ||
| 247 | - throw new ControllerException(ErrorCode.ERROR100.getCode(), "[发流失败] " + jsonObject.getString("msg")); | 319 | + logger.info("[第三方服务对接->发送流] 流上线,开始发流 callId->{}", callId); |
| 320 | + try { | ||
| 321 | + Thread.sleep(400); | ||
| 322 | + } catch (InterruptedException e) { | ||
| 323 | + throw new RuntimeException(e); | ||
| 324 | + } | ||
| 325 | + if (paramForVideo != null) { | ||
| 326 | + JSONObject jsonObject = zlmServerFactory.startSendRtpStream(mediaServerItem, paramForVideo); | ||
| 327 | + if (jsonObject.getInteger("code") == 0) { | ||
| 328 | + logger.info("[第三方服务对接->发送流] 视频流发流成功,callId->{},param->{}", callId, paramForVideo); | ||
| 329 | + redisTemplate.opsForValue().set(key, finalSendInfo); | ||
| 330 | + }else { | ||
| 331 | + redisTemplate.delete(key); | ||
| 332 | + logger.info("[第三方服务对接->发送流] 视频流发流失败,callId->{}, {}", callId, jsonObject.getString("msg")); | ||
| 333 | + throw new ControllerException(ErrorCode.ERROR100.getCode(), "[视频流发流失败] " + jsonObject.getString("msg")); | ||
| 334 | + } | ||
| 335 | + } | ||
| 336 | + if(paramForAudio != null) { | ||
| 337 | + JSONObject jsonObject = zlmServerFactory.startSendRtpStream(mediaServerItem, paramForAudio); | ||
| 338 | + if (jsonObject.getInteger("code") == 0) { | ||
| 339 | + logger.info("[第三方服务对接->发送流] 音频流发流成功,callId->{},param->{}", callId, paramForAudio); | ||
| 340 | + redisTemplate.opsForValue().set(key, finalSendInfo); | ||
| 341 | + }else { | ||
| 342 | + redisTemplate.delete(key); | ||
| 343 | + logger.info("[第三方服务对接->发送流] 音频流发流失败,callId->{}, {}", callId, jsonObject.getString("msg")); | ||
| 344 | + throw new ControllerException(ErrorCode.ERROR100.getCode(), "[音频流发流失败] " + jsonObject.getString("msg")); | ||
| 345 | + } | ||
| 248 | } | 346 | } |
| 347 | + hookSubscribe.removeSubscribe(hookSubscribeForStreamChange); | ||
| 249 | }); | 348 | }); |
| 250 | } | 349 | } |
| 251 | } | 350 | } |
| @@ -274,6 +373,7 @@ public class RtpController { | @@ -274,6 +373,7 @@ public class RtpController { | ||
| 274 | }else { | 373 | }else { |
| 275 | logger.info("[第三方服务对接->关闭发送流] 成功 callId->{}", callId); | 374 | logger.info("[第三方服务对接->关闭发送流] 成功 callId->{}", callId); |
| 276 | } | 375 | } |
| 376 | + redisTemplate.delete(key); | ||
| 277 | } | 377 | } |
| 278 | 378 | ||
| 279 | } | 379 | } |