From 60df3e396fbe917e5245a0fac4dba1f08dd31576 Mon Sep 17 00:00:00 2001 From: shikong <919411476@qq.com> Date: Wed, 23 Aug 2023 23:04:14 +0800 Subject: [PATCH] =?UTF-8?q?sdp=20=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/sip/gb28181/sdp/MediaSdpHelper.java | 24 ++++++++ .../gb28181/service/play/PlayService.java | 6 ++ .../core/sip/message/event/SipEventTest.java | 59 ++++++++++++++++++- 3 files changed, 86 insertions(+), 3 deletions(-) create mode 100644 gb28181-service/src/main/java/cn/skcks/docking/gb28181/core/sip/gb28181/sdp/MediaSdpHelper.java diff --git a/gb28181-service/src/main/java/cn/skcks/docking/gb28181/core/sip/gb28181/sdp/MediaSdpHelper.java b/gb28181-service/src/main/java/cn/skcks/docking/gb28181/core/sip/gb28181/sdp/MediaSdpHelper.java new file mode 100644 index 0000000..eb19f53 --- /dev/null +++ b/gb28181-service/src/main/java/cn/skcks/docking/gb28181/core/sip/gb28181/sdp/MediaSdpHelper.java @@ -0,0 +1,24 @@ +package cn.skcks.docking.gb28181.core.sip.gb28181.sdp; + +import javax.sdp.SessionDescription; +import java.util.HashMap; +import java.util.Map; + +public class MediaSdpHelper { + public static final Map RTPMAP = new HashMap<>() {{ + put("96", "PS/90000"); + put("126", "H264/90000"); + put("125", "H264S/90000"); + put("99", "H265/90000"); + put("98", "H264/90000"); + put("97", "MPEG4/90000"); + }}; + public static final Map FMTP = new HashMap<>() {{ + put("126", "profile-level-id=42e01e"); + put("125", "profile-level-id=42e01e"); + }}; + + public SessionDescription build(String deviceId, String channelId, String rtpIp, int rtpPort, String streamMode){ + return null; + } +} diff --git a/gb28181-service/src/main/java/cn/skcks/docking/gb28181/service/play/PlayService.java b/gb28181-service/src/main/java/cn/skcks/docking/gb28181/service/play/PlayService.java index 0381074..51b2790 100644 --- a/gb28181-service/src/main/java/cn/skcks/docking/gb28181/service/play/PlayService.java +++ b/gb28181-service/src/main/java/cn/skcks/docking/gb28181/service/play/PlayService.java @@ -12,6 +12,10 @@ import cn.skcks.docking.gb28181.media.proxy.ZlmMediaService; import cn.skcks.docking.gb28181.orm.mybatis.dynamic.model.DockingDevice; import cn.skcks.docking.gb28181.service.docking.device.DockingDeviceService; import cn.skcks.docking.gb28181.service.ssrc.SsrcService; +import gov.nist.javax.sdp.fields.SDPField; +import gov.nist.javax.sdp.fields.SDPFormat; +import gov.nist.javax.sdp.fields.SDPObject; +import gov.nist.javax.sdp.parser.SDPParser; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @@ -75,6 +79,8 @@ public class PlayService { sb.append("v=0\r\n"); sb.append("o=").append(channelId).append(" 0 0 IN IP4 ").append(ip).append("\r\n"); + // new SDPField(); + return result; // zlmMediaService.getRtpInfo(); // GetMediaList getMediaList = new GetMediaList(); diff --git a/gb28181-service/src/test/java/cn/skcks/docking/gb28181/core/sip/message/event/SipEventTest.java b/gb28181-service/src/test/java/cn/skcks/docking/gb28181/core/sip/message/event/SipEventTest.java index 6e5a111..e641cfc 100644 --- a/gb28181-service/src/test/java/cn/skcks/docking/gb28181/core/sip/message/event/SipEventTest.java +++ b/gb28181-service/src/test/java/cn/skcks/docking/gb28181/core/sip/message/event/SipEventTest.java @@ -1,9 +1,18 @@ package cn.skcks.docking.gb28181.core.sip.message.event; +import cn.skcks.docking.gb28181.core.sip.gb28181.sdp.MediaSdpHelper; +import gov.nist.core.NameValue; +import gov.nist.core.Separators; +import gov.nist.javax.sdp.MediaDescriptionImpl; +import gov.nist.javax.sdp.SessionDescriptionImpl; +import gov.nist.javax.sdp.fields.*; +import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.junit.jupiter.api.Test; -import java.util.ArrayList; -import java.util.List; +import javax.sdp.*; +import java.util.*; import java.util.concurrent.*; import java.util.concurrent.atomic.AtomicInteger; @@ -23,6 +32,7 @@ public class SipEventTest { List list = new ArrayList<>(); Flow.Subscriber subscriber = new Flow.Subscriber<>() { Flow.Subscription subscription; + @Override public void onSubscribe(Flow.Subscription subscription) { this.subscription = subscription; @@ -52,7 +62,7 @@ public class SipEventTest { AtomicInteger finalI = new AtomicInteger(1); - new Thread(()->{ + new Thread(() -> { try { Thread.sleep(500); } catch (InterruptedException e) { @@ -77,6 +87,7 @@ public class SipEventTest { CountDownLatch countDownLatch2 = new CountDownLatch(1); submissionPublisher.subscribe(new Flow.Subscriber<>() { Flow.Subscription subscription; + @Override public void onSubscribe(Flow.Subscription subscription) { this.subscription = subscription; @@ -104,4 +115,46 @@ public class SipEventTest { countDownLatch2.await(); executor.shutdown(); } + + @Test + @SneakyThrows + public void sdpTest() { + SessionDescription sessionDescription = SdpFactory.getInstance().createSessionDescription("Play"); + Version version = SdpFactory.getInstance().createVersion(0); + sessionDescription.setVersion(version); + + Connection connectionField = SdpFactory.getInstance().createConnection(ConnectionField.IN, Connection.IP4, "10.10.10.20"); + sessionDescription.setConnection(connectionField); + + MediaDescription mediaDescription = SdpFactory.getInstance().createMediaDescription("video", 6666, 0, SdpConstants.RTP_AVP, MediaSdpHelper.RTPMAP.keySet().toArray(new String[0])); + mediaDescription.addAttribute((AttributeField)SdpFactory.getInstance().createAttribute("recvonly",null)); + MediaSdpHelper.RTPMAP.forEach((k, v)->{ + Optional.ofNullable(MediaSdpHelper.FMTP.get(k)).ifPresent((f)->{ + mediaDescription.addAttribute((AttributeField) SdpFactory.getInstance().createAttribute(SdpConstants.FMTP.toLowerCase(), StringUtils.joinWith(Separators.SP,k,f))); + }); + mediaDescription.addAttribute((AttributeField) SdpFactory.getInstance().createAttribute(SdpConstants.RTPMAP, StringUtils.joinWith(Separators.SP,k,v))); + }); + + // TCP-PASSIVE + mediaDescription.addAttribute((AttributeField)SdpFactory.getInstance().createAttribute("setup","passive")); + mediaDescription.addAttribute((AttributeField)SdpFactory.getInstance().createAttribute("connection","new")); + + // TCP-ACTIVE + mediaDescription.addAttribute((AttributeField)SdpFactory.getInstance().createAttribute("setup","active")); + mediaDescription.addAttribute((AttributeField)SdpFactory.getInstance().createAttribute("connection","new")); + + sessionDescription.setMediaDescriptions(new Vector<>() {{ + add(mediaDescription); + }}); + + TimeDescription timeDescription = SdpFactory.getInstance().createTimeDescription(); + sessionDescription.setTimeDescriptions(new Vector<>(){{add(timeDescription);}}); + + // channelId + Origin origin = SdpFactory.getInstance().createOrigin("44050100001310000006", 0, 0, ConnectionField.IN, Connection.IP4, "10.10.10.20"); + sessionDescription.setOrigin(origin); + // mediaDescription.setPreconditionFields(); + + log.info("\n{}", sessionDescription); + } }