|  | @@ -43,6 +43,7 @@ import org.springframework.data.redis.core.RedisTemplate;
 | 
	
		
			
				|  |  |  import org.springframework.stereotype.Service;
 | 
	
		
			
				|  |  |  import org.springframework.util.ObjectUtils;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +import javax.sdp.*;
 | 
	
		
			
				|  |  |  import javax.sip.InvalidArgumentException;
 | 
	
		
			
				|  |  |  import javax.sip.ResponseEvent;
 | 
	
		
			
				|  |  |  import javax.sip.SipException;
 | 
	
	
		
			
				|  | @@ -51,6 +52,7 @@ import java.math.RoundingMode;
 | 
	
		
			
				|  |  |  import java.text.ParseException;
 | 
	
		
			
				|  |  |  import java.util.List;
 | 
	
		
			
				|  |  |  import java.util.UUID;
 | 
	
		
			
				|  |  | +import java.util.Vector;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  @SuppressWarnings(value = {"rawtypes", "unchecked"})
 | 
	
		
			
				|  |  |  @Service
 | 
	
	
		
			
				|  | @@ -180,7 +182,7 @@ public class PlayServiceImpl implements IPlayService {
 | 
	
		
			
				|  |  |              if (mediaServerItem.isRtpEnable()) {
 | 
	
		
			
				|  |  |                  streamId = String.format("%s_%s", device.getDeviceId(), channelId);
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  | -            SSRCInfo ssrcInfo = mediaServerService.openRTPServer(mediaServerItem, streamId, device.isSsrcCheck(), false);
 | 
	
		
			
				|  |  | +            SSRCInfo ssrcInfo = mediaServerService.openRTPServer(mediaServerItem, streamId, null, device.isSsrcCheck(),  false, 0, false, device.getStreamModeForParam());
 | 
	
		
			
				|  |  |              if (ssrcInfo == null) {
 | 
	
		
			
				|  |  |                  WVPResult wvpResult = new WVPResult();
 | 
	
		
			
				|  |  |                  wvpResult.setCode(ErrorCode.ERROR100.getCode());
 | 
	
	
		
			
				|  | @@ -296,6 +298,29 @@ public class PlayServiceImpl implements IPlayService {
 | 
	
		
			
				|  |  |                      String ssrcInResponse = contentString.substring(ssrcIndex + 2, ssrcIndex + 12).trim();
 | 
	
		
			
				|  |  |                      // 查询到ssrc不一致且开启了ssrc校验则需要针对处理
 | 
	
		
			
				|  |  |                      if (ssrcInfo.getSsrc().equals(ssrcInResponse)) {
 | 
	
		
			
				|  |  | +                        if (device.getStreamMode().equalsIgnoreCase("TCP-ACTIVE")) {
 | 
	
		
			
				|  |  | +                            String substring = contentString.substring(0, contentString.indexOf("y="));
 | 
	
		
			
				|  |  | +                            try {
 | 
	
		
			
				|  |  | +                                SessionDescription sdp = SdpFactory.getInstance().createSessionDescription(substring);
 | 
	
		
			
				|  |  | +                                int port = -1;
 | 
	
		
			
				|  |  | +                                Vector mediaDescriptions = sdp.getMediaDescriptions(true);
 | 
	
		
			
				|  |  | +                                for (Object description : mediaDescriptions) {
 | 
	
		
			
				|  |  | +                                    MediaDescription mediaDescription = (MediaDescription) description;
 | 
	
		
			
				|  |  | +                                    Media media = mediaDescription.getMedia();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                                    Vector mediaFormats = media.getMediaFormats(false);
 | 
	
		
			
				|  |  | +                                    if (mediaFormats.contains("96")) {
 | 
	
		
			
				|  |  | +                                        port = media.getMediaPort();
 | 
	
		
			
				|  |  | +                                        break;
 | 
	
		
			
				|  |  | +                                    }
 | 
	
		
			
				|  |  | +                                }
 | 
	
		
			
				|  |  | +                                logger.info("[点播-TCP主动连接对方] deviceId: {}, channelId: {}, 连接对方的地址:{}:{}, 收流模式:{}, SSRC: {}, SSRC校验:{}", device.getDeviceId(), channelId, sdp.getConnection().getAddress(), port, device.getStreamMode(), ssrcInfo.getSsrc(), device.isSsrcCheck());
 | 
	
		
			
				|  |  | +                                JSONObject jsonObject = zlmresTfulUtils.connectRtpServer(mediaServerItem, sdp.getConnection().getAddress(), port, ssrcInfo.getStream());
 | 
	
		
			
				|  |  | +                                logger.info("[点播-TCP主动连接对方] 结果: {}", jsonObject);
 | 
	
		
			
				|  |  | +                            } catch (SdpException e) {
 | 
	
		
			
				|  |  | +                                logger.error("[点播-TCP主动连接对方] deviceId: {}, channelId: {}, 解析200OK的SDP信息失败", device.getDeviceId(), channelId, e);
 | 
	
		
			
				|  |  | +                            }
 | 
	
		
			
				|  |  | +                        }
 | 
	
		
			
				|  |  |                          return;
 | 
	
		
			
				|  |  |                      }
 | 
	
		
			
				|  |  |                      logger.info("[点播消息] 收到invite 200, 发现下级自定义了ssrc: {}", ssrcInResponse);
 | 
	
	
		
			
				|  | @@ -331,7 +356,7 @@ public class PlayServiceImpl implements IPlayService {
 | 
	
		
			
				|  |  |                          mediaServerService.closeRTPServer(mediaServerItem, ssrcInfo.getStream(), result->{
 | 
	
		
			
				|  |  |                              if (result) {
 | 
	
		
			
				|  |  |                                  // 重新开启ssrc server
 | 
	
		
			
				|  |  | -                                mediaServerService.openRTPServer(mediaServerItem, ssrcInfo.getStream(), ssrcInResponse, device.isSsrcCheck(), false, ssrcInfo.getPort());
 | 
	
		
			
				|  |  | +                                mediaServerService.openRTPServer(mediaServerItem, ssrcInfo.getStream(), ssrcInResponse, device.isSsrcCheck(), false, ssrcInfo.getPort(), true, device.getStreamModeForParam());
 | 
	
		
			
				|  |  |                              }else {
 | 
	
		
			
				|  |  |                                  try {
 | 
	
		
			
				|  |  |                                      logger.warn("[停止点播] {}/{}", device.getDeviceId(), channelId);
 | 
	
	
		
			
				|  | @@ -475,8 +500,7 @@ public class PlayServiceImpl implements IPlayService {
 | 
	
		
			
				|  |  |              return;
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |          MediaServerItem newMediaServerItem = getNewMediaServerItem(device);
 | 
	
		
			
				|  |  | -        SSRCInfo ssrcInfo = mediaServerService.openRTPServer(newMediaServerItem, null, device.isSsrcCheck(), true);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | +        SSRCInfo ssrcInfo = mediaServerService.openRTPServer(newMediaServerItem, null, null, device.isSsrcCheck(),  true, 0, false, device.getStreamModeForParam());
 | 
	
		
			
				|  |  |          playBack(newMediaServerItem, ssrcInfo, deviceId, channelId, startTime, endTime, inviteStreamCallback, callback);
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -595,7 +619,7 @@ public class PlayServiceImpl implements IPlayService {
 | 
	
		
			
				|  |  |                                      mediaServerService.closeRTPServer(mediaServerItem, ssrcInfo.getStream(), result->{
 | 
	
		
			
				|  |  |                                          if (result) {
 | 
	
		
			
				|  |  |                                              // 重新开启ssrc server
 | 
	
		
			
				|  |  | -                                            mediaServerService.openRTPServer(mediaServerItem, ssrcInfo.getStream(), ssrcInResponse, device.isSsrcCheck(), true, ssrcInfo.getPort());
 | 
	
		
			
				|  |  | +                                            mediaServerService.openRTPServer(mediaServerItem, ssrcInfo.getStream(), ssrcInResponse, device.isSsrcCheck(), true, ssrcInfo.getPort(), true, device.getStreamModeForParam());
 | 
	
		
			
				|  |  |                                          }else {
 | 
	
		
			
				|  |  |                                              try {
 | 
	
		
			
				|  |  |                                                  logger.warn("[回放消息]停止 {}/{}", device.getDeviceId(), channelId);
 | 
	
	
		
			
				|  | @@ -645,8 +669,7 @@ public class PlayServiceImpl implements IPlayService {
 | 
	
		
			
				|  |  |              playBackCallback.call(downloadResult);
 | 
	
		
			
				|  |  |              return;
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  | -        SSRCInfo ssrcInfo = mediaServerService.openRTPServer(newMediaServerItem, null, device.isSsrcCheck(), true);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | +        SSRCInfo ssrcInfo = mediaServerService.openRTPServer(newMediaServerItem, null, null, device.isSsrcCheck(),  true, 0, false, device.getStreamModeForParam());
 | 
	
		
			
				|  |  |          download(newMediaServerItem, ssrcInfo, deviceId, channelId, startTime, endTime, downloadSpeed, infoCallBack, playBackCallback);
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -755,7 +778,7 @@ public class PlayServiceImpl implements IPlayService {
 | 
	
		
			
				|  |  |                                      mediaServerService.closeRTPServer(mediaServerItem, ssrcInfo.getStream(), result->{
 | 
	
		
			
				|  |  |                                          if (result) {
 | 
	
		
			
				|  |  |                                              // 重新开启ssrc server
 | 
	
		
			
				|  |  | -                                            mediaServerService.openRTPServer(mediaServerItem, ssrcInfo.getStream(), ssrcInResponse, device.isSsrcCheck(), true, ssrcInfo.getPort());
 | 
	
		
			
				|  |  | +                                            mediaServerService.openRTPServer(mediaServerItem, ssrcInfo.getStream(), ssrcInResponse, device.isSsrcCheck(), true, ssrcInfo.getPort(), true, device.getStreamModeForParam());
 | 
	
		
			
				|  |  |                                          }else {
 | 
	
		
			
				|  |  |                                              try {
 | 
	
		
			
				|  |  |                                                  logger.warn("[录像下载] 停止{}/{}", device.getDeviceId(), channelId);
 |