From e48fa711a3664bece9b3e58840a75fe7c05bc47c Mon Sep 17 00:00:00 2001
From: panlinlin <648540858@qq.com>
Date: 星期六, 08 五月 2021 17:14:05 +0800
Subject: [PATCH] 添加截图(快照)功能

---
 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/AckRequestProcessor.java |  121 ++++++++++++++++++++++++++++++++++------
 1 files changed, 102 insertions(+), 19 deletions(-)

diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/AckRequestProcessor.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/AckRequestProcessor.java
index 13d630c..445f4d2 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/AckRequestProcessor.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/AckRequestProcessor.java
@@ -1,14 +1,21 @@
 package com.genersoft.iot.vmp.gb28181.transmit.request.impl;
 
-import javax.sip.Dialog;
-import javax.sip.InvalidArgumentException;
-import javax.sip.RequestEvent;
-import javax.sip.SipException;
-import javax.sip.message.Request;
+import java.util.HashMap;
+import java.util.Map;
 
+import javax.sip.*;
+import javax.sip.address.SipURI;
+import javax.sip.header.FromHeader;
+import javax.sip.header.HeaderAddress;
+import javax.sip.header.ToHeader;
+
+import com.genersoft.iot.vmp.common.StreamInfo;
+import com.genersoft.iot.vmp.gb28181.bean.SendRtpItem;
 import com.genersoft.iot.vmp.gb28181.transmit.request.SIPRequestAbstractProcessor;
-
-import gov.nist.javax.sip.header.CSeq;
+import com.genersoft.iot.vmp.media.zlm.ZLMRTPServerFactory;
+import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**    
  * @Description:ACK璇锋眰澶勭悊鍣�  
@@ -16,7 +23,14 @@
  * @date:   2020骞�5鏈�3鏃� 涓嬪崍5:31:45     
  */
 public class AckRequestProcessor extends SIPRequestAbstractProcessor {
-	
+
+
+	private Logger logger = LoggerFactory.getLogger(AckRequestProcessor.class);
+
+    private IRedisCatchStorage redisCatchStorage;
+
+	private ZLMRTPServerFactory zlmrtpServerFactory;
+
 	/**   
 	 * 澶勭悊  ACK璇锋眰
 	 * 
@@ -24,21 +38,90 @@
 	 */
 	@Override
 	public void process(RequestEvent evt) {
-		Request request = evt.getRequest();
+		//Request request = evt.getRequest();
 		Dialog dialog = evt.getDialog();
 		if (dialog == null) return;
-		try {
-			Request ackRequest = null;
-			CSeq csReq = (CSeq) request.getHeader(CSeq.NAME);
-			ackRequest = dialog.createAck(csReq.getSeqNumber());
-			dialog.sendAck(ackRequest);
-			System.out.println("send ack to callee:" + ackRequest.toString());
-		} catch (SipException e) {
-			e.printStackTrace();
-		} catch (InvalidArgumentException e) {
-			e.printStackTrace();
+		//DialogState state = dialog.getState();
+		if (/*request.getMecodewwthod().equals(Request.INVITE) &&*/ dialog.getState()== DialogState.CONFIRMED) {
+			String platformGbId = ((SipURI) ((HeaderAddress) evt.getRequest().getHeader(FromHeader.NAME)).getAddress().getURI()).getUser();
+			String channelId = ((SipURI) ((HeaderAddress) evt.getRequest().getHeader(ToHeader.NAME)).getAddress().getURI()).getUser();
+			SendRtpItem sendRtpItem =  redisCatchStorage.querySendRTPServer(platformGbId, channelId);
+			String is_Udp = sendRtpItem.isTcp() ? "0" : "1";
+			String deviceId = sendRtpItem.getDeviceId();
+			StreamInfo streamInfo = null;
+			if (deviceId == null) {
+				streamInfo = new StreamInfo();
+				streamInfo.setApp(sendRtpItem.getApp());
+				streamInfo.setStreamId(sendRtpItem.getStreamId());
+			}else {
+				streamInfo = redisCatchStorage.queryPlayByDevice(deviceId, channelId);
+				sendRtpItem.setStreamId(streamInfo.getStreamId());
+				streamInfo.setApp("rtp");
+			}
+
+			redisCatchStorage.updateSendRTPSever(sendRtpItem);
+			logger.info(platformGbId);
+			logger.info(channelId);
+			Map<String, Object> param = new HashMap<>();
+			param.put("vhost","__defaultVhost__");
+			param.put("app",streamInfo.getApp());
+			param.put("stream",streamInfo.getStreamId());
+			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());
+			// 璁惧鎺ㄦ祦鏌ヨ锛屾垚鍔熷悗鎵嶈兘杞帹
+			boolean rtpPushed = false;
+			long startTime = System.currentTimeMillis();
+			while (!rtpPushed) {
+				try {
+					if (System.currentTimeMillis() - startTime < 30 * 1000) {
+						if (zlmrtpServerFactory.isStreamReady(streamInfo.getApp(), streamInfo.getStreamId())) {
+							rtpPushed = true;
+							logger.info("宸茶幏鍙栬澶囨帹娴侊紝寮�濮嬪悜涓婄骇鎺ㄦ祦");
+							zlmrtpServerFactory.startSendRtpStream(param);
+						} else {
+							logger.info("绛夊緟璁惧鎺ㄦ祦.......");
+							Thread.sleep(1000);
+							continue;
+						}
+					} else {
+						rtpPushed = true;
+						logger.info("璁惧鎺ㄦ祦瓒呮椂锛岀粓姝㈠悜涓婄骇鎺ㄦ祦");
+					}
+				} catch (InterruptedException e) {
+					e.printStackTrace();
+				}
+			}
 		}
+		// try {
+		// 	Request ackRequest = null;
+		// 	CSeq csReq = (CSeq) request.getHeader(CSeq.NAME);
+		// 	ackRequest = dialog.createAck(csReq.getSeqNumber());
+		// 	dialog.sendAck(ackRequest);
+		// 	logger.info("send ack to callee:" + ackRequest.toString());
+		// } catch (SipException e) {
+		// 	e.printStackTrace();
+		// } catch (InvalidArgumentException e) {
+		// 	e.printStackTrace();
+		// }
 		
 	}
 
+	public IRedisCatchStorage getRedisCatchStorage() {
+		return redisCatchStorage;
+	}
+
+	public void setRedisCatchStorage(IRedisCatchStorage redisCatchStorage) {
+		this.redisCatchStorage = redisCatchStorage;
+	}
+
+	public ZLMRTPServerFactory getZlmrtpServerFactory() {
+		return zlmrtpServerFactory;
+	}
+
+	public void setZlmrtpServerFactory(ZLMRTPServerFactory zlmrtpServerFactory) {
+		this.zlmrtpServerFactory = zlmrtpServerFactory;
+	}
 }

--
Gitblit v1.8.0