From a42dda2bd3cc1cf8c20cc61e7ad9211eadecbaf3 Mon Sep 17 00:00:00 2001 From: 648540858 <648540858@qq.com> Date: 星期四, 24 二月 2022 16:55:06 +0800 Subject: [PATCH] 规范数据库,添加必要约束,优化通道批量导入功能 --- src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java | 667 +++++++++++++++++++++++++++++++++++++----------------- 1 files changed, 452 insertions(+), 215 deletions(-) diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java index 529feaf..29f8c05 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java @@ -1,47 +1,46 @@ package com.genersoft.iot.vmp.gb28181.transmit.cmd.impl; -import java.text.ParseException; -import java.util.regex.Matcher; -import java.util.regex.Pattern; +import com.alibaba.fastjson.JSONObject; +import com.genersoft.iot.vmp.common.StreamInfo; +import com.genersoft.iot.vmp.conf.SipConfig; +import com.genersoft.iot.vmp.conf.UserSetup; +import com.genersoft.iot.vmp.gb28181.bean.Device; +import com.genersoft.iot.vmp.gb28181.bean.SsrcTransaction; +import com.genersoft.iot.vmp.gb28181.event.SipSubscribe; +import com.genersoft.iot.vmp.gb28181.session.VideoStreamSessionManager; +import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommander; +import com.genersoft.iot.vmp.gb28181.transmit.cmd.SIPRequestHeaderProvider; +import com.genersoft.iot.vmp.gb28181.utils.DateUtil; +import com.genersoft.iot.vmp.gb28181.utils.NumericUtil; +import com.genersoft.iot.vmp.media.zlm.ZLMHttpHookSubscribe; +import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; +import com.genersoft.iot.vmp.service.IMediaServerService; +import com.genersoft.iot.vmp.service.bean.SSRCInfo; +import com.genersoft.iot.vmp.storager.IRedisCatchStorage; +import com.genersoft.iot.vmp.storager.IVideoManagerStorager; +import gov.nist.javax.sip.SipProviderImpl; +import gov.nist.javax.sip.SipStackImpl; +import gov.nist.javax.sip.message.SIPRequest; +import gov.nist.javax.sip.stack.SIPDialog; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.context.annotation.DependsOn; +import org.springframework.stereotype.Component; +import org.springframework.util.StringUtils; import javax.sip.*; import javax.sip.address.SipURI; import javax.sip.header.CallIdHeader; import javax.sip.header.ViaHeader; import javax.sip.message.Request; - -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import com.genersoft.iot.vmp.common.StreamInfo; -import com.genersoft.iot.vmp.conf.MediaServerConfig; -import com.genersoft.iot.vmp.gb28181.event.SipSubscribe; -import com.genersoft.iot.vmp.media.zlm.ZLMHttpHookSubscribe; -import com.genersoft.iot.vmp.media.zlm.ZLMRESTfulUtils; -import com.genersoft.iot.vmp.media.zlm.ZLMRTPServerFactory; -import com.genersoft.iot.vmp.storager.IRedisCatchStorage; -import com.genersoft.iot.vmp.storager.IVideoManagerStorager; -import gov.nist.javax.sip.message.SIPRequest; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.context.annotation.DependsOn; -import org.springframework.context.annotation.Lazy; -import org.springframework.stereotype.Component; - -import com.genersoft.iot.vmp.conf.SipConfig; -import com.genersoft.iot.vmp.gb28181.bean.Device; -import com.genersoft.iot.vmp.gb28181.session.VideoStreamSessionManager; -import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommander; -import com.genersoft.iot.vmp.gb28181.transmit.cmd.SIPRequestHeaderProvider; -import com.genersoft.iot.vmp.gb28181.utils.DateUtil; -import com.genersoft.iot.vmp.gb28181.utils.NumericUtil; -import com.genersoft.iot.vmp.gb28181.utils.XmlUtil; +import java.lang.reflect.Field; +import java.text.ParseException; +import java.util.HashSet; /** - * @Description:璁惧鑳藉姏鎺ュ彛锛岀敤浜庡畾涔夎澶囩殑鎺у埗銆佹煡璇㈣兘鍔� + * @description:璁惧鑳藉姏鎺ュ彛锛岀敤浜庡畾涔夎澶囩殑鎺у埗銆佹煡璇㈣兘鍔� * @author: swwheihei * @date: 2020骞�5鏈�3鏃� 涓嬪崍9:22:48 */ @@ -54,15 +53,13 @@ @Autowired private SipConfig sipConfig; - @Lazy @Autowired @Qualifier(value="tcpSipProvider") - private SipProvider tcpSipProvider; + private SipProviderImpl tcpSipProvider; - @Lazy @Autowired @Qualifier(value="udpSipProvider") - private SipProvider udpSipProvider; + private SipProviderImpl udpSipProvider; @Autowired private SIPRequestHeaderProvider headerProvider; @@ -77,19 +74,7 @@ private IRedisCatchStorage redisCatchStorage; @Autowired - private ZLMRTPServerFactory zlmrtpServerFactory; - - @Autowired - private ZLMRESTfulUtils zlmresTfulUtils; - - @Value("${media.rtp.enable}") - private boolean rtpEnable; - - @Value("${media.seniorSdp}") - private boolean seniorSdp; - - @Value("${media.autoApplyPlay}") - private boolean autoApplyPlay; + private UserSetup userSetup; @Autowired private ZLMHttpHookSubscribe subscribe; @@ -97,9 +82,9 @@ @Autowired private SipSubscribe sipSubscribe; - public SipConfig getSipConfig() { - return sipConfig; - } + @Autowired + private IMediaServerService mediaServerService; + /** * 浜戝彴鏂瑰悜鏀炬帶鍒讹紝浣跨敤閰嶇疆鏂囦欢涓殑榛樿闀滃ご绉诲姩閫熷害 @@ -111,7 +96,7 @@ */ @Override public boolean ptzdirectCmd(Device device, String channelId, int leftRight, int upDown) { - return ptzCmd(device, channelId, leftRight, upDown, 0, sipConfig.getSpeed(), 0); + return ptzCmd(device, channelId, leftRight, upDown, 0, sipConfig.getPtzSpeed(), 0); } /** @@ -137,7 +122,7 @@ */ @Override public boolean ptzZoomCmd(Device device, String channelId, int inOut) { - return ptzCmd(device, channelId, 0, 0, inOut, 0, sipConfig.getSpeed()); + return ptzCmd(device, channelId, 0, 0, inOut, 0, sipConfig.getPtzSpeed()); } /** @@ -277,7 +262,7 @@ public boolean frontEndCmd(Device device, String channelId, int cmdCode, int parameter1, int parameter2, int combineCode2) { try { String cmdStr= frontEndCmdString(cmdCode, parameter1, parameter2, combineCode2); - System.out.println("鎺у埗瀛楃涓诧細" + cmdStr); + logger.debug("鎺у埗瀛楃涓诧細" + cmdStr); StringBuffer ptzXml = new StringBuffer(200); ptzXml.append("<?xml version=\"1.0\" ?>\r\n"); ptzXml.append("<Control>\r\n"); @@ -345,57 +330,40 @@ * @param errorEvent sip閿欒璁㈤槄 */ @Override - public void playStreamCmd(Device device, String channelId, ZLMHttpHookSubscribe.Event event, SipSubscribe.Event errorEvent) { - String streamId = null; + public void playStreamCmd(MediaServerItem mediaServerItem, SSRCInfo ssrcInfo, Device device, String channelId, ZLMHttpHookSubscribe.Event event, SipSubscribe.Event errorEvent) { + String streamId = ssrcInfo.getStreamId(); try { if (device == null) return; - String ssrc = streamSession.createPlaySsrc(); - if (rtpEnable) { - streamId = String.format("gb_play_%s_%s", device.getDeviceId(), channelId); - }else { - streamId = String.format("%08x", Integer.parseInt(ssrc)).toUpperCase(); - } String streamMode = device.getStreamMode().toUpperCase(); - MediaServerConfig mediaInfo = redisCatchStorage.getMediaInfo(); - if (mediaInfo == null) { - logger.warn("鐐规挱鏃跺彂鐜癦LM灏氭湭杩炴帴..."); - return; - } - String mediaPort = null; - // 浣跨敤鍔ㄦ�乽dp绔彛 - if (rtpEnable) { - mediaPort = zlmrtpServerFactory.createRTPServer(streamId) + ""; - }else { - mediaPort = mediaInfo.getRtpProxyPort(); - } + logger.info("{} 鍒嗛厤鐨刏LM涓�: {} [{}:{}]", streamId, mediaServerItem.getId(), mediaServerItem.getIp(), ssrcInfo.getPort()); // 娣诲姞璁㈤槄 JSONObject subscribeKey = new JSONObject(); subscribeKey.put("app", "rtp"); subscribeKey.put("stream", streamId); subscribeKey.put("regist", true); - - subscribe.addSubscribe(ZLMHttpHookSubscribe.HookType.on_stream_changed, subscribeKey, json->{ - if (json.getJSONArray("tracks") == null) return; - event.response(json); + subscribeKey.put("mediaServerId", mediaServerItem.getId()); + subscribe.addSubscribe(ZLMHttpHookSubscribe.HookType.on_stream_changed, subscribeKey, + (MediaServerItem mediaServerItemInUse, JSONObject json)->{ + if (userSetup.isWaitTrack() && json.getJSONArray("tracks") == null) return; + event.response(mediaServerItemInUse, json); subscribe.removeSubscribe(ZLMHttpHookSubscribe.HookType.on_stream_changed, subscribeKey); }); // StringBuffer content = new StringBuffer(200); content.append("v=0\r\n"); -// content.append("o=" + sipConfig.getSipId() + " 0 0 IN IP4 "+mediaInfo.getWanIp()+"\r\n"); - content.append("o="+"00000"+" 0 0 IN IP4 "+mediaInfo.getWanIp()+"\r\n"); + content.append("o="+ sipConfig.getId()+" 0 0 IN IP4 "+ mediaServerItem.getSdpIp() +"\r\n"); content.append("s=Play\r\n"); - content.append("c=IN IP4 "+mediaInfo.getWanIp()+"\r\n"); + content.append("c=IN IP4 "+ mediaServerItem.getSdpIp() +"\r\n"); content.append("t=0 0\r\n"); - if (seniorSdp) { + if (userSetup.isSeniorSdp()) { if("TCP-PASSIVE".equals(streamMode)) { - content.append("m=video "+ mediaPort +" TCP/RTP/AVP 96 126 125 99 34 98 97\r\n"); + content.append("m=video "+ ssrcInfo.getPort() +" TCP/RTP/AVP 96 126 125 99 34 98 97\r\n"); }else if ("TCP-ACTIVE".equals(streamMode)) { - content.append("m=video "+ mediaPort +" TCP/RTP/AVP 96 126 125 99 34 98 97\r\n"); + content.append("m=video "+ ssrcInfo.getPort() +" TCP/RTP/AVP 96 126 125 99 34 98 97\r\n"); }else if("UDP".equals(streamMode)) { - content.append("m=video "+ mediaPort +" RTP/AVP 96 126 125 99 34 98 97\r\n"); + content.append("m=video "+ ssrcInfo.getPort() +" RTP/AVP 96 126 125 99 34 98 97\r\n"); } content.append("a=recvonly\r\n"); content.append("a=rtpmap:96 PS/90000\r\n"); @@ -416,46 +384,44 @@ } }else { if("TCP-PASSIVE".equals(streamMode)) { - content.append("m=video "+ mediaPort +" TCP/RTP/AVP 96 98 97\r\n"); + content.append("m=video "+ ssrcInfo.getPort() +" TCP/RTP/AVP 96 98 97\r\n"); }else if ("TCP-ACTIVE".equals(streamMode)) { - content.append("m=video "+ mediaPort +" TCP/RTP/AVP 96 98 97\r\n"); + content.append("m=video "+ ssrcInfo.getPort() +" TCP/RTP/AVP 96 98 97\r\n"); }else if("UDP".equals(streamMode)) { - content.append("m=video "+ mediaPort +" RTP/AVP 96 98 97\r\n"); + content.append("m=video "+ ssrcInfo.getPort() +" RTP/AVP 96 98 97\r\n"); } content.append("a=recvonly\r\n"); content.append("a=rtpmap:96 PS/90000\r\n"); content.append("a=rtpmap:98 H264/90000\r\n"); content.append("a=rtpmap:97 MPEG4/90000\r\n"); - if("TCP-PASSIVE".equals(streamMode)) { // tcp琚姩妯″紡 + if ("TCP-PASSIVE".equals(streamMode)) { // tcp琚姩妯″紡 content.append("a=setup:passive\r\n"); - content.append("a=recvonly\r\n"); - content.append("a=rtpmap:96 PS/90000\r\n"); - content.append("a=rtpmap:98 H264/90000\r\n"); - content.append("a=rtpmap:97 MPEG4/90000\r\n"); - if ("TCP-PASSIVE".equals(streamMode)) { // tcp琚姩妯″紡 - content.append("a=setup:passive\r\n"); - content.append("a=connection:new\r\n"); - } else if ("TCP-ACTIVE".equals(streamMode)) { // tcp涓诲姩妯″紡 - content.append("a=setup:active\r\n"); - content.append("a=connection:new\r\n"); - } + content.append("a=connection:new\r\n"); + } else if ("TCP-ACTIVE".equals(streamMode)) { // tcp涓诲姩妯″紡 + content.append("a=setup:active\r\n"); + content.append("a=connection:new\r\n"); } } - content.append("y="+ssrc+"\r\n");//ssrc + content.append("y="+ssrcInfo.getSsrc()+"\r\n");//ssrc String tm = Long.toString(System.currentTimeMillis()); CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId() : udpSipProvider.getNewCallId(); - Request request = headerProvider.createInviteRequest(device, channelId, content.toString(), null, "FromInvt" + tm, null, ssrc, callIdHeader); + Request request = headerProvider.createInviteRequest(device, channelId, content.toString(), null, "FromInvt" + tm, null, ssrcInfo.getSsrc(), callIdHeader); - ClientTransaction transaction = transmitRequest(device, request, (e -> { + String finalStreamId = streamId; + transmitRequest(device, request, (e -> { streamSession.remove(device.getDeviceId(), channelId); + mediaServerService.releaseSsrc(mediaServerItem, ssrcInfo.getSsrc()); errorEvent.response(e); - })); - streamSession.put(device.getDeviceId(), channelId ,ssrc,streamId, transaction); + }), e ->{ + streamSession.put(device.getDeviceId(), channelId ,ssrcInfo.getSsrc(), finalStreamId, mediaServerItem.getId(), ((ResponseEvent)e.event).getClientTransaction()); + streamSession.put(device.getDeviceId(), channelId , e.dialog); + }); + } catch ( SipException | ParseException | InvalidArgumentException e) { e.printStackTrace(); @@ -471,48 +437,46 @@ * @param endTime 缁撴潫鏃堕棿,鏍煎紡瑕佹眰锛歽yyy-MM-dd HH:mm:ss */ @Override - public void playbackStreamCmd(Device device, String channelId, String startTime, String endTime, ZLMHttpHookSubscribe.Event event + public void playbackStreamCmd(MediaServerItem mediaServerItem, SSRCInfo ssrcInfo, Device device, String channelId, String startTime, String endTime, ZLMHttpHookSubscribe.Event event , SipSubscribe.Event errorEvent) { try { - MediaServerConfig mediaInfo = redisCatchStorage.getMediaInfo(); - String ssrc = streamSession.createPlayBackSsrc(); - String streamId = String.format("%08x", Integer.parseInt(ssrc)).toUpperCase(); + + logger.info("{} 鍒嗛厤鐨刏LM涓�: {} [{}:{}]", ssrcInfo.getStreamId(), mediaServerItem.getId(), mediaServerItem.getIp(), ssrcInfo.getPort()); + // 娣诲姞璁㈤槄 JSONObject subscribeKey = new JSONObject(); subscribeKey.put("app", "rtp"); - subscribeKey.put("stream", streamId); + subscribeKey.put("stream", ssrcInfo.getStreamId()); subscribeKey.put("regist", true); - - subscribe.addSubscribe(ZLMHttpHookSubscribe.HookType.on_stream_changed, subscribeKey, json->{ - if (json.getJSONArray("tracks") == null) return; - event.response(json); + subscribeKey.put("mediaServerId", mediaServerItem.getId()); + logger.debug("褰曞儚鍥炴斁娣诲姞璁㈤槄锛岃闃呭唴瀹癸細" + subscribeKey.toString()); + subscribe.addSubscribe(ZLMHttpHookSubscribe.HookType.on_stream_changed, subscribeKey, + (MediaServerItem mediaServerItemInUse, JSONObject json)->{ + if (userSetup.isWaitTrack() && json.getJSONArray("tracks") == null) return; + event.response(mediaServerItemInUse, json); subscribe.removeSubscribe(ZLMHttpHookSubscribe.HookType.on_stream_changed, subscribeKey); }); StringBuffer content = new StringBuffer(200); content.append("v=0\r\n"); - content.append("o="+sipConfig.getSipId()+" 0 0 IN IP4 "+sipConfig.getSipIp()+"\r\n"); + content.append("o="+sipConfig.getId()+" 0 0 IN IP4 " + mediaServerItem.getSdpIp() + "\r\n"); content.append("s=Playback\r\n"); content.append("u="+channelId+":0\r\n"); - content.append("c=IN IP4 "+mediaInfo.getWanIp()+"\r\n"); + content.append("c=IN IP4 "+mediaServerItem.getSdpIp()+"\r\n"); content.append("t="+DateUtil.yyyy_MM_dd_HH_mm_ssToTimestamp(startTime)+" " +DateUtil.yyyy_MM_dd_HH_mm_ssToTimestamp(endTime) +"\r\n"); - String mediaPort = null; - // 浣跨敤鍔ㄦ�乽dp绔彛 - if (rtpEnable) { - mediaPort = zlmrtpServerFactory.createRTPServer(streamId) + ""; - }else { - mediaPort = mediaInfo.getRtpProxyPort(); - } + + + String streamMode = device.getStreamMode().toUpperCase(); - if (seniorSdp) { + if (userSetup.isSeniorSdp()) { if("TCP-PASSIVE".equals(streamMode)) { - content.append("m=video "+ mediaPort +" TCP/RTP/AVP 96 126 125 99 34 98 97\r\n"); + content.append("m=video "+ ssrcInfo.getPort() +" TCP/RTP/AVP 96 126 125 99 34 98 97\r\n"); }else if ("TCP-ACTIVE".equals(streamMode)) { - content.append("m=video "+ mediaPort +" TCP/RTP/AVP 96 126 125 99 34 98 97\r\n"); + content.append("m=video "+ ssrcInfo.getPort() +" TCP/RTP/AVP 96 126 125 99 34 98 97\r\n"); }else if("UDP".equals(streamMode)) { - content.append("m=video "+ mediaPort +" RTP/AVP 96 126 125 99 34 98 97\r\n"); + content.append("m=video "+ ssrcInfo.getPort() +" RTP/AVP 96 126 125 99 34 98 97\r\n"); } content.append("a=recvonly\r\n"); content.append("a=rtpmap:96 PS/90000\r\n"); @@ -533,11 +497,11 @@ } }else { if("TCP-PASSIVE".equals(streamMode)) { - content.append("m=video "+ mediaPort +" TCP/RTP/AVP 96 98 97\r\n"); + content.append("m=video "+ ssrcInfo.getPort() +" TCP/RTP/AVP 96 98 97\r\n"); }else if ("TCP-ACTIVE".equals(streamMode)) { - content.append("m=video "+ mediaPort +" TCP/RTP/AVP 96 98 97\r\n"); + content.append("m=video "+ ssrcInfo.getPort() +" TCP/RTP/AVP 96 98 97\r\n"); }else if("UDP".equals(streamMode)) { - content.append("m=video "+ mediaPort +" RTP/AVP 96 98 97\r\n"); + content.append("m=video "+ ssrcInfo.getPort() +" RTP/AVP 96 98 97\r\n"); } content.append("a=recvonly\r\n"); content.append("a=rtpmap:96 PS/90000\r\n"); @@ -552,78 +516,177 @@ } } - content.append("y="+ssrc+"\r\n");//ssrc + content.append("y=" + ssrcInfo.getSsrc() + "\r\n");//ssrc String tm = Long.toString(System.currentTimeMillis()); CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId() : udpSipProvider.getNewCallId(); - Request request = headerProvider.createPlaybackInviteRequest(device, channelId, content.toString(), null, "fromplybck" + tm, null, callIdHeader); + Request request = headerProvider.createPlaybackInviteRequest(device, channelId, content.toString(), null, "fromplybck" + tm, null, callIdHeader, ssrcInfo.getSsrc()); + + transmitRequest(device, request, errorEvent, okEvent -> { + ResponseEvent responseEvent = (ResponseEvent) okEvent.event; + streamSession.put(device.getDeviceId(), channelId, ssrcInfo.getSsrc(), ssrcInfo.getStreamId(), mediaServerItem.getId(), responseEvent.getClientTransaction()); + streamSession.put(device.getDeviceId(), channelId, okEvent.dialog); + }); + } catch ( SipException | ParseException | InvalidArgumentException e) { + e.printStackTrace(); + } + } + + /** + * 璇锋眰鍘嗗彶濯掍綋涓嬭浇 + * + * @param device 瑙嗛璁惧 + * @param channelId 棰勮閫氶亾 + * @param startTime 寮�濮嬫椂闂�,鏍煎紡瑕佹眰锛歽yyy-MM-dd HH:mm:ss + * @param endTime 缁撴潫鏃堕棿,鏍煎紡瑕佹眰锛歽yyy-MM-dd HH:mm:ss + * @param downloadSpeed 涓嬭浇鍊嶉�熷弬鏁� + */ + @Override + public void downloadStreamCmd(MediaServerItem mediaServerItem, SSRCInfo ssrcInfo, Device device, String channelId, String startTime, String endTime, String downloadSpeed, ZLMHttpHookSubscribe.Event event + , SipSubscribe.Event errorEvent) { + try { + logger.info("{} 鍒嗛厤鐨刏LM涓�: {} [{}:{}]", ssrcInfo.getStreamId(), mediaServerItem.getId(), mediaServerItem.getIp(), ssrcInfo.getPort()); + + // 娣诲姞璁㈤槄 + JSONObject subscribeKey = new JSONObject(); + subscribeKey.put("app", "rtp"); + subscribeKey.put("stream", ssrcInfo.getStreamId()); + subscribeKey.put("regist", true); + subscribeKey.put("mediaServerId", mediaServerItem.getId()); + logger.debug("褰曞儚鍥炴斁娣诲姞璁㈤槄锛岃闃呭唴瀹癸細" + subscribeKey.toString()); + subscribe.addSubscribe(ZLMHttpHookSubscribe.HookType.on_stream_changed, subscribeKey, + (MediaServerItem mediaServerItemInUse, JSONObject json)->{ + if (userSetup.isWaitTrack() && json.getJSONArray("tracks") == null) return; + event.response(mediaServerItemInUse, json); + subscribe.removeSubscribe(ZLMHttpHookSubscribe.HookType.on_stream_changed, subscribeKey); + }); + + StringBuffer content = new StringBuffer(200); + content.append("v=0\r\n"); + content.append("o="+sipConfig.getId()+" 0 0 IN IP4 " + mediaServerItem.getSdpIp() + "\r\n"); + content.append("s=Download\r\n"); + content.append("u="+channelId+":0\r\n"); + content.append("c=IN IP4 "+mediaServerItem.getSdpIp()+"\r\n"); + content.append("t="+DateUtil.yyyy_MM_dd_HH_mm_ssToTimestamp(startTime)+" " + +DateUtil.yyyy_MM_dd_HH_mm_ssToTimestamp(endTime) +"\r\n"); + + + + String streamMode = device.getStreamMode().toUpperCase(); + + if (userSetup.isSeniorSdp()) { + if("TCP-PASSIVE".equals(streamMode)) { + content.append("m=video "+ ssrcInfo.getPort() +" TCP/RTP/AVP 96 126 125 99 34 98 97\r\n"); + }else if ("TCP-ACTIVE".equals(streamMode)) { + content.append("m=video "+ ssrcInfo.getPort() +" TCP/RTP/AVP 96 126 125 99 34 98 97\r\n"); + }else if("UDP".equals(streamMode)) { + content.append("m=video "+ ssrcInfo.getPort() +" RTP/AVP 96 126 125 99 34 98 97\r\n"); + } + content.append("a=recvonly\r\n"); + content.append("a=rtpmap:96 PS/90000\r\n"); + content.append("a=fmtp:126 profile-level-id=42e01e\r\n"); + content.append("a=rtpmap:126 H264/90000\r\n"); + content.append("a=rtpmap:125 H264S/90000\r\n"); + content.append("a=fmtp:125 profile-level-id=42e01e\r\n"); + content.append("a=rtpmap:99 MP4V-ES/90000\r\n"); + content.append("a=fmtp:99 profile-level-id=3\r\n"); + content.append("a=rtpmap:98 H264/90000\r\n"); + content.append("a=rtpmap:97 MPEG4/90000\r\n"); + if("TCP-PASSIVE".equals(streamMode)){ // tcp琚姩妯″紡 + content.append("a=setup:passive\r\n"); + content.append("a=connection:new\r\n"); + }else if ("TCP-ACTIVE".equals(streamMode)) { // tcp涓诲姩妯″紡 + content.append("a=setup:active\r\n"); + content.append("a=connection:new\r\n"); + } + }else { + if("TCP-PASSIVE".equals(streamMode)) { + content.append("m=video "+ ssrcInfo.getPort() +" TCP/RTP/AVP 96 98 97\r\n"); + }else if ("TCP-ACTIVE".equals(streamMode)) { + content.append("m=video "+ ssrcInfo.getPort() +" TCP/RTP/AVP 96 98 97\r\n"); + }else if("UDP".equals(streamMode)) { + content.append("m=video "+ ssrcInfo.getPort() +" RTP/AVP 96 98 97\r\n"); + } + content.append("a=recvonly\r\n"); + content.append("a=rtpmap:96 PS/90000\r\n"); + content.append("a=rtpmap:98 H264/90000\r\n"); + content.append("a=rtpmap:97 MPEG4/90000\r\n"); + if("TCP-PASSIVE".equals(streamMode)){ // tcp琚姩妯″紡 + content.append("a=setup:passive\r\n"); + content.append("a=connection:new\r\n"); + }else if ("TCP-ACTIVE".equals(streamMode)) { // tcp涓诲姩妯″紡 + content.append("a=setup:active\r\n"); + content.append("a=connection:new\r\n"); + } + } + content.append("a=downloadspeed:" + downloadSpeed + "\r\n"); + + content.append("y=" + ssrcInfo.getSsrc() + "\r\n");//ssrc + + String tm = Long.toString(System.currentTimeMillis()); + + CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId() + : udpSipProvider.getNewCallId(); + + Request request = headerProvider.createPlaybackInviteRequest(device, channelId, content.toString(), null, "fromplybck" + tm, null, callIdHeader, ssrcInfo.getSsrc()); ClientTransaction transaction = transmitRequest(device, request, errorEvent); - streamSession.put(device.getDeviceId(), channelId, ssrc, streamId, transaction); + streamSession.put(device.getDeviceId(), channelId, ssrcInfo.getSsrc(), ssrcInfo.getStreamId(), mediaServerItem.getId(), transaction); } catch ( SipException | ParseException | InvalidArgumentException e) { e.printStackTrace(); } } - - /** - * 瑙嗛娴佸仠姝� - * + * 瑙嗛娴佸仠姝�, 涓嶄娇鐢ㄥ洖璋� */ @Override public void streamByeCmd(String deviceId, String channelId) { streamByeCmd(deviceId, channelId, null); } + + /** + * 瑙嗛娴佸仠姝� + */ @Override public void streamByeCmd(String deviceId, String channelId, SipSubscribe.Event okEvent) { - try { ClientTransaction transaction = streamSession.getTransaction(deviceId, channelId); - // 鏈嶅姟閲嶅惎鍚�, 鏃犳硶鐩存帴鍙戦�乥ye锛� 閫氳繃鎵嬪姩鏋勫缓鍙戦�� if (transaction == null) { - - StreamInfo streamInfo = redisCatchStorage.queryPlayByDevice(deviceId, channelId); - if (streamInfo != null) { - JSONObject mediaList = zlmresTfulUtils.getMediaList(streamInfo.getApp(), streamInfo.getStreamId()); - if (mediaList != null) { // 浠嶅湪鎺ㄦ祦鎵嶅彂閫� - if (mediaList.getInteger("code") == 0) { - JSONArray data = mediaList.getJSONArray("data"); - if (data != null && data.size() > 0) { - Device device = storager.queryVideoDevice(deviceId); - if (device != null) { - StreamInfo.TransactionInfo transactionInfo = streamInfo.getTransactionInfo(); - try { - Request byteRequest = headerProvider.createByteRequest(device, channelId, - transactionInfo.branch, - transactionInfo.localTag, - transactionInfo.remoteTag, - transactionInfo.callId); - transmitRequest(device, byteRequest); - } catch (InvalidArgumentException e) { - e.printStackTrace(); - } - } - } - } - } - redisCatchStorage.stopPlay(streamInfo); - } - + logger.warn("[ {} -> {}]鍋滄瑙嗛娴佺殑鏃跺�欏彂鐜颁簨鍔″凡涓㈠け", deviceId, channelId); + SipSubscribe.EventResult<Object> eventResult = new SipSubscribe.EventResult<>(); if (okEvent != null) { - okEvent.response(null); + okEvent.response(eventResult); } return; } - - Dialog dialog = transaction.getDialog(); + SIPDialog dialog = streamSession.getDialog(deviceId, channelId); if (dialog == null) { + logger.warn("[ {} -> {}]鍋滄瑙嗛娴佺殑鏃跺�欏彂鐜板璇濆凡涓㈠け", deviceId, channelId); return; } + SipStack sipStack = udpSipProvider.getSipStack(); + SIPDialog sipDialog = ((SipStackImpl) sipStack).putDialog(dialog); + if (dialog != sipDialog) { + dialog = sipDialog; + }else { + dialog.setSipProvider(udpSipProvider); + try { + Field sipStackField = SIPDialog.class.getDeclaredField("sipStack"); + sipStackField.setAccessible(true); + sipStackField.set(dialog, sipStack); + Field eventListenersField = SIPDialog.class.getDeclaredField("eventListeners"); + eventListenersField.setAccessible(true); + eventListenersField.set(dialog, new HashSet<>()); + } catch (NoSuchFieldException | IllegalAccessException e) { + e.printStackTrace(); + } + } + Request byeRequest = dialog.createRequest(Request.BYE); SipURI byeURI = (SipURI) byeRequest.getRequestURI(); SIPRequest request = (SIPRequest)transaction.getRequest(); @@ -644,8 +707,13 @@ } dialog.sendRequest(clientTransaction); - zlmrtpServerFactory.closeRTPServer(streamSession.getStreamId(deviceId, channelId)); - streamSession.remove(deviceId, channelId); + + SsrcTransaction ssrcTransaction = streamSession.getSsrcTransaction(deviceId, channelId); + if (ssrcTransaction != null) { + MediaServerItem mediaServerItem = mediaServerService.getOne(ssrcTransaction.getMediaServerId()); + mediaServerService.releaseSsrc(mediaServerItem, ssrcTransaction.getSsrc()); + streamSession.remove(deviceId, channelId); + } } catch (SipException | ParseException e) { e.printStackTrace(); } @@ -676,7 +744,7 @@ broadcastXml.append("<Notify>\r\n"); broadcastXml.append("<CmdType>Broadcast</CmdType>\r\n"); broadcastXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n"); - broadcastXml.append("<SourceID>" + sipConfig.getSipId() + "</SourceID>\r\n"); + broadcastXml.append("<SourceID>" + sipConfig.getId() + "</SourceID>\r\n"); broadcastXml.append("<TargetID>" + device.getDeviceId() + "</TargetID>\r\n"); broadcastXml.append("</Notify>\r\n"); @@ -701,7 +769,7 @@ broadcastXml.append("<Notify>\r\n"); broadcastXml.append("<CmdType>Broadcast</CmdType>\r\n"); broadcastXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n"); - broadcastXml.append("<SourceID>" + sipConfig.getSipId() + "</SourceID>\r\n"); + broadcastXml.append("<SourceID>" + sipConfig.getId() + "</SourceID>\r\n"); broadcastXml.append("<TargetID>" + device.getDeviceId() + "</TargetID>\r\n"); broadcastXml.append("</Notify>\r\n"); @@ -733,7 +801,7 @@ cmdXml.append("<Control>\r\n"); cmdXml.append("<CmdType>DeviceControl</CmdType>\r\n"); cmdXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n"); - if (XmlUtil.isEmpty(channelId)) { + if (StringUtils.isEmpty(channelId)) { cmdXml.append("<DeviceID>" + device.getDeviceId() + "</DeviceID>\r\n"); } else { cmdXml.append("<DeviceID>" + channelId + "</DeviceID>\r\n"); @@ -833,16 +901,16 @@ cmdXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n"); cmdXml.append("<DeviceID>" + device.getDeviceId() + "</DeviceID>\r\n"); cmdXml.append("<AlarmCmd>ResetAlarm</AlarmCmd>\r\n"); - if (!XmlUtil.isEmpty(alarmMethod) || !XmlUtil.isEmpty(alarmType)) { + if (!StringUtils.isEmpty(alarmMethod) || !StringUtils.isEmpty(alarmType)) { cmdXml.append("<Info>\r\n"); } - if (!XmlUtil.isEmpty(alarmMethod)) { + if (!StringUtils.isEmpty(alarmMethod)) { cmdXml.append("<AlarmMethod>" + alarmMethod + "</AlarmMethod>\r\n"); } - if (!XmlUtil.isEmpty(alarmType)) { + if (!StringUtils.isEmpty(alarmType)) { cmdXml.append("<AlarmType>" + alarmType + "</AlarmType>\r\n"); } - if (!XmlUtil.isEmpty(alarmMethod) || !XmlUtil.isEmpty(alarmType)) { + if (!StringUtils.isEmpty(alarmMethod) || !StringUtils.isEmpty(alarmType)) { cmdXml.append("</Info>\r\n"); } cmdXml.append("</Control>\r\n"); @@ -875,7 +943,7 @@ cmdXml.append("<Control>\r\n"); cmdXml.append("<CmdType>DeviceControl</CmdType>\r\n"); cmdXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n"); - if (XmlUtil.isEmpty(channelId)) { + if (StringUtils.isEmpty(channelId)) { cmdXml.append("<DeviceID>" + device.getDeviceId() + "</DeviceID>\r\n"); } else { cmdXml.append("<DeviceID>" + channelId + "</DeviceID>\r\n"); @@ -913,7 +981,7 @@ cmdXml.append("<Control>\r\n"); cmdXml.append("<CmdType>DeviceControl</CmdType>\r\n"); cmdXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n"); - if (XmlUtil.isEmpty(channelId)) { + if (StringUtils.isEmpty(channelId)) { cmdXml.append("<DeviceID>" + device.getDeviceId() + "</DeviceID>\r\n"); } else { cmdXml.append("<DeviceID>" + channelId + "</DeviceID>\r\n"); @@ -981,13 +1049,13 @@ cmdXml.append("<Control>\r\n"); cmdXml.append("<CmdType>DeviceConfig</CmdType>\r\n"); cmdXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n"); - if (XmlUtil.isEmpty(channelId)) { + if (StringUtils.isEmpty(channelId)) { cmdXml.append("<DeviceID>" + device.getDeviceId() + "</DeviceID>\r\n"); } else { cmdXml.append("<DeviceID>" + channelId + "</DeviceID>\r\n"); } cmdXml.append("<BasicParam>\r\n"); - if (!XmlUtil.isEmpty(name)) { + if (!StringUtils.isEmpty(name)) { cmdXml.append("<Name>" + name + "</Name>\r\n"); } if (NumericUtil.isInteger(expiration)) { @@ -1094,7 +1162,7 @@ @Override public boolean catalogQuery(Device device, SipSubscribe.Event errorEvent) { // 娓呯┖閫氶亾 - storager.cleanChannelsForDevice(device.getDeviceId()); +// storager.cleanChannelsForDevice(device.getDeviceId()); try { StringBuffer catalogXml = new StringBuffer(200); catalogXml.append("<?xml version=\"1.0\" encoding=\"GB2312\"?>\r\n"); @@ -1127,14 +1195,15 @@ * @param endTime 缁撴潫鏃堕棿,鏍煎紡瑕佹眰锛歽yyy-MM-dd HH:mm:ss */ @Override - public boolean recordInfoQuery(Device device, String channelId, String startTime, String endTime) { - + public boolean recordInfoQuery(Device device, String channelId, String startTime, String endTime, int sn, SipSubscribe.Event errorEvent) { + + try { StringBuffer recordInfoXml = new StringBuffer(200); recordInfoXml.append("<?xml version=\"1.0\" encoding=\"GB2312\"?>\r\n"); recordInfoXml.append("<Query>\r\n"); recordInfoXml.append("<CmdType>RecordInfo</CmdType>\r\n"); - recordInfoXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n"); + recordInfoXml.append("<SN>" + sn + "</SN>\r\n"); recordInfoXml.append("<DeviceID>" + channelId + "</DeviceID>\r\n"); recordInfoXml.append("<StartTime>" + DateUtil.yyyy_MM_dd_HH_mm_ssToISO8601(startTime) + "</StartTime>\r\n"); recordInfoXml.append("<EndTime>" + DateUtil.yyyy_MM_dd_HH_mm_ssToISO8601(endTime) + "</EndTime>\r\n"); @@ -1151,7 +1220,7 @@ Request request = headerProvider.createMessageRequest(device, recordInfoXml.toString(), "z9hG4bK-ViaRecordInfo-" + tm, "fromRec" + tm, null, callIdHeader); - transmitRequest(device, request); + transmitRequest(device, request, errorEvent); } catch (SipException | ParseException | InvalidArgumentException e) { e.printStackTrace(); return false; @@ -1181,22 +1250,22 @@ cmdXml.append("<CmdType>Alarm</CmdType>\r\n"); cmdXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n"); cmdXml.append("<DeviceID>" + device.getDeviceId() + "</DeviceID>\r\n"); - if (!XmlUtil.isEmpty(startPriority)) { + if (!StringUtils.isEmpty(startPriority)) { cmdXml.append("<StartAlarmPriority>" + startPriority + "</StartAlarmPriority>\r\n"); } - if (!XmlUtil.isEmpty(endPriority)) { + if (!StringUtils.isEmpty(endPriority)) { cmdXml.append("<EndAlarmPriority>" + endPriority + "</EndAlarmPriority>\r\n"); } - if (!XmlUtil.isEmpty(alarmMethod)) { + if (!StringUtils.isEmpty(alarmMethod)) { cmdXml.append("<AlarmMethod>" + alarmMethod + "</AlarmMethod>\r\n"); } - if (!XmlUtil.isEmpty(alarmType)) { + if (!StringUtils.isEmpty(alarmType)) { cmdXml.append("<AlarmType>" + alarmType + "</AlarmType>\r\n"); } - if (!XmlUtil.isEmpty(startTime)) { + if (!StringUtils.isEmpty(startTime)) { cmdXml.append("<StartAlarmTime>" + startTime + "</StartAlarmTime>\r\n"); } - if (!XmlUtil.isEmpty(endTime)) { + if (!StringUtils.isEmpty(endTime)) { cmdXml.append("<EndAlarmTime>" + endTime + "</EndAlarmTime>\r\n"); } cmdXml.append("</Query>\r\n"); @@ -1230,7 +1299,7 @@ cmdXml.append("<Query>\r\n"); cmdXml.append("<CmdType>ConfigDownload</CmdType>\r\n"); cmdXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n"); - if (XmlUtil.isEmpty(channelId)) { + if (StringUtils.isEmpty(channelId)) { cmdXml.append("<DeviceID>" + device.getDeviceId() + "</DeviceID>\r\n"); } else { cmdXml.append("<DeviceID>" + channelId + "</DeviceID>\r\n"); @@ -1265,7 +1334,7 @@ cmdXml.append("<Query>\r\n"); cmdXml.append("<CmdType>PresetQuery</CmdType>\r\n"); cmdXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n"); - if (XmlUtil.isEmpty(channelId)) { + if (StringUtils.isEmpty(channelId)) { cmdXml.append("<DeviceID>" + device.getDeviceId() + "</DeviceID>\r\n"); } else { cmdXml.append("<DeviceID>" + channelId + "</DeviceID>\r\n"); @@ -1377,22 +1446,22 @@ cmdXml.append("<CmdType>Alarm</CmdType>\r\n"); cmdXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n"); cmdXml.append("<DeviceID>" + device.getDeviceId() + "</DeviceID>\r\n"); - if (!XmlUtil.isEmpty(startPriority)) { + if (!StringUtils.isEmpty(startPriority)) { cmdXml.append("<StartAlarmPriority>" + startPriority + "</StartAlarmPriority>\r\n"); } - if (!XmlUtil.isEmpty(endPriority)) { + if (!StringUtils.isEmpty(endPriority)) { cmdXml.append("<EndAlarmPriority>" + endPriority + "</EndAlarmPriority>\r\n"); } - if (!XmlUtil.isEmpty(alarmMethod)) { + if (!StringUtils.isEmpty(alarmMethod)) { cmdXml.append("<AlarmMethod>" + alarmMethod + "</AlarmMethod>\r\n"); } - if (!XmlUtil.isEmpty(alarmType)) { + if (!StringUtils.isEmpty(alarmType)) { cmdXml.append("<AlarmType>" + alarmType + "</AlarmType>\r\n"); } - if (!XmlUtil.isEmpty(startTime)) { + if (!StringUtils.isEmpty(startTime)) { cmdXml.append("<StartAlarmTime>" + startTime + "</StartAlarmTime>\r\n"); } - if (!XmlUtil.isEmpty(endTime)) { + if (!StringUtils.isEmpty(endTime)) { cmdXml.append("<EndAlarmTime>" + endTime + "</EndAlarmTime>\r\n"); } cmdXml.append("</Query>\r\n"); @@ -1411,6 +1480,64 @@ e.printStackTrace(); return false; } + } + + @Override + public boolean catalogSubscribe(Device device, SipSubscribe.Event okEvent, SipSubscribe.Event errorEvent) { + try { + StringBuffer cmdXml = new StringBuffer(200); + cmdXml.append("<?xml version=\"1.0\" encoding=\"GB2312\"?>\r\n"); + cmdXml.append("<Query>\r\n"); + cmdXml.append("<CmdType>Catalog</CmdType>\r\n"); + cmdXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n"); + cmdXml.append("<DeviceID>" + device.getDeviceId() + "</DeviceID>\r\n"); + cmdXml.append("</Query>\r\n"); + + String tm = Long.toString(System.currentTimeMillis()); + + CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId() + : udpSipProvider.getNewCallId(); + + // 鏈夋晥鏃堕棿榛樿涓�60绉掍互涓� + Request request = headerProvider.createSubscribeRequest(device, cmdXml.toString(), "z9hG4bK-viaPos-" + tm, + "fromTagPos" + tm, null, device.getSubscribeCycleForCatalog() + 60, "Catalog" , + callIdHeader); + transmitRequest(device, request, errorEvent, okEvent); + + return true; + + } catch ( NumberFormatException | ParseException | InvalidArgumentException | SipException e) { + e.printStackTrace(); + return false; + } + } + + @Override + public boolean dragZoomCmd(Device device, String channelId, String cmdString) { + try { + StringBuffer dragXml = new StringBuffer(200); + dragXml.append("<?xml version=\"1.0\" ?>\r\n"); + dragXml.append("<Control>\r\n"); + dragXml.append("<CmdType>DeviceControl</CmdType>\r\n"); + dragXml.append("<SN>" + (int) ((Math.random() * 9 + 1) * 100000) + "</SN>\r\n"); + if (StringUtils.isEmpty(channelId)) { + dragXml.append("<DeviceID>" + device.getDeviceId() + "</DeviceID>\r\n"); + } else { + dragXml.append("<DeviceID>" + channelId + "</DeviceID>\r\n"); + } + dragXml.append(cmdString); + dragXml.append("</Control>\r\n"); + String tm = Long.toString(System.currentTimeMillis()); + CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId() + : udpSipProvider.getNewCallId(); + Request request = headerProvider.createMessageRequest(device, dragXml.toString(), "z9hG4bK-ViaPtz-" + tm, "FromPtz" + tm, null, callIdHeader); + logger.debug("鎷夋淇′护锛� " + request.toString()); + transmitRequest(device, request); + return true; + } catch (SipException | ParseException | InvalidArgumentException e) { + e.printStackTrace(); + } + return false; } @@ -1433,26 +1560,136 @@ CallIdHeader callIdHeader = (CallIdHeader)request.getHeader(CallIdHeader.NAME); // 娣诲姞閿欒璁㈤槄 if (errorEvent != null) { - sipSubscribe.addErrorSubscribe(callIdHeader.getCallId(), errorEvent); + sipSubscribe.addErrorSubscribe(callIdHeader.getCallId(), (eventResult -> { + errorEvent.response(eventResult); + sipSubscribe.removeErrorSubscribe(eventResult.callId); + })); } // 娣诲姞璁㈤槄 if (okEvent != null) { - sipSubscribe.addOkSubscribe(callIdHeader.getCallId(), okEvent); + sipSubscribe.addOkSubscribe(callIdHeader.getCallId(), eventResult ->{ + okEvent.response(eventResult); + sipSubscribe.removeOkSubscribe(eventResult.callId); + }); } clientTransaction.sendRequest(); return clientTransaction; } - - - + /** + * 鍥炴斁鏆傚仠 + */ @Override - public void closeRTPServer(Device device, String channelId) { - if (rtpEnable) { - String streamId = String.format("gb_play_%s_%s", device.getDeviceId(), channelId); - zlmrtpServerFactory.closeRTPServer(streamId); + public void playPauseCmd(Device device, StreamInfo streamInfo) { + try { + Long cseq = redisCatchStorage.getCSEQ(Request.INFO); + StringBuffer content = new StringBuffer(200); + content.append("PAUSE RTSP/1.0\r\n"); + content.append("CSeq: " + cseq + "\r\n"); + content.append("PauseTime: now\r\n"); + Request request = headerProvider.createInfoRequest(device, streamInfo, content.toString(), cseq); + if (request == null) { + return; + } + logger.info(request.toString()); + ClientTransaction clientTransaction = null; + if ("TCP".equals(device.getTransport())) { + clientTransaction = tcpSipProvider.getNewClientTransaction(request); + } else if ("UDP".equals(device.getTransport())) { + clientTransaction = udpSipProvider.getNewClientTransaction(request); + } + if (clientTransaction != null) { + clientTransaction.sendRequest(); + } + + } catch (SipException | ParseException | InvalidArgumentException e) { + e.printStackTrace(); } - streamSession.remove(device.getDeviceId(), channelId); + } + + /** + * 鍥炴斁鎭㈠ + */ + @Override + public void playResumeCmd(Device device, StreamInfo streamInfo) { + try { + Long cseq = redisCatchStorage.getCSEQ(Request.INFO); + StringBuffer content = new StringBuffer(200); + content.append("PLAY RTSP/1.0\r\n"); + content.append("CSeq: " + cseq + "\r\n"); + content.append("Range: npt=now-\r\n"); + Request request = headerProvider.createInfoRequest(device, streamInfo, content.toString(), cseq); + if (request == null) return; + logger.info(request.toString()); + ClientTransaction clientTransaction = null; + if ("TCP".equals(device.getTransport())) { + clientTransaction = tcpSipProvider.getNewClientTransaction(request); + } else if ("UDP".equals(device.getTransport())) { + clientTransaction = udpSipProvider.getNewClientTransaction(request); + } + + clientTransaction.sendRequest(); + + } catch (SipException | ParseException | InvalidArgumentException e) { + e.printStackTrace(); + } + } + + /** + * 鍥炴斁鎷栧姩鎾斁 + */ + @Override + public void playSeekCmd(Device device, StreamInfo streamInfo, long seekTime) { + try { + Long cseq = redisCatchStorage.getCSEQ(Request.INFO); + StringBuffer content = new StringBuffer(200); + content.append("PLAY RTSP/1.0\r\n"); + content.append("CSeq: " + cseq + "\r\n"); + content.append("Range: npt=" + Math.abs(seekTime) + "-\r\n"); + + Request request = headerProvider.createInfoRequest(device, streamInfo, content.toString(), cseq); + if (request == null) return; + logger.info(request.toString()); + ClientTransaction clientTransaction = null; + if ("TCP".equals(device.getTransport())) { + clientTransaction = tcpSipProvider.getNewClientTransaction(request); + } else if ("UDP".equals(device.getTransport())) { + clientTransaction = udpSipProvider.getNewClientTransaction(request); + } + + clientTransaction.sendRequest(); + + } catch (SipException | ParseException | InvalidArgumentException e) { + e.printStackTrace(); + } + } + + /** + * 鍥炴斁鍊嶉�熸挱鏀� + */ + @Override + public void playSpeedCmd(Device device, StreamInfo streamInfo, Double speed) { + try { + Long cseq = redisCatchStorage.getCSEQ(Request.INFO); + StringBuffer content = new StringBuffer(200); + content.append("PLAY RTSP/1.0\r\n"); + content.append("CSeq: " + cseq + "\r\n"); + content.append("Scale: " + String.format("%.1f",speed) + "\r\n"); + Request request = headerProvider.createInfoRequest(device, streamInfo, content.toString(), cseq); + if (request == null) return; + logger.info(request.toString()); + ClientTransaction clientTransaction = null; + if ("TCP".equals(device.getTransport())) { + clientTransaction = tcpSipProvider.getNewClientTransaction(request); + } else if ("UDP".equals(device.getTransport())) { + clientTransaction = udpSipProvider.getNewClientTransaction(request); + } + + clientTransaction.sendRequest(); + + } catch (SipException | ParseException | InvalidArgumentException e) { + e.printStackTrace(); + } } } -- Gitblit v1.8.0