| | |
| | | import com.alibaba.fastjson.JSON; |
| | | import com.alibaba.fastjson.JSONObject; |
| | | import com.genersoft.iot.vmp.common.StreamInfo; |
| | | import com.genersoft.iot.vmp.conf.DynamicTask; |
| | | import com.genersoft.iot.vmp.gb28181.bean.SendRtpItem; |
| | | import com.genersoft.iot.vmp.gb28181.transmit.SIPProcessorObserver; |
| | | import com.genersoft.iot.vmp.gb28181.transmit.event.request.ISIPRequestProcessor; |
| | |
| | | import javax.sip.DialogState; |
| | | import javax.sip.RequestEvent; |
| | | import javax.sip.address.SipURI; |
| | | import javax.sip.header.CallIdHeader; |
| | | import javax.sip.header.FromHeader; |
| | | import javax.sip.header.HeaderAddress; |
| | | import javax.sip.header.ToHeader; |
| | | import java.util.HashMap; |
| | | import java.util.Map; |
| | | import java.util.Timer; |
| | | import java.util.TimerTask; |
| | | import java.util.*; |
| | | |
| | | /** |
| | | * SIP命令类型: ACK请求 |
| | |
| | | @Autowired |
| | | private ZLMHttpHookSubscribe subscribe; |
| | | |
| | | @Autowired |
| | | private DynamicTask dynamicTask; |
| | | |
| | | |
| | | /** |
| | | * 处理 ACK请求 |
| | |
| | | */ |
| | | @Override |
| | | public void process(RequestEvent evt) { |
| | | logger.debug("ACK请求: {}", ((System.currentTimeMillis()))); |
| | | Dialog dialog = evt.getDialog(); |
| | | if (dialog == null) return; |
| | | CallIdHeader callIdHeader = (CallIdHeader)evt.getRequest().getHeader(CallIdHeader.NAME); |
| | | if (dialog == null) { |
| | | return; |
| | | } |
| | | if (dialog.getState()== DialogState.CONFIRMED) { |
| | | String platformGbId = ((SipURI) ((HeaderAddress) evt.getRequest().getHeader(FromHeader.NAME)).getAddress().getURI()).getUser(); |
| | | logger.info("ACK请求: platformGbId->{}", platformGbId); |
| | | // 取消设置的超时任务 |
| | | dynamicTask.stop(callIdHeader.getCallId()); |
| | | String channelId = ((SipURI) ((HeaderAddress) evt.getRequest().getHeader(ToHeader.NAME)).getAddress().getURI()).getUser(); |
| | | SendRtpItem sendRtpItem = redisCatchStorage.querySendRTPServer(platformGbId, channelId); |
| | | SendRtpItem sendRtpItem = redisCatchStorage.querySendRTPServer(platformGbId, channelId, null, callIdHeader.getCallId()); |
| | | String is_Udp = sendRtpItem.isTcp() ? "0" : "1"; |
| | | String deviceId = sendRtpItem.getDeviceId(); |
| | | StreamInfo streamInfo = null; |
| | | if (sendRtpItem.isPlay()) { |
| | | streamInfo = redisCatchStorage.queryPlayByDevice(deviceId, channelId); |
| | | }else { |
| | | streamInfo = redisCatchStorage.queryPlaybackByDevice(deviceId, channelId); |
| | | } |
| | | System.out.println(JSON.toJSON(streamInfo)); |
| | | if (streamInfo == null) { |
| | | streamInfo = new StreamInfo(); |
| | | streamInfo.setApp(sendRtpItem.getApp()); |
| | | streamInfo.setStreamId(sendRtpItem.getStreamId()); |
| | | } |
| | | redisCatchStorage.updateSendRTPSever(sendRtpItem); |
| | | logger.info(platformGbId); |
| | | logger.info(channelId); |
| | | MediaServerItem mediaInfo = mediaServerService.getOne(sendRtpItem.getMediaServerId()); |
| | | logger.info("收到ACK,开始向上级推流 rtp/{}", sendRtpItem.getStreamId()); |
| | | Map<String, Object> param = new HashMap<>(); |
| | | param.put("vhost","__defaultVhost__"); |
| | | param.put("app",streamInfo.getApp()); |
| | | param.put("stream",streamInfo.getStreamId()); |
| | | param.put("app",sendRtpItem.getApp()); |
| | | param.put("stream",sendRtpItem.getStreamId()); |
| | | param.put("ssrc", sendRtpItem.getSsrc()); |
| | | param.put("dst_url",sendRtpItem.getIp()); |
| | | param.put("dst_port", sendRtpItem.getPort()); |
| | | param.put("is_udp", is_Udp); |
| | | // 设备推流查询,成功后才能转推 |
| | | MediaServerItem mediaInfo = mediaServerService.getOne(sendRtpItem.getMediaServerId()); |
| | | param.put("src_port", sendRtpItem.getLocalPort()); |
| | | zlmrtpServerFactory.startSendRtpStream(mediaInfo, param); |
| | | // if (zlmrtpServerFactory.isStreamReady(mediaInfo, streamInfo.getApp(), streamInfo.getStreamId())) { |
| | | // logger.info("已获取设备推流[{}/{}],开始向上级推流[{}:{}]", |
| | | // streamInfo.getApp() ,streamInfo.getStreamId(), sendRtpItem.getIp(), sendRtpItem.getPort()); |
| | | // zlmrtpServerFactory.startSendRtpStream(mediaInfo, param); |
| | | // } else { |
| | | // // 对hook进行订阅 |
| | | // logger.info("等待设备推流[{}/{}].......", |
| | | // streamInfo.getApp(), streamInfo.getStreamId()); |
| | | // Timer timer = new Timer(); |
| | | // timer.schedule(new TimerTask() { |
| | | // @Override |
| | | // public void run() { |
| | | // logger.info("设备推流[{}/{}]超时,终止向上级推流", |
| | | // finalStreamInfo.getApp() , finalStreamInfo.getStreamId()); |
| | | // |
| | | // } |
| | | // }, 30*1000L); |
| | | |
| | | |
| | | |
| | | // if (streamInfo == null) { // 流还没上来,对方就回复ack |
| | | // logger.info("监听流以等待流上线1 rtp/{}", sendRtpItem.getStreamId()); |
| | | // // 监听流上线 |
| | | // // 添加订阅 |
| | | // JSONObject subscribeKey = new JSONObject(); |
| | | // subscribeKey.put("app", "rtp"); |
| | | // subscribeKey.put("stream", streamInfo.getStreamId()); |
| | | // subscribeKey.put("mediaServerId", streamInfo.getMediaServerId()); |
| | | // subscribe.addSubscribe(ZLMHttpHookSubscribe.HookType.on_publish, subscribeKey, |
| | | // (MediaServerItem mediaServerItemInUse, JSONObject json) -> { |
| | | // logger.info("已获取设备推流[{}/{}],开始向上级推流[{}:{}]", |
| | | // finalStreamInfo.getApp(), finalStreamInfo.getStreamId(), sendRtpItem.getIp(), sendRtpItem.getPort()); |
| | | // timer.cancel(); |
| | | // subscribeKey.put("stream", sendRtpItem.getStreamId()); |
| | | // subscribeKey.put("regist", true); |
| | | // subscribeKey.put("schema", "rtmp"); |
| | | // subscribeKey.put("mediaServerId", sendRtpItem.getMediaServerId()); |
| | | // subscribe.addSubscribe(ZLMHttpHookSubscribe.HookType.on_stream_changed, subscribeKey, |
| | | // (MediaServerItem mediaServerItemInUse, JSONObject json)->{ |
| | | // Map<String, Object> param = new HashMap<>(); |
| | | // param.put("vhost","__defaultVhost__"); |
| | | // param.put("app",json.getString("app")); |
| | | // param.put("stream",json.getString("stream")); |
| | | // param.put("ssrc", sendRtpItem.getSsrc()); |
| | | // param.put("dst_url",sendRtpItem.getIp()); |
| | | // param.put("dst_port", sendRtpItem.getPort()); |
| | | // param.put("is_udp", is_Udp); |
| | | // param.put("src_port", sendRtpItem.getLocalPort()); |
| | | // zlmrtpServerFactory.startSendRtpStream(mediaInfo, param); |
| | | // subscribe.removeSubscribe(ZLMHttpHookSubscribe.HookType.on_stream_changed, subscribeKey); |
| | | // }); |
| | | // }else { |
| | | // Map<String, Object> param = new HashMap<>(); |
| | | // param.put("vhost","__defaultVhost__"); |
| | | // param.put("app",streamInfo.getApp()); |
| | | // param.put("stream",streamInfo.getStream()); |
| | | // param.put("ssrc", sendRtpItem.getSsrc()); |
| | | // param.put("dst_url",sendRtpItem.getIp()); |
| | | // param.put("dst_port", sendRtpItem.getPort()); |
| | | // param.put("is_udp", is_Udp); |
| | | // param.put("src_port", sendRtpItem.getLocalPort()); |
| | | // |
| | | // JSONObject jsonObject = zlmrtpServerFactory.startSendRtpStream(mediaInfo, param); |
| | | // if (jsonObject.getInteger("code") != 0) { |
| | | // logger.info("监听流以等待流上线2 {}/{}", streamInfo.getApp(), streamInfo.getStream()); |
| | | // // 监听流上线 |
| | | // // 添加订阅 |
| | | // JSONObject subscribeKey = new JSONObject(); |
| | | // subscribeKey.put("app", "rtp"); |
| | | // subscribeKey.put("stream", streamInfo.getStream()); |
| | | // subscribeKey.put("regist", true); |
| | | // subscribeKey.put("schema", "rtmp"); |
| | | // subscribeKey.put("mediaServerId", sendRtpItem.getMediaServerId()); |
| | | // subscribe.addSubscribe(ZLMHttpHookSubscribe.HookType.on_stream_changed, subscribeKey, |
| | | // (MediaServerItem mediaServerItemInUse, JSONObject json)->{ |
| | | // zlmrtpServerFactory.startSendRtpStream(mediaInfo, param); |
| | | // }); |
| | | // } |
| | | // } |
| | | |
| | | |
| | | } |
| | | } |
| | | } |