From c1b3f2beb4b76e89d4938d2f7d5b31ff0f10220d Mon Sep 17 00:00:00 2001
From: panlinlin <648540858@qq.com>
Date: 星期日, 24 一月 2021 20:46:06 +0800
Subject: [PATCH] 国标级联--点播-未完成

---
 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/InviteRequestProcessor.java |  175 ++++++++++++++++++++++++++++++++++++++-------------------
 1 files changed, 116 insertions(+), 59 deletions(-)

diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/InviteRequestProcessor.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/InviteRequestProcessor.java
index 58e11ad..9d0a9a3 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/InviteRequestProcessor.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/InviteRequestProcessor.java
@@ -1,5 +1,6 @@
 package com.genersoft.iot.vmp.gb28181.transmit.request.impl;
 
+import javax.sdp.*;
 import javax.sip.InvalidArgumentException;
 import javax.sip.RequestEvent;
 import javax.sip.SipException;
@@ -11,20 +12,18 @@
 import javax.sip.message.Response;
 
 import com.alibaba.fastjson.JSONObject;
+import com.genersoft.iot.vmp.conf.MediaServerConfig;
 import com.genersoft.iot.vmp.gb28181.bean.Device;
 import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel;
-import com.genersoft.iot.vmp.gb28181.sdp.Codec;
-import com.genersoft.iot.vmp.gb28181.sdp.MediaDescription;
-import com.genersoft.iot.vmp.gb28181.sdp.SdpParser;
-import com.genersoft.iot.vmp.gb28181.sdp.SessionDescription;
-import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder;
-import com.genersoft.iot.vmp.gb28181.transmit.callback.RequestMessage;
 import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander;
 import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommanderFroPlatform;
 import com.genersoft.iot.vmp.gb28181.transmit.request.SIPRequestAbstractProcessor;
+import com.genersoft.iot.vmp.media.zlm.ZLMRTPServerFactory;
+import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
 import com.genersoft.iot.vmp.storager.IVideoManagerStorager;
 import com.genersoft.iot.vmp.vmanager.play.bean.PlayResult;
 import com.genersoft.iot.vmp.vmanager.service.IPlayService;
+import gov.nist.javax.sdp.fields.SDPFormat;
 import gov.nist.javax.sip.address.AddressImpl;
 import gov.nist.javax.sip.address.SipUri;
 import org.slf4j.Logger;
@@ -34,6 +33,8 @@
 import java.io.IOException;
 import java.text.ParseException;
 import java.util.List;
