Commit b55374c75a17c87b9ccb8d5c12abe188875af256
1 parent
3ec3b884
支持使用udp端口段来启用高性能udp
Showing
6 changed files
with
90 additions
and
8 deletions
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/SIPProcessorFactory.java
| @@ -93,7 +93,7 @@ public class SIPProcessorFactory { | @@ -93,7 +93,7 @@ public class SIPProcessorFactory { | ||
| 93 | public ISIPRequestProcessor createRequestProcessor(RequestEvent evt) { | 93 | public ISIPRequestProcessor createRequestProcessor(RequestEvent evt) { |
| 94 | Request request = evt.getRequest(); | 94 | Request request = evt.getRequest(); |
| 95 | String method = request.getMethod(); | 95 | String method = request.getMethod(); |
| 96 | - logger.info("接收到消息:"+request.getMethod()); | 96 | +// logger.info("接收到消息:"+request.getMethod()); |
| 97 | if (Request.INVITE.equals(method)) { | 97 | if (Request.INVITE.equals(method)) { |
| 98 | InviteRequestProcessor processor = new InviteRequestProcessor(); | 98 | InviteRequestProcessor processor = new InviteRequestProcessor(); |
| 99 | processor.setRequestEvent(evt); | 99 | processor.setRequestEvent(evt); |
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java
| @@ -19,6 +19,7 @@ import com.alibaba.fastjson.JSONObject; | @@ -19,6 +19,7 @@ import com.alibaba.fastjson.JSONObject; | ||
| 19 | import com.genersoft.iot.vmp.common.StreamInfo; | 19 | import com.genersoft.iot.vmp.common.StreamInfo; |
| 20 | import com.genersoft.iot.vmp.conf.MediaServerConfig; | 20 | import com.genersoft.iot.vmp.conf.MediaServerConfig; |
| 21 | import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel; | 21 | import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel; |
| 22 | +import com.genersoft.iot.vmp.media.zlm.ZLMUtils; | ||
| 22 | import com.genersoft.iot.vmp.storager.IVideoManagerStorager; | 23 | import com.genersoft.iot.vmp.storager.IVideoManagerStorager; |
| 23 | import org.springframework.beans.factory.annotation.Autowired; | 24 | import org.springframework.beans.factory.annotation.Autowired; |
| 24 | import org.springframework.beans.factory.annotation.Qualifier; | 25 | import org.springframework.beans.factory.annotation.Qualifier; |
| @@ -60,6 +61,13 @@ public class SIPCommander implements ISIPCommander { | @@ -60,6 +61,13 @@ public class SIPCommander implements ISIPCommander { | ||
| 60 | @Qualifier(value="udpSipProvider") | 61 | @Qualifier(value="udpSipProvider") |
| 61 | private SipProvider udpSipProvider; | 62 | private SipProvider udpSipProvider; |
| 62 | 63 | ||
| 64 | + @Autowired | ||
| 65 | + private ZLMUtils zlmUtils; | ||
| 66 | + | ||
| 67 | + @Value("${media.rtp.enable}") | ||
| 68 | + private boolean rtpEnable; | ||
| 69 | + | ||
| 70 | + | ||
| 63 | 71 | ||
| 64 | /** | 72 | /** |
| 65 | * 云台方向放控制,使用配置文件中的默认镜头移动速度 | 73 | * 云台方向放控制,使用配置文件中的默认镜头移动速度 |
| @@ -202,10 +210,17 @@ public class SIPCommander implements ISIPCommander { | @@ -202,10 +210,17 @@ public class SIPCommander implements ISIPCommander { | ||
| 202 | @Override | 210 | @Override |
| 203 | public StreamInfo playStreamCmd(Device device, String channelId) { | 211 | public StreamInfo playStreamCmd(Device device, String channelId) { |
| 204 | try { | 212 | try { |
| 205 | - | 213 | + |
| 206 | String ssrc = streamSession.createPlaySsrc(); | 214 | String ssrc = streamSession.createPlaySsrc(); |
| 207 | String transport = device.getTransport(); | 215 | String transport = device.getTransport(); |
| 208 | MediaServerConfig mediaInfo = storager.getMediaInfo(); | 216 | MediaServerConfig mediaInfo = storager.getMediaInfo(); |
| 217 | + String mediaPort = null; | ||
| 218 | + // 使用动态udp端口 | ||
| 219 | + if (rtpEnable) { | ||
| 220 | + mediaPort = zlmUtils.getNewRTPPort(ssrc) + ""; | ||
| 221 | + }else { | ||
| 222 | + mediaPort = mediaInfo.getRtpProxyPort(); | ||
| 223 | + } | ||
| 209 | // | 224 | // |
| 210 | StringBuffer content = new StringBuffer(200); | 225 | StringBuffer content = new StringBuffer(200); |
| 211 | content.append("v=0\r\n"); | 226 | content.append("v=0\r\n"); |
| @@ -214,10 +229,10 @@ public class SIPCommander implements ISIPCommander { | @@ -214,10 +229,10 @@ public class SIPCommander implements ISIPCommander { | ||
| 214 | content.append("c=IN IP4 "+mediaInfo.getLocalIP()+"\r\n"); | 229 | content.append("c=IN IP4 "+mediaInfo.getLocalIP()+"\r\n"); |
| 215 | content.append("t=0 0\r\n"); | 230 | content.append("t=0 0\r\n"); |
| 216 | if("TCP".equals(transport)) { | 231 | if("TCP".equals(transport)) { |
| 217 | - content.append("m=video "+mediaInfo.getRtpProxyPort()+" TCP/RTP/AVP 96 98 97\r\n"); | 232 | + content.append("m=video "+ mediaPort +" TCP/RTP/AVP 96 98 97\r\n"); |
| 218 | } | 233 | } |
| 219 | if("UDP".equals(transport)) { | 234 | if("UDP".equals(transport)) { |
| 220 | - content.append("m=video "+mediaInfo.getRtpProxyPort()+" RTP/AVP 96 98 97\r\n"); | 235 | + content.append("m=video "+ mediaPort +" RTP/AVP 96 98 97\r\n"); |
| 221 | } | 236 | } |
| 222 | content.append("a=recvonly\r\n"); | 237 | content.append("a=recvonly\r\n"); |
| 223 | content.append("a=rtpmap:96 PS/90000\r\n"); | 238 | content.append("a=rtpmap:96 PS/90000\r\n"); |
| @@ -575,4 +590,5 @@ public class SIPCommander implements ISIPCommander { | @@ -575,4 +590,5 @@ public class SIPCommander implements ISIPCommander { | ||
| 575 | return clientTransaction; | 590 | return clientTransaction; |
| 576 | } | 591 | } |
| 577 | 592 | ||
| 593 | + | ||
| 578 | } | 594 | } |
src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRESTfulUtils.java
| @@ -83,4 +83,8 @@ public class ZLMRESTfulUtils { | @@ -83,4 +83,8 @@ public class ZLMRESTfulUtils { | ||
| 83 | public JSONObject setServerConfig(Map<String, Object> param){ | 83 | public JSONObject setServerConfig(Map<String, Object> param){ |
| 84 | return sendPost("setServerConfig",param); | 84 | return sendPost("setServerConfig",param); |
| 85 | } | 85 | } |
| 86 | + | ||
| 87 | + public JSONObject openRtpServer(Map<String, Object> param){ | ||
| 88 | + return sendPost("openRtpServer",param); | ||
| 89 | + } | ||
| 86 | } | 90 | } |
src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMUtils.java
0 → 100644
| 1 | +package com.genersoft.iot.vmp.media.zlm; | ||
| 2 | + | ||
| 3 | +import com.alibaba.fastjson.JSONObject; | ||
| 4 | +import org.springframework.beans.factory.annotation.Autowired; | ||
| 5 | +import org.springframework.beans.factory.annotation.Value; | ||
| 6 | +import org.springframework.stereotype.Component; | ||
| 7 | + | ||
| 8 | +import java.util.HashMap; | ||
| 9 | +import java.util.Map; | ||
| 10 | + | ||
| 11 | +@Component | ||
| 12 | +public class ZLMUtils { | ||
| 13 | + | ||
| 14 | + @Value("${media.rtp.udpPortRange}") | ||
| 15 | + private String udpPortRange; | ||
| 16 | + | ||
| 17 | + @Autowired | ||
| 18 | + private ZLMRESTfulUtils zlmresTfulUtils; | ||
| 19 | + | ||
| 20 | + private int[] udpPortRangeArray = new int[2]; | ||
| 21 | + | ||
| 22 | + private int currentPort = 0; | ||
| 23 | + | ||
| 24 | + public int getNewRTPPort(String ssrc) { | ||
| 25 | + String streamId = String.format("%08x", Integer.parseInt(ssrc)).toUpperCase(); | ||
| 26 | + Map<String, Object> param = new HashMap<>(); | ||
| 27 | + int newPort = getPortFromUdpPortRange(); | ||
| 28 | + param.put("port", newPort); | ||
| 29 | + param.put("enable_tcp", 0); | ||
| 30 | + param.put("stream_id", streamId); | ||
| 31 | + JSONObject jsonObject = zlmresTfulUtils.openRtpServer(param); | ||
| 32 | + if (jsonObject.getInteger("code") == 0) { | ||
| 33 | + System.out.println(11111111); | ||
| 34 | + System.out.println(streamId); | ||
| 35 | + System.out.println(ssrc); | ||
| 36 | + System.out.println(newPort); | ||
| 37 | + System.out.println(jsonObject.toJSONString()); | ||
| 38 | + return newPort; | ||
| 39 | + }else { | ||
| 40 | + return getNewRTPPort(streamId); | ||
| 41 | + } | ||
| 42 | + } | ||
| 43 | + | ||
| 44 | + private int getPortFromUdpPortRange() { | ||
| 45 | + if (currentPort == 0) { | ||
| 46 | + String[] udpPortRangeStrArray = udpPortRange.split(","); | ||
| 47 | + udpPortRangeArray[0] = Integer.parseInt(udpPortRangeStrArray[0]); | ||
| 48 | + udpPortRangeArray[1] = Integer.parseInt(udpPortRangeStrArray[1]); | ||
| 49 | + } | ||
| 50 | + | ||
| 51 | + if (currentPort == 0 || currentPort ++ > udpPortRangeArray[1]) { | ||
| 52 | + currentPort = udpPortRangeArray[0]; | ||
| 53 | + return udpPortRangeArray[0]; | ||
| 54 | + }else { | ||
| 55 | + return currentPort ++; | ||
| 56 | + } | ||
| 57 | + } | ||
| 58 | +} |
src/main/java/com/genersoft/iot/vmp/vmanager/play/PlayController.java
| @@ -7,6 +7,7 @@ import com.genersoft.iot.vmp.media.zlm.ZLMRESTfulUtils; | @@ -7,6 +7,7 @@ import com.genersoft.iot.vmp.media.zlm.ZLMRESTfulUtils; | ||
| 7 | import org.slf4j.Logger; | 7 | import org.slf4j.Logger; |
| 8 | import org.slf4j.LoggerFactory; | 8 | import org.slf4j.LoggerFactory; |
| 9 | import org.springframework.beans.factory.annotation.Autowired; | 9 | import org.springframework.beans.factory.annotation.Autowired; |
| 10 | +import org.springframework.beans.factory.annotation.Value; | ||
| 10 | import org.springframework.http.HttpStatus; | 11 | import org.springframework.http.HttpStatus; |
| 11 | import org.springframework.http.ResponseEntity; | 12 | import org.springframework.http.ResponseEntity; |
| 12 | import org.springframework.web.bind.annotation.CrossOrigin; | 13 | import org.springframework.web.bind.annotation.CrossOrigin; |
| @@ -69,8 +70,8 @@ public class PlayController { | @@ -69,8 +70,8 @@ public class PlayController { | ||
| 69 | return new ResponseEntity<String>("timeout",HttpStatus.OK); | 70 | return new ResponseEntity<String>("timeout",HttpStatus.OK); |
| 70 | }else { | 71 | }else { |
| 71 | JSONObject rtpInfo = zlmresTfulUtils.getRtpInfo(streamId); | 72 | JSONObject rtpInfo = zlmresTfulUtils.getRtpInfo(streamId); |
| 72 | - Boolean exist = rtpInfo.getBoolean("exist"); | ||
| 73 | - if (rtpInfo == null || !rtpInfo.getBoolean("exist") || streamInfo.getFlv() != null){ | 73 | + if (rtpInfo == null || !rtpInfo.getBoolean("exist") || storager.queryPlayByDevice(deviceId, channelId).getFlv() == null){ |
| 74 | + Thread.sleep(2000); | ||
| 74 | continue; | 75 | continue; |
| 75 | }else { | 76 | }else { |
| 76 | lockFlag = false; | 77 | lockFlag = false; |
| @@ -91,7 +92,6 @@ public class PlayController { | @@ -91,7 +92,6 @@ public class PlayController { | ||
| 91 | } | 92 | } |
| 92 | }; | 93 | }; |
| 93 | } | 94 | } |
| 94 | - Thread.sleep(200); | ||
| 95 | streamInfo = storager.queryPlayByDevice(deviceId, channelId); | 95 | streamInfo = storager.queryPlayByDevice(deviceId, channelId); |
| 96 | } catch (InterruptedException e) { | 96 | } catch (InterruptedException e) { |
| 97 | e.printStackTrace(); | 97 | e.printStackTrace(); |
src/main/resources/application.yml
| @@ -43,5 +43,9 @@ media: #zlm服务器的ip与http端口, 重点: 这是http端口 | @@ -43,5 +43,9 @@ media: #zlm服务器的ip与http端口, 重点: 这是http端口 | ||
| 43 | ip: 192.168.1.20 | 43 | ip: 192.168.1.20 |
| 44 | port: 9080 | 44 | port: 9080 |
| 45 | secret: 035c73f7-bb6b-4889-a715-d9eb2d1925cc | 45 | secret: 035c73f7-bb6b-4889-a715-d9eb2d1925cc |
| 46 | - streamNoneReaderDelayMS: 1800000 # 无人观看多久关闭流 | 46 | + streamNoneReaderDelayMS: 1800000 # 无人观看多久自动关闭流 |
| 47 | + rtp: # 启用udp多端口模式 | ||
| 48 | + enable: false | ||
| 49 | + udpPortRange: 30000,300500 # 端口范围 | ||
| 50 | + | ||
| 47 | 51 |