From 000bbad21ea45ba742561976f95c4b80b812fc33 Mon Sep 17 00:00:00 2001
From: 648540858 <648540858@qq.com>
Date: 星期一, 21 十二月 2020 17:40:05 +0800
Subject: [PATCH] 恢复配置文件
---
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java | 152 ++++++++++++++++++++++++++++++--------------------
1 files changed, 92 insertions(+), 60 deletions(-)
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 4ac0c73..7d91d7b 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
@@ -8,7 +8,6 @@
import javax.sip.Dialog;
import javax.sip.InvalidArgumentException;
import javax.sip.SipException;
-import javax.sip.SipFactory;
import javax.sip.SipProvider;
import javax.sip.TransactionDoesNotExistException;
import javax.sip.address.SipURI;
@@ -16,10 +15,10 @@
import javax.sip.message.Request;
import com.alibaba.fastjson.JSONObject;
-import com.genersoft.iot.vmp.common.StreamInfo;
import com.genersoft.iot.vmp.conf.MediaServerConfig;
import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel;
-import com.genersoft.iot.vmp.media.zlm.ZLMUtils;
+import com.genersoft.iot.vmp.media.zlm.ZLMHttpHookSubscribe;
+import com.genersoft.iot.vmp.media.zlm.ZLMRTPServerFactory;
import com.genersoft.iot.vmp.storager.IVideoManagerStorager;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
@@ -62,10 +61,13 @@
private SipProvider udpSipProvider;
@Autowired
- private ZLMUtils zlmUtils;
+ private ZLMRTPServerFactory zlmrtpServerFactory;
@Value("${media.rtp.enable}")
private boolean rtpEnable;
+
+ @Autowired
+ private ZLMHttpHookSubscribe subscribe;
@@ -264,71 +266,86 @@
}
/**
* 璇锋眰棰勮瑙嗛娴�
- *
+ *
* @param device 瑙嗛璁惧
* @param channelId 棰勮閫氶亾
- */
+ */
@Override
- public StreamInfo playStreamCmd(Device device, String channelId) {
+ public void playStreamCmd(Device device, String channelId, ZLMHttpHookSubscribe.Event event) {
try {
String ssrc = streamSession.createPlaySsrc();
+ String streamId = null;
+ if (rtpEnable) {
+ streamId = String.format("gb_play_%s_%s", device.getDeviceId(), channelId);
+ }else {
+ streamId = String.format("%08x", Integer.parseInt(ssrc)).toUpperCase();
+ }
String streamMode = device.getStreamMode().toUpperCase();
MediaServerConfig mediaInfo = storager.getMediaInfo();
String mediaPort = null;
// 浣跨敤鍔ㄦ�乽dp绔彛
if (rtpEnable) {
- mediaPort = zlmUtils.getNewRTPPort(ssrc) + "";
+ mediaPort = zlmrtpServerFactory.createRTPServer(streamId) + "";
}else {
mediaPort = mediaInfo.getRtpProxyPort();
}
+
+ // 娣诲姞璁㈤槄
+ JSONObject subscribeKey = new JSONObject();
+ subscribeKey.put("app", "rtp");
+ subscribeKey.put("id", streamId);
+
+ subscribe.addSubscribe(ZLMHttpHookSubscribe.HookType.on_publish, subscribeKey, event);
//
StringBuffer content = new StringBuffer(200);
- content.append("v=0\r\n");
- content.append("o="+channelId+" 0 0 IN IP4 "+mediaInfo.getLocalIP()+"\r\n");
- content.append("s=Play\r\n");
- content.append("c=IN IP4 "+mediaInfo.getLocalIP()+"\r\n");
- content.append("t=0 0\r\n");
- if("TCP-PASSIVE".equals(streamMode)) {
- content.append("m=video "+ mediaPort +" TCP/RTP/AVP 96 98 97\r\n");
+ content.append("v=0\r\n");
+ content.append("o="+channelId+" 0 0 IN IP4 "+mediaInfo.getWanIp()+"\r\n");
+ content.append("s=Play\r\n");
+ content.append("c=IN IP4 "+mediaInfo.getWanIp()+"\r\n");
+ content.append("t=0 0\r\n");
+ if("TCP-PASSIVE".equals(streamMode)) {
+ content.append("m=video "+ mediaPort +" TCP/RTP/AVP 126 125 99 34 98 97 96\r\n");
}else if ("TCP-ACTIVE".equals(streamMode)) {
- content.append("m=video "+ mediaPort +" TCP/RTP/AVP 96 98 97\r\n");
+ content.append("m=video "+ mediaPort +" TCP/RTP/AVP 126 125 99 34 98 97 96\r\n");
}else if("UDP".equals(streamMode)) {
- content.append("m=video "+ mediaPort +" RTP/AVP 96 98 97\r\n");
+ content.append("m=video "+ mediaPort +" RTP/AVP 126 125 99 34 98 97 96\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("TCP-PASSIVE".equals(streamMode)){ // tcp琚姩妯″紡
- content.append("a=setup:passive\r\n");
+ content.append("a=recvonly\r\n");
+ content.append("a=fmtp:126 profile-level-id=42e01e\r\n");
+ content.append("a=rtpmap:126 H264/90000\r\n");
+ content.append("a=rtpmap:125 H264S/90000\r\n");
+ content.append("a=fmtp:125 profile-level-id=42e01e\r\n");
+ content.append("a=rtpmap:99 MP4V-ES/90000\r\n");
+ content.append("a=fmtp:99 profile-level-id=3\r\n");
+ content.append("a=rtpmap:98 H264/90000\r\n");
+ content.append("a=rtpmap:97 MPEG4/90000\r\n");
+ content.append("a=rtpmap:96 PS/90000\r\n");
+ if("TCP-PASSIVE".equals(streamMode)){ // tcp琚姩妯″紡
+ content.append("a=setup:passive\r\n");
content.append("a=connection:new\r\n");
- }else if ("TCP-ACTIVE".equals(streamMode)) { // tcp涓诲姩妯″紡
+ }else if ("TCP-ACTIVE".equals(streamMode)) { // tcp涓诲姩妯″紡
content.append("a=setup:active\r\n");
content.append("a=connection:new\r\n");
}
- content.append("y="+ssrc+"\r\n");//ssrc
-
- Request request = headerProvider.createInviteRequest(device, channelId, content.toString(), null, "live", null);
-
- ClientTransaction transaction = transmitRequest(device, request);
- streamSession.put(ssrc, transaction);
+ content.append("y="+ssrc+"\r\n");//ssrc
+
+ Request request = headerProvider.createInviteRequest(device, channelId, content.toString(), null, "live", null, ssrc);
+
+ ClientTransaction transaction = transmitRequest(device, request);
+ streamSession.put(streamId, transaction);
DeviceChannel deviceChannel = storager.queryChannel(device.getDeviceId(), channelId);
if (deviceChannel != null) {
- deviceChannel.setSsrc(ssrc);
+ deviceChannel.setStreamId(streamId);
storager.updateChannel(device.getDeviceId(), deviceChannel);
}
- StreamInfo streamInfo = new StreamInfo();
- streamInfo.setSsrc(ssrc);
- streamInfo.setCahnnelId(channelId);
- streamInfo.setDeviceID(device.getDeviceId());
- storager.startPlay(streamInfo);
- return streamInfo;
+ // TODO 璁㈤槄SIP response锛屽鐞嗗鏂圭殑閿欒杩斿洖
+
+
} catch ( SipException | ParseException | InvalidArgumentException e) {
e.printStackTrace();
- return null;
- }
+ }
}
/**
@@ -340,38 +357,52 @@
* @param endTime 缁撴潫鏃堕棿,鏍煎紡瑕佹眰锛歽yyy-MM-dd HH:mm:ss
*/
@Override
- public StreamInfo playbackStreamCmd(Device device, String channelId, String startTime, String endTime) {
+ public void playbackStreamCmd(Device device, String channelId, String startTime, String endTime, ZLMHttpHookSubscribe.Event event) {
try {
MediaServerConfig mediaInfo = storager.getMediaInfo();
String ssrc = streamSession.createPlayBackSsrc();
+ String streamId = String.format("%08x", Integer.parseInt(ssrc)).toUpperCase();
+ // 娣诲姞璁㈤槄
+ JSONObject subscribeKey = new JSONObject();
+ subscribeKey.put("app", "rtp");
+ subscribeKey.put("id", streamId);
+
+ subscribe.addSubscribe(ZLMHttpHookSubscribe.HookType.on_publish, subscribeKey, event);
+
//
StringBuffer content = new StringBuffer(200);
content.append("v=0\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+":0\r\n");
- content.append("c=IN IP4 "+mediaInfo.getLocalIP()+"\r\n");
+ content.append("c=IN IP4 "+mediaInfo.getWanIp()+"\r\n");
content.append("t="+DateUtil.yyyy_MM_dd_HH_mm_ssToTimestamp(startTime)+" "
+DateUtil.yyyy_MM_dd_HH_mm_ssToTimestamp(endTime) +"\r\n");
String mediaPort = null;
// 浣跨敤鍔ㄦ�乽dp绔彛
if (rtpEnable) {
- mediaPort = zlmUtils.getNewRTPPort(ssrc) + "";
+ mediaPort = zlmrtpServerFactory.createRTPServer(streamId) + "";
}else {
mediaPort = mediaInfo.getRtpProxyPort();
}
String streamMode = device.getStreamMode().toUpperCase();
if("TCP-PASSIVE".equals(streamMode)) {
- content.append("m=video "+ mediaPort +" TCP/RTP/AVP 96 98 97\r\n");
+ content.append("m=video "+ mediaPort +" TCP/RTP/AVP 126 125 99 34 98 97 96\r\n");
}else if ("TCP-ACTIVE".equals(streamMode)) {
- content.append("m=video "+ mediaPort +" TCP/RTP/AVP 96 98 97\r\n");
+ content.append("m=video "+ mediaPort +" TCP/RTP/AVP 126 125 99 34 98 97 96\r\n");
}else if("UDP".equals(streamMode)) {
- content.append("m=video "+ mediaPort +" RTP/AVP 96 98 97\r\n");
+ content.append("m=video "+ mediaPort +" RTP/AVP 126 125 99 34 98 97 96\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");
+ content.append("a=recvonly\r\n");
+ content.append("a=fmtp:126 profile-level-id=42e01e\r\n");
+ content.append("a=rtpmap:126 H264/90000\r\n");
+ content.append("a=rtpmap:125 H264S/90000\r\n");
+ content.append("a=fmtp:125 profile-level-id=42e01e\r\n");
+ content.append("a=rtpmap:99 MP4V-ES/90000\r\n");
+ content.append("a=fmtp:99 profile-level-id=3\r\n");
+ content.append("a=rtpmap:98 H264/90000\r\n");
+ content.append("a=rtpmap:97 MPEG4/90000\r\n");
+ content.append("a=rtpmap:96 PS/90000\r\n");
if("TCP-PASSIVE".equals(streamMode)){ // tcp琚姩妯″紡
content.append("a=setup:passive\r\n");
content.append("a=connection:new\r\n");
@@ -384,18 +415,10 @@
Request request = headerProvider.createPlaybackInviteRequest(device, channelId, content.toString(), null, "playback", null);
ClientTransaction transaction = transmitRequest(device, request);
- streamSession.put(ssrc, transaction);
-
- StreamInfo streamInfo = new StreamInfo();
- streamInfo.setSsrc(ssrc);
- streamInfo.setCahnnelId(channelId);
- streamInfo.setDeviceID(device.getDeviceId());
- boolean b = storager.startPlayback(streamInfo);
- return streamInfo;
+ streamSession.put(streamId, transaction);
} catch ( SipException | ParseException | InvalidArgumentException e) {
e.printStackTrace();
- return null;
}
}
@@ -404,10 +427,10 @@
*
*/
@Override
- public void streamByeCmd(String ssrc) {
+ public void streamByeCmd(String streamId) {
try {
- ClientTransaction transaction = streamSession.get(ssrc);
+ ClientTransaction transaction = streamSession.get(streamId);
if (transaction == null) {
return;
}
@@ -433,6 +456,8 @@
clientTransaction = udpSipProvider.getNewClientTransaction(byeRequest);
}
dialog.sendRequest(clientTransaction);
+ streamSession.remove(streamId);
+ zlmrtpServerFactory.closeRTPServer(streamId);
} catch (TransactionDoesNotExistException e) {
e.printStackTrace();
} catch (SipException e) {
@@ -675,4 +700,11 @@
}
+ @Override
+ public void closeRTPServer(Device device, String channelId) {
+ if (rtpEnable) {
+ String streamId = String.format("gb_play_%s_%s", device.getDeviceId(), channelId);
+ zlmrtpServerFactory.closeRTPServer(streamId);
+ }
+ }
}
--
Gitblit v1.8.0