Commit 6dc4b8a79a07857f415e6da3955f8c14eafca38a
1 parent
0a951e87
修复点播与录像回放sdp信息sdp-ip的取值错误,修复回放信令错误
Showing
7 changed files
with
28 additions
and
12 deletions
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/SIPRequestHeaderProvider.java
| ... | ... | @@ -99,13 +99,13 @@ public class SIPRequestHeaderProvider { |
| 99 | 99 | return request; |
| 100 | 100 | } |
| 101 | 101 | |
| 102 | - public Request createPlaybackInviteRequest(Device device, String channelId, String content, String viaTag, String fromTag, String toTag, CallIdHeader callIdHeader) throws ParseException, InvalidArgumentException, PeerUnavailableException { | |
| 102 | + public Request createPlaybackInviteRequest(Device device, String channelId, String content, String viaTag, String fromTag, String toTag, CallIdHeader callIdHeader, String ssrc) throws ParseException, InvalidArgumentException, PeerUnavailableException { | |
| 103 | 103 | Request request = null; |
| 104 | 104 | //请求行 |
| 105 | - SipURI requestLine = sipFactory.createAddressFactory().createSipURI(device.getDeviceId(), device.getHostAddress()); | |
| 105 | + SipURI requestLine = sipFactory.createAddressFactory().createSipURI(channelId, device.getHostAddress()); | |
| 106 | 106 | // via |
| 107 | 107 | ArrayList<ViaHeader> viaHeaders = new ArrayList<ViaHeader>(); |
| 108 | - ViaHeader viaHeader = sipFactory.createHeaderFactory().createViaHeader(device.getIp(), device.getPort(), device.getTransport(), viaTag); | |
| 108 | + ViaHeader viaHeader = sipFactory.createHeaderFactory().createViaHeader(sipConfig.getIp(), sipConfig.getPort(), device.getTransport(), viaTag); | |
| 109 | 109 | viaHeader.setRPort(); |
| 110 | 110 | viaHeaders.add(viaHeader); |
| 111 | 111 | //from |
| ... | ... | @@ -113,7 +113,7 @@ public class SIPRequestHeaderProvider { |
| 113 | 113 | Address fromAddress = sipFactory.createAddressFactory().createAddress(fromSipURI); |
| 114 | 114 | FromHeader fromHeader = sipFactory.createHeaderFactory().createFromHeader(fromAddress, fromTag); //必须要有标记,否则无法创建会话,无法回应ack |
| 115 | 115 | //to |
| 116 | - SipURI toSipURI = sipFactory.createAddressFactory().createSipURI(channelId,sipConfig.getDomain()); | |
| 116 | + SipURI toSipURI = sipFactory.createAddressFactory().createSipURI(channelId, sipConfig.getDomain()); | |
| 117 | 117 | Address toAddress = sipFactory.createAddressFactory().createAddress(toSipURI); |
| 118 | 118 | ToHeader toHeader = sipFactory.createHeaderFactory().createToHeader(toAddress,null); |
| 119 | 119 | |
| ... | ... | @@ -127,7 +127,10 @@ public class SIPRequestHeaderProvider { |
| 127 | 127 | Address concatAddress = sipFactory.createAddressFactory().createAddress(sipFactory.createAddressFactory().createSipURI(sipConfig.getId(), sipConfig.getIp()+":"+sipConfig.getPort())); |
| 128 | 128 | // Address concatAddress = sipFactory.createAddressFactory().createAddress(sipFactory.createAddressFactory().createSipURI(sipConfig.getId(), device.getHost().getIp()+":"+device.getHost().getPort())); |
| 129 | 129 | request.addHeader(sipFactory.createHeaderFactory().createContactHeader(concatAddress)); |
| 130 | - | |
| 130 | + // Subject | |
| 131 | + SubjectHeader subjectHeader = sipFactory.createHeaderFactory().createSubjectHeader(String.format("%s:%s,%s:%s", channelId, ssrc, sipConfig.getId(), 0)); | |
| 132 | + request.addHeader(subjectHeader); | |
| 133 | + | |
| 131 | 134 | ContentTypeHeader contentTypeHeader = sipFactory.createHeaderFactory().createContentTypeHeader("APPLICATION", "SDP"); |
| 132 | 135 | request.setContent(content, contentTypeHeader); |
| 133 | 136 | return request; | ... | ... |
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java
| ... | ... | @@ -468,7 +468,7 @@ public class SIPCommander implements ISIPCommander { |
| 468 | 468 | |
| 469 | 469 | StringBuffer content = new StringBuffer(200); |
| 470 | 470 | content.append("v=0\r\n"); |
| 471 | - content.append("o="+sipConfig.getId()+" 0 0 IN IP4 "+sipConfig.getIp()+"\r\n"); | |
| 471 | + content.append("o="+sipConfig.getId()+" 0 0 IN IP4 " + mediaServerItem.getSdpIp() + "\r\n"); | |
| 472 | 472 | content.append("s=Playback\r\n"); |
| 473 | 473 | content.append("u="+channelId+":0\r\n"); |
| 474 | 474 | content.append("c=IN IP4 "+mediaServerItem.getSdpIp()+"\r\n"); |
| ... | ... | @@ -532,7 +532,7 @@ public class SIPCommander implements ISIPCommander { |
| 532 | 532 | CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId() |
| 533 | 533 | : udpSipProvider.getNewCallId(); |
| 534 | 534 | |
| 535 | - Request request = headerProvider.createPlaybackInviteRequest(device, channelId, content.toString(), null, "fromplybck" + tm, null, callIdHeader); | |
| 535 | + Request request = headerProvider.createPlaybackInviteRequest(device, channelId, content.toString(), null, "fromplybck" + tm, null, callIdHeader, ssrcInfo.getSsrc()); | |
| 536 | 536 | |
| 537 | 537 | transmitRequest(device, request, errorEvent, okEvent -> { |
| 538 | 538 | Dialog dialog = okEvent.getClientTransaction().getDialog(); |
| ... | ... | @@ -575,7 +575,7 @@ public class SIPCommander implements ISIPCommander { |
| 575 | 575 | |
| 576 | 576 | StringBuffer content = new StringBuffer(200); |
| 577 | 577 | content.append("v=0\r\n"); |
| 578 | - content.append("o="+sipConfig.getId()+" 0 0 IN IP4 "+sipConfig.getIp()+"\r\n"); | |
| 578 | + content.append("o="+sipConfig.getId()+" 0 0 IN IP4 " + mediaServerItem.getSdpIp() + "\r\n"); | |
| 579 | 579 | content.append("s=Download\r\n"); |
| 580 | 580 | content.append("u="+channelId+":0\r\n"); |
| 581 | 581 | content.append("c=IN IP4 "+mediaServerItem.getSdpIp()+"\r\n"); |
| ... | ... | @@ -640,7 +640,7 @@ public class SIPCommander implements ISIPCommander { |
| 640 | 640 | CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId() |
| 641 | 641 | : udpSipProvider.getNewCallId(); |
| 642 | 642 | |
| 643 | - Request request = headerProvider.createPlaybackInviteRequest(device, channelId, content.toString(), null, "fromplybck" + tm, null, callIdHeader); | |
| 643 | + Request request = headerProvider.createPlaybackInviteRequest(device, channelId, content.toString(), null, "fromplybck" + tm, null, callIdHeader, ssrcInfo.getSsrc()); | |
| 644 | 644 | |
| 645 | 645 | ClientTransaction transaction = transmitRequest(device, request, errorEvent); |
| 646 | 646 | streamSession.put(device.getDeviceId(), channelId, ssrcInfo.getSsrc(), ssrcInfo.getStreamId(), mediaServerItem.getId(), transaction); | ... | ... |
src/main/java/com/genersoft/iot/vmp/service/IMediaServerService.java
| ... | ... | @@ -36,6 +36,8 @@ public interface IMediaServerService { |
| 36 | 36 | |
| 37 | 37 | SSRCInfo openRTPServer(MediaServerItem mediaServerItem, String streamId); |
| 38 | 38 | |
| 39 | + SSRCInfo openRTPServer(MediaServerItem mediaServerItem, String streamId, boolean isPlayback); | |
| 40 | + | |
| 39 | 41 | void closeRTPServer(Device device, String channelId); |
| 40 | 42 | |
| 41 | 43 | void clearRTPServer(MediaServerItem mediaServerItem); | ... | ... |
src/main/java/com/genersoft/iot/vmp/service/impl/MediaServerServiceImpl.java
| ... | ... | @@ -96,6 +96,11 @@ public class MediaServerServiceImpl implements IMediaServerService, CommandLineR |
| 96 | 96 | |
| 97 | 97 | @Override |
| 98 | 98 | public SSRCInfo openRTPServer(MediaServerItem mediaServerItem, String streamId) { |
| 99 | + return openRTPServer(mediaServerItem, streamId, false); | |
| 100 | + } | |
| 101 | + | |
| 102 | + @Override | |
| 103 | + public SSRCInfo openRTPServer(MediaServerItem mediaServerItem, String streamId, boolean isPlayback) { | |
| 99 | 104 | if (mediaServerItem == null || mediaServerItem.getId() == null) { |
| 100 | 105 | return null; |
| 101 | 106 | } |
| ... | ... | @@ -107,7 +112,13 @@ public class MediaServerServiceImpl implements IMediaServerService, CommandLineR |
| 107 | 112 | logger.info("media server [ {} ] ssrcConfig is null", mediaServerItem.getId()); |
| 108 | 113 | return null; |
| 109 | 114 | }else { |
| 110 | - String ssrc = ssrcConfig.getPlaySsrc(); | |
| 115 | + String ssrc = null; | |
| 116 | + if (isPlayback) { | |
| 117 | + ssrc = ssrcConfig.getPlayBackSsrc(); | |
| 118 | + }else { | |
| 119 | + ssrc = ssrcConfig.getPlaySsrc(); | |
| 120 | + } | |
| 121 | + | |
| 111 | 122 | if (streamId == null) { |
| 112 | 123 | streamId = String.format("%08x", Integer.parseInt(ssrc)).toUpperCase(); |
| 113 | 124 | } | ... | ... |
src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/playback/DownloadController.java
| ... | ... | @@ -103,7 +103,7 @@ public class DownloadController { |
| 103 | 103 | return result; |
| 104 | 104 | } |
| 105 | 105 | |
| 106 | - SSRCInfo ssrcInfo = mediaServerService.openRTPServer(newMediaServerItem, null); | |
| 106 | + SSRCInfo ssrcInfo = mediaServerService.openRTPServer(newMediaServerItem, null, true); | |
| 107 | 107 | |
| 108 | 108 | cmder.downloadStreamCmd(newMediaServerItem, ssrcInfo, device, channelId, startTime, endTime, downloadSpeed, (MediaServerItem mediaServerItem, JSONObject response) -> { |
| 109 | 109 | logger.info("收到订阅消息: " + response.toJSONString()); | ... | ... |
src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/playback/PlaybackController.java
| ... | ... | @@ -85,7 +85,7 @@ public class PlaybackController { |
| 85 | 85 | return result; |
| 86 | 86 | } |
| 87 | 87 | MediaServerItem newMediaServerItem = playService.getNewMediaServerItem(device); |
| 88 | - SSRCInfo ssrcInfo = mediaServerService.openRTPServer(newMediaServerItem, null); | |
| 88 | + SSRCInfo ssrcInfo = mediaServerService.openRTPServer(newMediaServerItem, null, true); | |
| 89 | 89 | |
| 90 | 90 | // 超时处理 |
| 91 | 91 | result.onTimeout(()->{ | ... | ... |
src/main/resources/wvpssl.jks
0 → 100644
No preview for this file type