From 805fa42a2c010d92b1c8fc29a60d32fd99fb4ea3 Mon Sep 17 00:00:00 2001
From: songww <songww@inspur.com>
Date: 星期四, 14 五月 2020 14:19:42 +0800
Subject: [PATCH] 修复回放、停止预览bug,增加ZLM hook监听,长时间无人观看,停止摄像头推流。需开启ZLM的hook并配置url
---
src/main/java/com/genersoft/iot/vmp/gb28181/session/SsrcUtil.java | 2
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/SIPRequestHeaderProvider.java | 90 ++++++------
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java | 21 +-
src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java | 211 +++++++++++++++++++++++------
src/main/java/com/genersoft/iot/vmp/gb28181/utils/DateUtil.java | 2
pom.xml | 1
src/main/java/com/genersoft/iot/vmp/vmanager/playback/PlaybackController.java | 36 ++++
7 files changed, 257 insertions(+), 106 deletions(-)
diff --git a/pom.xml b/pom.xml
index 88b1f90..0788992 100644
--- a/pom.xml
+++ b/pom.xml
@@ -123,7 +123,6 @@
<groupId>javax.sip</groupId>
<artifactId>jain-sip-ri</artifactId>
<version>1.3.0-91</version>
- <scope>provided</scope>
</dependency>
<dependency>
<groupId>org.dom4j</groupId>
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/session/SsrcUtil.java b/src/main/java/com/genersoft/iot/vmp/gb28181/session/SsrcUtil.java
index 9e887da..d524fb0 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/session/SsrcUtil.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/session/SsrcUtil.java
@@ -22,7 +22,7 @@
private static void init() {
SipConfig sipConfig = (SipConfig) SpringBeanFactory.getBean("sipConfig");
- ssrcPrefix = sipConfig.getSipDomain().substring(4, 9);
+ ssrcPrefix = sipConfig.getSipDomain().substring(3, 8);
isUsed = new ArrayList<String>();
notUsed = new ArrayList<String>();
for (int i = 1; i < 10000; i++) {
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/SIPRequestHeaderProvider.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/SIPRequestHeaderProvider.java
index b4eb4d2..c15b9b6 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/SIPRequestHeaderProvider.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/SIPRequestHeaderProvider.java
@@ -24,7 +24,7 @@
import com.genersoft.iot.vmp.gb28181.bean.Host;
/**
- * @Description:TODO(杩欓噷鐢ㄤ竴鍙ヨ瘽鎻忚堪杩欎釜绫荤殑浣滅敤)
+ * @Description:鎽勫儚澶村懡浠equest鍒涢�犲櫒 TODO 鍐椾綑浠g爜澶寰呬紭鍖�
* @author: songww
* @date: 2020骞�5鏈�6鏃� 涓婂崍9:29:02
*/
@@ -72,50 +72,50 @@
return request;
}
-// public Request createInviteRequest(Device device, String content, String viaTag, String fromTag, String toTag) throws ParseException, InvalidArgumentException {
-// Request request = null;
-// Host host = device.getHost();
-// //璇锋眰琛�
-// SipURI requestLine = layer.getAddressFactory().createSipURI(device.getDeviceId(), host.getAddress());
-// //via
-// ArrayList<ViaHeader> viaHeaders = new ArrayList<ViaHeader>();
-// ViaHeader viaHeader = layer.getHeaderFactory().createViaHeader(sipConfig.getSipIp(), sipConfig.getSipPort(), device.getTransport(), viaTag);
-// viaHeader.setRPort();
-// viaHeaders.add(viaHeader);
-// //from
-// SipURI fromSipURI = layer.getAddressFactory().createSipURI(device.getDeviceId(),sipConfig.getSipIp()+":"+sipConfig.getSipPort());
-// Address fromAddress = layer.getAddressFactory().createAddress(fromSipURI);
-// FromHeader fromHeader = layer.getHeaderFactory().createFromHeader(fromAddress, fromTag); //蹇呴』瑕佹湁鏍囪锛屽惁鍒欐棤娉曞垱寤轰細璇濓紝鏃犳硶鍥炲簲ack
-// //to
-// SipURI toSipURI = layer.getAddressFactory().createSipURI(device.getDeviceId(),host.getAddress());
-// Address toAddress = layer.getAddressFactory().createAddress(toSipURI);
-// ToHeader toHeader = layer.getHeaderFactory().createToHeader(toAddress,null);
-//
-// //callid
-// CallIdHeader callIdHeader = null;
-// if(device.getTransport().equals("TCP")) {
-// callIdHeader = layer.getTcpSipProvider().getNewCallId();
-// }
-// if(device.getTransport().equals("UDP")) {
-// callIdHeader = layer.getUdpSipProvider().getNewCallId();
-// }
-//
-// //Forwards
-// MaxForwardsHeader maxForwards = layer.getHeaderFactory().createMaxForwardsHeader(70);
-//
-// //ceq
-// CSeqHeader cSeqHeader = layer.getHeaderFactory().createCSeqHeader(1L, Request.INVITE);
-// request = layer.getMessageFactory().createRequest(requestLine, Request.INVITE, callIdHeader, cSeqHeader,fromHeader, toHeader, viaHeaders, maxForwards);
-//
-// Address concatAddress = layer.getAddressFactory().createAddress(layer.getAddressFactory().createSipURI(sipConfig.getSipId(), sipConfig.getSipIp()+":"+sipConfig.getSipPort()));
-// request.addHeader(layer.getHeaderFactory().createContactHeader(concatAddress));
-//
-// ContentTypeHeader contentTypeHeader = layer.getHeaderFactory().createContentTypeHeader("Application", "SDP");
-// request.setContent(content, contentTypeHeader);
-// return request;
-// }
+ public Request createInviteRequest(Device device, String channelId, String content, String viaTag, String fromTag, String toTag) throws ParseException, InvalidArgumentException {
+ Request request = null;
+ Host host = device.getHost();
+ //璇锋眰琛�
+ SipURI requestLine = layer.getAddressFactory().createSipURI(channelId, host.getAddress());
+ //via
+ ArrayList<ViaHeader> viaHeaders = new ArrayList<ViaHeader>();
+ ViaHeader viaHeader = layer.getHeaderFactory().createViaHeader(sipConfig.getSipIp(), sipConfig.getSipPort(), device.getTransport(), viaTag);
+ viaHeader.setRPort();
+ viaHeaders.add(viaHeader);
+ //from
+ SipURI fromSipURI = layer.getAddressFactory().createSipURI(sipConfig.getSipId(),sipConfig.getSipDomain());
+ Address fromAddress = layer.getAddressFactory().createAddress(fromSipURI);
+ FromHeader fromHeader = layer.getHeaderFactory().createFromHeader(fromAddress, fromTag); //蹇呴』瑕佹湁鏍囪锛屽惁鍒欐棤娉曞垱寤轰細璇濓紝鏃犳硶鍥炲簲ack
+ //to
+ SipURI toSipURI = layer.getAddressFactory().createSipURI(channelId,sipConfig.getSipDomain());
+ Address toAddress = layer.getAddressFactory().createAddress(toSipURI);
+ ToHeader toHeader = layer.getHeaderFactory().createToHeader(toAddress,null);
+
+ //callid
+ CallIdHeader callIdHeader = null;
+ if(device.getTransport().equals("TCP")) {
+ callIdHeader = layer.getTcpSipProvider().getNewCallId();
+ }
+ if(device.getTransport().equals("UDP")) {
+ callIdHeader = layer.getUdpSipProvider().getNewCallId();
+ }
+
+ //Forwards
+ MaxForwardsHeader maxForwards = layer.getHeaderFactory().createMaxForwardsHeader(70);
+
+ //ceq
+ CSeqHeader cSeqHeader = layer.getHeaderFactory().createCSeqHeader(1L, Request.INVITE);
+ request = layer.getMessageFactory().createRequest(requestLine, Request.INVITE, callIdHeader, cSeqHeader,fromHeader, toHeader, viaHeaders, maxForwards);
+
+ Address concatAddress = layer.getAddressFactory().createAddress(layer.getAddressFactory().createSipURI(sipConfig.getSipId(), sipConfig.getSipIp()+":"+sipConfig.getSipPort()));
+ request.addHeader(layer.getHeaderFactory().createContactHeader(concatAddress));
+
+ ContentTypeHeader contentTypeHeader = layer.getHeaderFactory().createContentTypeHeader("Application", "SDP");
+ request.setContent(content, contentTypeHeader);
+ return request;
+ }
- public Request createInviteRequest(Device device, String content, String viaTag, String fromTag, String toTag) throws ParseException, InvalidArgumentException {
+ public Request createPlaybackInviteRequest(Device device, String channelId, String content, String viaTag, String fromTag, String toTag) throws ParseException, InvalidArgumentException {
Request request = null;
Host host = device.getHost();
//璇锋眰琛�
@@ -130,7 +130,7 @@
Address fromAddress = layer.getAddressFactory().createAddress(fromSipURI);
FromHeader fromHeader = layer.getHeaderFactory().createFromHeader(fromAddress, fromTag); //蹇呴』瑕佹湁鏍囪锛屽惁鍒欐棤娉曞垱寤轰細璇濓紝鏃犳硶鍥炲簲ack
//to
- SipURI toSipURI = layer.getAddressFactory().createSipURI(device.getDeviceId(),sipConfig.getSipDomain());
+ SipURI toSipURI = layer.getAddressFactory().createSipURI(channelId,sipConfig.getSipDomain());
Address toAddress = layer.getAddressFactory().createAddress(toSipURI);
ToHeader toHeader = layer.getHeaderFactory().createToHeader(toAddress,null);
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java
index 6213d7d..82dcee8 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java
@@ -142,30 +142,31 @@
try {
String ssrc = streamSession.createPlaySsrc();
+ String transport = device.getTransport();
//
StringBuffer content = new StringBuffer(200);
content.append("v=0\r\n");
- content.append("o="+channelId+" 0 0 IN IP4 "+sipConfig.getMediaIp()+"\r\n");
+ content.append("o="+channelId+" 0 0 IN IP4 "+sipConfig.getSipIp()+"\r\n");
content.append("s=Play\r\n");
content.append("c=IN IP4 "+sipConfig.getMediaIp()+"\r\n");
content.append("t=0 0\r\n");
- if(device.getTransport().equals("TCP")) {
+ if("TCP".equals(transport)) {
content.append("m=video "+sipConfig.getMediaPort()+" TCP/RTP/AVP 96 98 97\r\n");
}
- if(device.getTransport().equals("UDP")) {
+ if("UDP".equals(transport)) {
content.append("m=video "+sipConfig.getMediaPort()+" RTP/AVP 96 98 97\r\n");
}
- content.append("a=sendrecv\r\n");
+ content.append("a=recvonly\r\n");
content.append("a=rtpmap:96 PS/90000\r\n");
content.append("a=rtpmap:98 H264/90000\r\n");
content.append("a=rtpmap:97 MPEG4/90000\r\n");
- if(device.getTransport().equals("TCP")){
+ if("TCP".equals(transport)){
content.append("a=setup:passive\r\n");
content.append("a=connection:new\r\n");
}
content.append("y="+ssrc+"\r\n");//ssrc
- Request request = headerProvider.createInviteRequest(device, content.toString(), null, "live", null);
+ Request request = headerProvider.createInviteRequest(device, channelId, content.toString(), null, "live", null);
ClientTransaction transaction = transmitRequest(device, request);
streamSession.put(ssrc, transaction);
@@ -192,9 +193,9 @@
//
StringBuffer content = new StringBuffer(200);
content.append("v=0\r\n");
- content.append("o="+device.getDeviceId()+" 0 0 IN IP4 "+sipConfig.getMediaIp()+"\r\n");
+ content.append("o="+sipConfig.getSipId()+" 0 0 IN IP4 "+sipConfig.getSipIp()+"\r\n");
content.append("s=Playback\r\n");
- content.append("u="+channelId+":3\r\n");
+ content.append("u="+channelId+":0\r\n");
content.append("c=IN IP4 "+sipConfig.getMediaIp()+"\r\n");
content.append("t="+DateUtil.yyyy_MM_dd_HH_mm_ssToTimestamp(startTime)+" "+DateUtil.yyyy_MM_dd_HH_mm_ssToTimestamp(endTime) +"\r\n");
if(device.getTransport().equals("TCP")) {
@@ -213,7 +214,7 @@
}
content.append("y="+ssrc+"\r\n");//ssrc
- Request request = headerProvider.createInviteRequest(device, content.toString(), null, "live", null);
+ Request request = headerProvider.createPlaybackInviteRequest(device, channelId, content.toString(), null, "playback", null);
ClientTransaction transaction = transmitRequest(device, request);
streamSession.put(ssrc, transaction);
@@ -245,7 +246,7 @@
}
Request byeRequest = dialog.createRequest(Request.BYE);
ViaHeader viaHeader = (ViaHeader) byeRequest.getHeader(ViaHeader.NAME);
- String protocol = viaHeader.getTransport();
+ String protocol = viaHeader.getTransport().toUpperCase();
ClientTransaction clientTransaction = null;
if("TCP".equals(protocol)) {
clientTransaction = sipLayer.getTcpSipProvider().getNewClientTransaction(byeRequest);
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/utils/DateUtil.java b/src/main/java/com/genersoft/iot/vmp/gb28181/utils/DateUtil.java
index 5950d17..fb22948 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/utils/DateUtil.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/utils/DateUtil.java
@@ -46,7 +46,7 @@
Date date;
try {
date = format.parse(formatTime);
- Long timestamp=date.getTime();
+ Long timestamp=date.getTime()/1000;
//杞崲涓篋ate绫�
return timestamp;
} catch (ParseException e) {
diff --git a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java
index 0ea162e..e4be40b 100644
--- a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java
+++ b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java
@@ -1,11 +1,20 @@
package com.genersoft.iot.vmp.media.zlm;
+import java.math.BigInteger;
+
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
+
+import com.alibaba.fastjson.JSONObject;
+import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander;
/**
* @Description:閽堝 ZLMediaServer鐨刪ook浜嬩欢鐩戝惉
@@ -18,135 +27,247 @@
private final static Logger logger = LoggerFactory.getLogger(ZLMHttpHookListener.class);
+ @Autowired
+ private SIPCommander cmder;
+
/**
* 娴侀噺缁熻浜嬩欢锛屾挱鏀惧櫒鎴栨帹娴佸櫒鏂紑鏃跺苟涓旇�楃敤娴侀噺瓒呰繃鐗瑰畾闃堝�兼椂浼氳Е鍙戞浜嬩欢锛岄槇鍊奸�氳繃閰嶇疆鏂囦欢general.flowThreshold閰嶇疆锛涙浜嬩欢瀵瑰洖澶嶄笉鏁忔劅銆�
*
*/
- @PostMapping("/on_flow_report")
- public ResponseEntity onFlowReport(){
+ @ResponseBody
+ @PostMapping(value = "/on_flow_report", produces = "application/json;charset=UTF-8")
+ public ResponseEntity<String> onFlowReport(@RequestBody JSONObject json){
+
+ if (logger.isDebugEnabled()) {
+ logger.debug("ZLM HOOK on_flow_report API璋冪敤锛屽弬鏁帮細" + json.toString());
+ }
// TODO Auto-generated method stub
- return null;
+
+ JSONObject ret = new JSONObject();
+ json.put("code", 0);
+ json.put("msg", "success");
+ return new ResponseEntity<String>(ret.toString(),HttpStatus.OK);
}
/**
* 璁块棶http鏂囦欢鏈嶅姟鍣ㄤ笂hls涔嬪鐨勬枃浠舵椂瑙﹀彂銆�
*
*/
- @PostMapping("/on_http_access")
- public ResponseEntity onHttpAccess(){
+ @ResponseBody
+ @PostMapping(value = "/on_http_access", produces = "application/json;charset=UTF-8")
+ public ResponseEntity<String> onHttpAccess(@RequestBody JSONObject json){
+
+ if (logger.isDebugEnabled()) {
+ logger.debug("ZLM HOOK on_http_access API 璋冪敤锛屽弬鏁帮細" + json.toString());
+ }
// TODO Auto-generated method stub
- return null;
+ JSONObject ret = new JSONObject();
+ json.put("code", 0);
+ json.put("err", "");
+ json.put("path", "");
+ json.put("second", 600);
+ return new ResponseEntity<String>(ret.toString(),HttpStatus.OK);
}
/**
* 鎾斁鍣ㄩ壌鏉冧簨浠讹紝rtsp/rtmp/http-flv/ws-flv/hls鐨勬挱鏀鹃兘灏嗚Е鍙戞閴存潈浜嬩欢銆�
*
*/
- @PostMapping("/on_play")
- public ResponseEntity onPlay(){
+ @ResponseBody
+ @PostMapping(value = "/on_play", produces = "application/json;charset=UTF-8")
+ public ResponseEntity<String> onPlay(@RequestBody JSONObject json){
+
+ if (logger.isDebugEnabled()) {
+ logger.debug("ZLM HOOK on_play API璋冪敤锛屽弬鏁帮細" + json.toString());
+ }
// TODO Auto-generated method stub
- return null;
+ JSONObject ret = new JSONObject();
+ json.put("code", 0);
+ json.put("msg", "success");
+ return new ResponseEntity<String>(ret.toString(),HttpStatus.OK);
}
/**
* rtsp/rtmp/rtp鎺ㄦ祦閴存潈浜嬩欢銆�
*
*/
- @PostMapping("/on_publish")
- public ResponseEntity onPublish(){
+ @ResponseBody
+ @PostMapping(value = "/on_publish", produces = "application/json;charset=UTF-8")
+ public ResponseEntity<String> onPublish(@RequestBody JSONObject json){
+
+ if (logger.isDebugEnabled()) {
+ logger.debug("ZLM HOOK on_publish API璋冪敤锛屽弬鏁帮細" + json.toString());
+ }
// TODO Auto-generated method stub
- return null;
+ JSONObject ret = new JSONObject();
+ json.put("code", 0);
+ json.put("msg", "success");
+ json.put("enableHls", true);
+ json.put("enableMP4", false);
+ json.put("enableRtxp", true);
+ return new ResponseEntity<String>(ret.toString(),HttpStatus.OK);
}
/**
* 褰曞埗mp4瀹屾垚鍚庨�氱煡浜嬩欢锛涙浜嬩欢瀵瑰洖澶嶄笉鏁忔劅銆�
*
*/
- @PostMapping("/on_record_mp4")
- public ResponseEntity onRecordMp4(){
+ @ResponseBody
+ @PostMapping(value = "/on_record_mp4", produces = "application/json;charset=UTF-8")
+ public ResponseEntity<String> onRecordMp4(@RequestBody JSONObject json){
+
+ if (logger.isDebugEnabled()) {
+ logger.debug("ZLM HOOK on_record_mp4 API璋冪敤锛屽弬鏁帮細" + json.toString());
+ }
// TODO Auto-generated method stub
- return null;
- }
-
- /**
- * 璇tsp娴佹槸鍚﹀紑鍚痳tsp涓撶敤鏂瑰紡鐨勯壌鏉冧簨浠讹紝寮�鍚悗鎵嶄細瑙﹀彂on_rtsp_auth浜嬩欢銆傞渶瑕佹寚鍑虹殑鏄痳tsp涔熸敮鎸乽rl鍙傛暟閴存潈锛屽畠鏀寔涓ょ鏂瑰紡閴存潈銆�
- *
- */
- @PostMapping("/on_rtsp_auth")
- public ResponseEntity onRtspAuth(){
- // TODO Auto-generated method stub
-
- return null;
+ JSONObject ret = new JSONObject();
+ json.put("code", 0);
+ json.put("msg", "success");
+ return new ResponseEntity<String>(ret.toString(),HttpStatus.OK);
}
/**
* rtsp涓撶敤鐨勯壌鏉冧簨浠讹紝鍏堣Е鍙憃n_rtsp_realm浜嬩欢鐒跺悗鎵嶄細瑙﹀彂on_rtsp_auth浜嬩欢銆�
*
*/
- @PostMapping("/on_rtsp_realm")
- public ResponseEntity onRtspRealm(){
+ @ResponseBody
+ @PostMapping(value = "/on_rtsp_realm", produces = "application/json;charset=UTF-8")
+ public ResponseEntity<String> onRtspRealm(@RequestBody JSONObject json){
+
+ if (logger.isDebugEnabled()) {
+ logger.debug("ZLM HOOK on_rtsp_realm API璋冪敤锛屽弬鏁帮細" + json.toString());
+ }
// TODO Auto-generated method stub
- return null;
+ JSONObject ret = new JSONObject();
+ json.put("code", 0);
+ json.put("realm", "");
+ return new ResponseEntity<String>(ret.toString(),HttpStatus.OK);
+ }
+
+
+ /**
+ * 璇tsp娴佹槸鍚﹀紑鍚痳tsp涓撶敤鏂瑰紡鐨勯壌鏉冧簨浠讹紝寮�鍚悗鎵嶄細瑙﹀彂on_rtsp_auth浜嬩欢銆傞渶瑕佹寚鍑虹殑鏄痳tsp涔熸敮鎸乽rl鍙傛暟閴存潈锛屽畠鏀寔涓ょ鏂瑰紡閴存潈銆�
+ *
+ */
+ @ResponseBody
+ @PostMapping(value = "/on_rtsp_auth", produces = "application/json;charset=UTF-8")
+ public ResponseEntity<String> onRtspAuth(@RequestBody JSONObject json){
+
+ if (logger.isDebugEnabled()) {
+ logger.debug("ZLM HOOK on_rtsp_auth API璋冪敤锛屽弬鏁帮細" + json.toString());
+ }
+ // TODO Auto-generated method stub
+
+ JSONObject ret = new JSONObject();
+ json.put("code", 0);
+ json.put("encrypted", false);
+ json.put("passwd", "test");
+ return new ResponseEntity<String>(ret.toString(),HttpStatus.OK);
}
/**
* shell鐧诲綍閴存潈锛孼LMediaKit鎻愪緵绠�鍗曠殑telnet璋冭瘯鏂瑰紡锛屼娇鐢╰elnet 127.0.0.1 9000鑳借繘鍏ediaServer杩涚▼鐨剆hell鐣岄潰銆�
*
*/
- @PostMapping("/on_shell_login")
- public ResponseEntity onShellLogin(){
+ @ResponseBody
+ @PostMapping(value = "/on_shell_login", produces = "application/json;charset=UTF-8")
+ public ResponseEntity<String> onShellLogin(@RequestBody JSONObject json){
+
+ if (logger.isDebugEnabled()) {
+ logger.debug("ZLM HOOK on_shell_login API璋冪敤锛屽弬鏁帮細" + json.toString());
+ }
// TODO Auto-generated method stub
- return null;
+ JSONObject ret = new JSONObject();
+ json.put("code", 0);
+ json.put("msg", "success");
+ return new ResponseEntity<String>(ret.toString(),HttpStatus.OK);
}
/**
* rtsp/rtmp娴佹敞鍐屾垨娉ㄩ攢鏃惰Е鍙戞浜嬩欢锛涙浜嬩欢瀵瑰洖澶嶄笉鏁忔劅銆�
*
*/
- @PostMapping("/on_stream_changed")
- public ResponseEntity onStreamChanged(){
+ @ResponseBody
+ @PostMapping(value = "/on_stream_changed", produces = "application/json;charset=UTF-8")
+ public ResponseEntity<String> onStreamChanged(@RequestBody JSONObject json){
+
+ if (logger.isDebugEnabled()) {
+ logger.debug("ZLM HOOK on_stream_changed API璋冪敤锛屽弬鏁帮細" + json.toString());
+ }
// TODO Auto-generated method stub
- return null;
+ JSONObject ret = new JSONObject();
+ json.put("code", 0);
+ json.put("msg", "success");
+ return new ResponseEntity<String>(ret.toString(),HttpStatus.OK);
}
/**
* 娴佹棤浜鸿鐪嬫椂浜嬩欢锛岀敤鎴峰彲浠ラ�氳繃姝や簨浠堕�夋嫨鏄惁鍏抽棴鏃犱汉鐪嬬殑娴併��
*
*/
- @PostMapping("/on_stream_none_reader")
- public ResponseEntity onStreamNoneReader(){
- // TODO Auto-generated method stub
+ @ResponseBody
+ @PostMapping(value = "/on_stream_none_reader", produces = "application/json;charset=UTF-8")
+ public ResponseEntity<String> onStreamNoneReader(@RequestBody JSONObject json){
- return null;
+ if (logger.isDebugEnabled()) {
+ logger.debug("ZLM HOOK on_stream_none_reader API璋冪敤锛屽弬鏁帮細" + json.toString());
+ }
+
+ BigInteger bigint=new BigInteger(json.getString("stream"), 16);
+ int numb=bigint.intValue();
+ String ssrc = String.format("%010d", numb);
+
+ cmder.streamByeCmd(ssrc);
+
+ JSONObject ret = new JSONObject();
+ json.put("code", 0);
+ json.put("close", true);
+ return new ResponseEntity<String>(ret.toString(),HttpStatus.OK);
}
/**
* 娴佹湭鎵惧埌浜嬩欢锛岀敤鎴峰彲浠ュ湪姝や簨浠惰Е鍙戞椂锛岀珛鍗冲幓鎷夋祦锛岃繖鏍峰彲浠ュ疄鐜版寜闇�鎷夋祦锛涙浜嬩欢瀵瑰洖澶嶄笉鏁忔劅銆�
*
*/
- @PostMapping("/on_stream_not_found")
- public ResponseEntity onStreamNotFound(){
+ @ResponseBody
+ @PostMapping(value = "/on_stream_not_found", produces = "application/json;charset=UTF-8")
+ public ResponseEntity<String> onStreamNotFound(@RequestBody JSONObject json){
+
+ if (logger.isDebugEnabled()) {
+ logger.debug("ZLM HOOK on_stream_not_found API璋冪敤锛屽弬鏁帮細" + json.toString());
+ }
// TODO Auto-generated method stub
- return null;
+ JSONObject ret = new JSONObject();
+ json.put("code", 0);
+ json.put("msg", "success");
+ return new ResponseEntity<String>(ret.toString(),HttpStatus.OK);
}
/**
* 鏈嶅姟鍣ㄥ惎鍔ㄤ簨浠讹紝鍙互鐢ㄤ簬鐩戝惉鏈嶅姟鍣ㄥ穿婧冮噸鍚紱姝や簨浠跺鍥炲涓嶆晱鎰熴��
*
*/
- @PostMapping("/on_server_started")
- public ResponseEntity onServerStarted(){
+ @ResponseBody
+ @PostMapping(value = "/on_server_started", produces = "application/json;charset=UTF-8")
+ public ResponseEntity<String> onServerStarted(@RequestBody JSONObject json){
+
+ if (logger.isDebugEnabled()) {
+ logger.debug("ZLM HOOK on_server_started API璋冪敤锛屽弬鏁帮細" + json.toString());
+ }
// TODO Auto-generated method stub
- return null;
+ JSONObject ret = new JSONObject();
+ json.put("code", 0);
+ json.put("msg", "success");
+ return new ResponseEntity<String>(ret.toString(),HttpStatus.OK);
}
}
diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/playback/PlaybackController.java b/src/main/java/com/genersoft/iot/vmp/vmanager/playback/PlaybackController.java
index 20078a7..2042e8d 100644
--- a/src/main/java/com/genersoft/iot/vmp/vmanager/playback/PlaybackController.java
+++ b/src/main/java/com/genersoft/iot/vmp/vmanager/playback/PlaybackController.java
@@ -5,8 +5,10 @@
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
+import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@@ -30,12 +32,21 @@
@GetMapping("/playback/{deviceId}/{channelId}")
public ResponseEntity<String> play(@PathVariable String deviceId,@PathVariable String channelId, String startTime, String endTime){
+ if (logger.isDebugEnabled()) {
+ logger.debug(String.format("璁惧鍥炴斁 API璋冪敤锛宒eviceId锛�%s 锛宑hannelId锛�%s",deviceId, channelId));
+ }
+
+ if (StringUtils.isEmpty(deviceId) || StringUtils.isEmpty(channelId)) {
+ String log = String.format("璁惧鍥炴斁 API璋冪敤澶辫触锛宒eviceId锛�%s 锛宑hannelId锛�%s",deviceId, channelId);
+ logger.warn(log);
+ return new ResponseEntity<String>(log,HttpStatus.BAD_REQUEST);
+ }
+
Device device = storager.queryVideoDevice(deviceId);
String ssrc = cmder.playbackStreamCmd(device, channelId, startTime, endTime);
if (logger.isDebugEnabled()) {
- logger.debug(String.format("璁惧棰勮 API璋冪敤锛宒eviceId锛�%s 锛宑hannelId锛�%s",deviceId, channelId));
- logger.debug("璁惧棰勮 API璋冪敤锛宻src锛�"+ssrc+",ZLMedia streamId:"+Integer.toHexString(Integer.parseInt(ssrc)));
+ logger.debug("璁惧鍥炴斁 API璋冪敤锛宻src锛�"+ssrc+",ZLMedia streamId:"+Integer.toHexString(Integer.parseInt(ssrc)));
}
if(ssrc!=null) {
@@ -43,7 +54,26 @@
json.put("ssrc", ssrc);
return new ResponseEntity<String>(json.toString(),HttpStatus.OK);
} else {
- logger.warn("璁惧棰勮API璋冪敤澶辫触锛�");
+ logger.warn("璁惧鍥炴斁API璋冪敤澶辫触锛�");
+ return new ResponseEntity<String>(HttpStatus.INTERNAL_SERVER_ERROR);
+ }
+ }
+
+ @PostMapping("/playback/{ssrc}/stop")
+ public ResponseEntity<String> playStop(@PathVariable String ssrc){
+
+ cmder.streamByeCmd(ssrc);
+
+ if (logger.isDebugEnabled()) {
+ logger.debug(String.format("璁惧褰曞儚鍥炴斁鍋滄 API璋冪敤锛宻src锛�%s", ssrc));
+ }
+
+ if(ssrc!=null) {
+ JSONObject json = new JSONObject();
+ json.put("ssrc", ssrc);
+ return new ResponseEntity<String>(json.toString(),HttpStatus.OK);
+ } else {
+ logger.warn("璁惧褰曞儚鍥炴斁鍋滄API璋冪敤澶辫触锛�");
return new ResponseEntity<String>(HttpStatus.INTERNAL_SERVER_ERROR);
}
}
--
Gitblit v1.8.0