+import java.util.UUID;
+import java.util.Vector;
 
 /**    
  * @Description:澶勭悊INVITE璇锋眰
@@ -48,9 +49,21 @@
 
 	private IVideoManagerStorager storager;
 
+	private IRedisCatchStorage  redisCatchStorage;
+
 	private SIPCommander cmder;
 
 	private IPlayService playService;
+
+	private ZLMRTPServerFactory zlmrtpServerFactory;
+
+	public ZLMRTPServerFactory getZlmrtpServerFactory() {
+		return zlmrtpServerFactory;
+	}
+
+	public void setZlmrtpServerFactory(ZLMRTPServerFactory zlmrtpServerFactory) {
+		this.zlmrtpServerFactory = zlmrtpServerFactory;
+	}
 
 	/**
 	 * 澶勭悊invite璇锋眰
@@ -98,64 +111,105 @@
 			}else {
 				response100Ack(evt); // 閫氶亾瀛樺湪锛屽彂100锛宼rying
 			}
-			// 瑙f瀽sdp娑堟伅
-			SessionDescription sdp = new SdpParser().parse(request.getRawContent());
+			// 瑙f瀽sdp娑堟伅, 浣跨敤jainsip 鑷甫鐨剆dp瑙f瀽鏂瑰紡
+			String contentString = new String(request.getRawContent());
+			SessionDescription sdp = SdpFactory.getInstance().createSessionDescription(contentString);
+
+			// TODO 鍖哄垎TCP鍙戞祦杩樻槸udp锛� 褰撳墠榛樿udp
 			//  鑾峰彇鏀寔鐨勬牸寮�
-			List<MediaDescription> mediaDescriptions = sdp.getMediaDescriptions();
+			Vector mediaDescriptions = sdp.getMediaDescriptions(true);
 			// 鏌ョ湅鏄惁鏀寔PS 璐熻浇96
 			String ip = null;
 			int port = -1;
-			for (MediaDescription mediaDescription : mediaDescriptions) {
-
-				List<Codec> codecs = mediaDescription.getCodecs();
-				for (Codec codec : codecs) {
-					if("96".equals(codec.getPayloadType()) || "PS".equals(codec.getName()) || "ps".equals(codec.getName())) {
-						ip = mediaDescription.getIpAddress().getHostName();
-						port = mediaDescription.getPort();
-						break;
-					}
-				}
+			for (int i = 0; i < mediaDescriptions.size(); i++) {
+				MediaDescription mediaDescription = (MediaDescription)mediaDescriptions.get(i);
+				Media media = mediaDescription.getMedia();
+				port = media.getMediaPort();
 			}
-			if (ip == null || port == -1) { // TODO 娌℃湁鍚堥�傜殑瑙嗛娴佹牸寮忥紝 鍙厤缃槸鍚︿娇鐢ㄧ涓�涓猰edia淇℃伅
-				if (mediaDescriptions.size() > 0) {
-					ip = mediaDescriptions.get(0).getIpAddress().getHostName();
-					port = mediaDescriptions.get(0).getPort();
-				}
-			}
-
-			if (ip == null || port == -1) {
-				response488Ack(evt);
-				return;
-			}
-
-
-			String ssrc = sdp.getSsrc();
-
-			Device device = storager.queryVideoDeviceByPlatformIdAndChannelId(platformId, channelId);
-			if (device == null) {
-				logger.warn("鐐规挱骞冲彴{}鐨勯�氶亾{}鏃舵湭鎵惧埌璁惧淇℃伅", platformId, channel);
-				response500Ack(evt);
-				return;
-			}
-
-			// 閫氱煡涓嬬骇鎺ㄦ祦锛�
-			PlayResult playResult = playService.play(device.getDeviceId(), channelId, (response)->{
-				// 鏀跺埌鎺ㄦ祦锛� 鍥炲200OK
-
-			},(event -> {
-				// 鏈煡閿欒銆傜洿鎺ヨ浆鍙戣澶囩偣鎾殑閿欒
-				Response response = null;
-				try {
-					response = getMessageFactory().createResponse(event.getResponse().getStatusCode(), evt.getRequest());
-					getServerTransaction(evt).sendResponse(response);
-
-				} catch (ParseException | SipException | InvalidArgumentException e) {
-					e.printStackTrace();
-				}
-			}));
-			playResult.getResult();
+//			for (MediaDescription mediaDescription : mediaDescriptions) {
+//
+//				List<Codec> codecs = mediaDescription.getCodecs();
+//				for (Codec codec : codecs) {
+//					if("96".equals(codec.getPayloadType()) || "PS".equals(codec.getName()) || "ps".equals(codec.getName())) {
+//						// TODO 杩欓噷寰堟參
+//						ip = mediaDescription.getIpAddress().getHostName();
+//						port = mediaDescription.getPort();
+//						break;
+//					}
+//				}
+//			}
+//			if (ip == null || port == -1) { // TODO 娌℃湁鍚堥�傜殑瑙嗛娴佹牸寮忥紝 鍙厤缃槸鍚︿娇鐢ㄧ涓�涓猰edia淇℃伅
+//				if (mediaDescriptions.size() > 0) {
+//					ip = mediaDescriptions.get(0).getIpAddress().getHostName();
+//					port = mediaDescriptions.get(0).getPort();
+//				}
+//			}
+//
+//			if (ip == null || port == -1) {
+//				response488Ack(evt);
+//				return;
+//			}
+//
+//
+//			String ssrc = sdp.getSsrc();
+//
+//			Device device = storager.queryVideoDeviceByPlatformIdAndChannelId(platformId, channelId);
+//			if (device == null) {
+//				logger.warn("鐐规挱骞冲彴{}鐨勯�氶亾{}鏃舵湭鎵惧埌璁惧淇℃伅", platformId, channel);
+//				response500Ack(evt);
+//				return;
+//			}
+//
+//			// 閫氱煡涓嬬骇鎺ㄦ祦锛�
+//			PlayResult playResult = playService.play(device.getDeviceId(), channelId, (responseJSON)->{
+//				// 鏀跺埌鎺ㄦ祦锛� 鍥炲200OK
+//				UUID uuid = UUID.randomUUID();
+//				int rtpServer = zlmrtpServerFactory.createRTPServer(uuid.toString());
+//				if (rtpServer == -1) {
+//					logger.error("涓鸿幏鍙栧埌鍙敤绔彛");
+//					return;
+//				}else {
+//					zlmrtpServerFactory.closeRTPServer(uuid.toString());
+//				}
+//				// TODO 娣诲姞瀵箃cp鐨勬敮鎸�
+//				MediaServerConfig mediaInfo = redisCatchStorage.getMediaInfo();
+//				StringBuffer content = new StringBuffer(200);
+//				content.append("v=0\r\n");
+//				content.append("o="+"00000"+" 0 0 IN IP4 "+mediaInfo.getWanIp()+"\r\n");
+//				content.append("s=Play\r\n");
+//				content.append("c=IN IP4 "+mediaInfo.getWanIp()+"\r\n");
+//				content.append("t=0 0\r\n");
+//				content.append("m=video "+ rtpServer+" RTP/AVP 96\r\n");
+//				content.append("a=sendonly\r\n");
+//				content.append("a=rtpmap:96 PS/90000\r\n");
+//				content.append("y="+ ssrc + "\r\n");
+//				content.append("f=\r\n");
+//
+//				try {
+//					responseAck(evt, content.toString());
+//				} catch (SipException e) {
+//					e.printStackTrace();
+//				} catch (InvalidArgumentException e) {
+//					e.printStackTrace();
+//				} catch (ParseException e) {
+//					e.printStackTrace();
+//				}
+//
+//				// 鍐欏叆redis锛� 瓒呮椂鏃跺洖澶�
+////				redisCatchStorage.waiteAck()
+//			},(event -> {
+//				// 鏈煡閿欒銆傜洿鎺ヨ浆鍙戣澶囩偣鎾殑閿欒
+//				Response response = null;
+//				try {
+//					response = getMessageFactory().createResponse(event.getResponse().getStatusCode(), evt.getRequest());
+//					getServerTransaction(evt).sendResponse(response);
+//
+//				} catch (ParseException | SipException | InvalidArgumentException e) {
+//					e.printStackTrace();
+//				}
+//			}));
+//			playResult.getResult();
 			// 鏌ユ壘鍚堥�傜殑绔彛鎺ㄦ祦锛�
-			// 鍙戦�� 200ok
 			// 鏀跺埌ack鍚庤皟鐢ㄦ帹娴佹帴鍙�
 
 
@@ -163,9 +217,12 @@
 
 		} catch (SipException | InvalidArgumentException | ParseException e) {
 			e.printStackTrace();
-		} catch (IOException e) {
 			logger.warn("sdp瑙f瀽閿欒");
 			e.printStackTrace();
+		} catch (SdpParseException e) {
+			e.printStackTrace();
+		} catch (SdpException e) {
+			e.printStackTrace();
 		}
 
 	}

--
Gitblit v1.8.0