From c859fe228ccc7d9e83d89e3c2513ae3548d4425f Mon Sep 17 00:00:00 2001
From: 648540858 <648540858@qq.com>
Date: 星期五, 30 九月 2022 09:25:15 +0800
Subject: [PATCH] 更新文档
---
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/InviteRequestProcessor.java | 218 ++++++++++++++++++-----------------------------------
1 files changed, 75 insertions(+), 143 deletions(-)
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/InviteRequestProcessor.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/InviteRequestProcessor.java
index a843159..78adfd1 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/InviteRequestProcessor.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/InviteRequestProcessor.java
@@ -1,11 +1,10 @@
package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl;
-import com.alibaba.fastjson.JSON;
-import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.genersoft.iot.vmp.conf.DynamicTask;
import com.genersoft.iot.vmp.conf.SipConfig;
import com.genersoft.iot.vmp.conf.UserSetting;
+import com.genersoft.iot.vmp.conf.exception.SsrcTransactionNotFoundException;
import com.genersoft.iot.vmp.gb28181.bean.*;
import com.genersoft.iot.vmp.gb28181.event.SipSubscribe;
import com.genersoft.iot.vmp.gb28181.session.AudioBroadcastManager;
@@ -14,7 +13,8 @@
import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder;
import com.genersoft.iot.vmp.gb28181.transmit.callback.RequestMessage;
import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommander;
-import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommanderFroPlatform;
+import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommanderForPlatform;
+import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander;
import com.genersoft.iot.vmp.gb28181.transmit.event.request.ISIPRequestProcessor;
import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent;
import com.genersoft.iot.vmp.gb28181.utils.SipUtils;
@@ -30,19 +30,15 @@
import com.genersoft.iot.vmp.service.IStreamPushService;
import com.genersoft.iot.vmp.service.bean.MessageForPushChannel;
import com.genersoft.iot.vmp.service.bean.SSRCInfo;
-import com.genersoft.iot.vmp.service.impl.RedisGbPlayMsgListener;
import com.genersoft.iot.vmp.service.redisMsg.RedisGbPlayMsgListener;
import com.genersoft.iot.vmp.service.redisMsg.RedisPushStreamResponseListener;
import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
import com.genersoft.iot.vmp.storager.IVideoManagerStorage;
import com.genersoft.iot.vmp.utils.DateUtil;
-import com.genersoft.iot.vmp.utils.SerializeUtils;
import com.genersoft.iot.vmp.vmanager.bean.AudioBroadcastResult;
import com.genersoft.iot.vmp.vmanager.bean.WVPResult;
import gov.nist.javax.sdp.TimeDescriptionImpl;
import gov.nist.javax.sdp.fields.TimeField;
-import gov.nist.javax.sip.message.SIPRequest;
-import gov.nist.javax.sip.stack.SIPDialog;
import gov.nist.javax.sip.message.SIPRequest;
import gov.nist.javax.sip.message.SIPResponse;
import org.slf4j.Logger;
@@ -72,7 +68,7 @@
private final String method = "INVITE";
@Autowired
- private SIPCommanderFroPlatform cmderFroPlatform;
+ private ISIPCommanderForPlatform cmderFroPlatform;
@Autowired
private IVideoManagerStorage storager;
@@ -174,7 +170,7 @@
// 鏌ヨ璇锋眰鏄惁鏉ヨ嚜涓婄骇骞冲彴\璁惧
ParentPlatform platform = storager.queryParentPlatByServerGBId(requesterId);
if (platform == null) {
- inviteFromDeviceHandle(serverTransaction, requesterId);
+ inviteFromDeviceHandle(serverTransaction, requesterId, channelId);
} else {
// 鏌ヨ骞冲彴涓嬫槸鍚︽湁璇ラ�氶亾
DeviceChannel channel = storager.queryChannelInParentPlatform(requesterId, channelId);
@@ -366,16 +362,20 @@
content.append("m=video " + sendRtpItem.getLocalPort() + " RTP/AVP 96\r\n");
content.append("a=sendonly\r\n");
content.append("a=rtpmap:96 PS/90000\r\n");
- content.append("y=" + ssrc + "\r\n");
+ content.append("y=" + sendRtpItem.getSsrc() + "\r\n");
content.append("f=\r\n");
try {
// 瓒呮椂鏈敹鍒癆ck搴旇鍥炲bye,褰撳墠绛夊緟鏃堕棿涓�10绉�
dynamicTask.startDelay(callIdHeader.getCallId(), () -> {
logger.info("Ack 绛夊緟瓒呮椂");
- mediaServerService.releaseSsrc(mediaServerItemInUSe.getId(), ssrc);
+ mediaServerService.releaseSsrc(mediaServerItemInUSe.getId(), sendRtpItem.getSsrc());
// 鍥炲bye
- cmderFroPlatform.streamByeCmd(platform, callIdHeader.getCallId());
+ try {
+ cmderFroPlatform.streamByeCmd(platform, callIdHeader.getCallId());
+ } catch (SipException | InvalidArgumentException | ParseException e) {
+ logger.error("[鍛戒护鍙戦�佸け璐 鍥芥爣绾ц仈 鍙戦�丅YE: {}", e.getMessage());
+ }
}, 60 * 1000);
responseSdpAck(serverTransaction, content.toString(), platform);
@@ -389,14 +389,15 @@
};
SipSubscribe.Event errorEvent = ((event) -> {
// 鏈煡閿欒銆傜洿鎺ヨ浆鍙戣澶囩偣鎾殑閿欒
- Response response = null;
try {
- response = getMessageFactory().createResponse(event.statusCode, evt.getRequest());
+ Response response = getMessageFactory().createResponse(event.statusCode, evt.getRequest());
serverTransaction.sendResponse(response);
System.out.println("鏈煡閿欒銆傜洿鎺ヨ浆鍙戣澶囩偣鎾殑閿欒");
if (serverTransaction.getDialog() != null) {
serverTransaction.getDialog().delete();
}
+ serverTransaction.getDialog().delete();
+
} catch (ParseException | SipException | InvalidArgumentException e) {
e.printStackTrace();
}
@@ -455,6 +456,7 @@
SSRCInfo ssrcInfo = mediaServerService.openRTPServer(mediaServerItem, streamId, null, device.isSsrcCheck(), false);
logger.info(JSONObject.toJSONString(ssrcInfo));
sendRtpItem.setStreamId(ssrcInfo.getStream());
+ sendRtpItem.setSsrc(ssrc.equals(ssrcDefault) ? ssrcInfo.getSsrc() : ssrc);
// 鍐欏叆redis锛� 瓒呮椂鏃跺洖澶�
redisCatchStorage.updateSendRTPSever(sendRtpItem);
@@ -691,12 +693,8 @@
mediaListManager.removedChannelOnlineEventLister(gbStream.getApp(), gbStream.getStream());
try {
responseAck(serverTransaction, Response.TEMPORARILY_UNAVAILABLE, response.getMsg());
- } catch (SipException e) {
- throw new RuntimeException(e);
- } catch (InvalidArgumentException e) {
- throw new RuntimeException(e);
- } catch (ParseException e) {
- throw new RuntimeException(e);
+ } catch (SipException | InvalidArgumentException | ParseException e) {
+ logger.error("[鍛戒护鍙戦�佸け璐 鍥芥爣绾ц仈 鐐规挱鍥炲: {}", e.getMessage());
}
}
});
@@ -763,12 +761,8 @@
mediaTransmissionTCP, channelId, addressStr, ssrc, requesterId);
}
}
- } catch (InvalidArgumentException e) {
- throw new RuntimeException(e);
- } catch (ParseException e) {
- throw new RuntimeException(e);
- } catch (SipException e) {
- throw new RuntimeException(e);
+ } catch (InvalidArgumentException | ParseException | SipException e) {
+ logger.error("[鍛戒护鍙戦�佸け璐 鍥芥爣绾ц仈 鐐规挱鍥炲: {}", e.getMessage());
}
@@ -820,7 +814,6 @@
}
public void inviteFromDeviceHandle(ServerTransaction serverTransaction, String requesterId, String channelId) throws InvalidArgumentException, ParseException, SipException, SdpException {
-
// 闈炰笂绾у钩鍙拌姹傦紝鏌ヨ鏄惁璁惧璇锋眰锛堥�氬父涓烘帴鏀惰闊冲箍鎾殑璁惧锛�
Device device = redisCatchStorage.getDevice(requesterId);
AudioBroadcastCatch audioBroadcastCatch = audioBroadcastManager.get(requesterId, channelId);
@@ -921,125 +914,64 @@
sendRtpItem.setOnlyAudio(true);
redisCatchStorage.updateSendRTPSever(sendRtpItem);
- // hook鐩戝惉绛夊緟璁惧鎺ㄦ祦涓婃潵
- // 娣诲姞璁㈤槄
- HookSubscribeForStreamChange subscribeKey = HookSubscribeFactory.on_stream_changed(app, stream, true, "rtsp", mediaServerItem.getId());
-
- String finalSsrc = ssrc;
- // 娴佸凡缁忓瓨鍦ㄦ椂鐩存帴鎺ㄦ祦
- // 璁剧疆绛夊緟鎺ㄦ祦鐨勮秴鏃�; 榛樿20s
- String waiteStreamTimeoutTaskKey = "waite-stream-" + device.getDeviceId() + audioBroadcastCatch.getChannelId();
- dynamicTask.startDelay(waiteStreamTimeoutTaskKey, ()->{
- logger.info("绛夊緟鎺ㄦ祦瓒呮椂: {}/{}", app, stream);
- subscribe.removeSubscribe(subscribeKey);
- playService.stopAudioBroadcast(device.getDeviceId(), audioBroadcastCatch.getChannelId());
- // 鍙戦�乥ye
- try {
- responseAck(evt, Response.BUSY_HERE);
- } catch (SipException e) {
- throw new RuntimeException(e);
- } catch (InvalidArgumentException e) {
- throw new RuntimeException(e);
- } catch (ParseException e) {
- throw new RuntimeException(e);
- }
- }, 20*1000);
-
- boolean finalMediaTransmissionTCP = mediaTransmissionTCP;
- subscribe.addSubscribe(subscribeKey,
- (MediaServerItem mediaServerItemInUse, JSONObject json)->{
- logger.info("鏀跺埌璇煶瀵硅鎺ㄦ祦");
- dynamicTask.stop(waiteStreamTimeoutTaskKey);
- MediaItem mediaItem = JSON.toJavaObject(json, MediaItem.class);
- Integer audioCodecId = null;
- if (mediaItem.getTracks() != null && mediaItem.getTracks().size() > 0) {
- for (int i = 0; i < mediaItem.getTracks().size(); i++) {
- MediaItem.MediaTrack mediaTrack = mediaItem.getTracks().get(i);
- if (mediaTrack.getCodecType() == 1) {
- audioCodecId = mediaTrack.getCodecId();
- break;
- }
- }
- }
-
- try {
- sendRtpItem.setStatus(2);
- redisCatchStorage.updateSendRTPSever(sendRtpItem);
- StringBuffer content = new StringBuffer(200);
- content.append("v=0\r\n");
- content.append("o="+ config.getId() +" "+ sdp.getOrigin().getSessionId() +" " + sdp.getOrigin().getSessionVersion() + " IN IP4 "+mediaServerItem.getSdpIp()+"\r\n");
- content.append("s=Play\r\n");
- content.append("c=IN IP4 "+mediaServerItem.getSdpIp()+"\r\n");
- content.append("t=0 0\r\n");
- if (audioCodecId == null) {
- if (finalMediaTransmissionTCP) {
- content.append("m=audio "+ sendRtpItem.getLocalPort()+" TCP/RTP/AVP 8\r\n");
- }else {
- content.append("m=audio "+ sendRtpItem.getLocalPort()+" RTP/AVP 8\r\n");
- }
-
- content.append("a=rtpmap:8 PCMA/8000\r\n");
- }else {
- if (audioCodecId == 4) {
- if (finalMediaTransmissionTCP) {
- content.append("m=audio "+ sendRtpItem.getLocalPort()+" TCP/RTP/AVP 0\r\n");
- }else {
- content.append("m=audio "+ sendRtpItem.getLocalPort()+" RTP/AVP 0\r\n");
- }
- content.append("a=rtpmap:0 PCMU/8000\r\n");
- }else {
- if (finalMediaTransmissionTCP) {
- content.append("m=audio "+ sendRtpItem.getLocalPort()+" TCP/RTP/AVP 8\r\n");
- }else {
- content.append("m=audio "+ sendRtpItem.getLocalPort()+" RTP/AVP 8\r\n");
- }
- content.append("a=rtpmap:8 PCMA/8000\r\n");
- }
- }
- content.append("a=sendonly\r\n");
- if (sendRtpItem.isTcp()) {
- content.append("a=connection:new\r\n");
- if (!sendRtpItem.isTcpActive()) {
- content.append("a=setup:active\r\n");
- }else {
- content.append("a=setup:passive\r\n");
- }
- }
- content.append("y="+ finalSsrc + "\r\n");
- content.append("f=v/////a/1/8/1\r\n");
-
- ParentPlatform parentPlatform = new ParentPlatform();
- parentPlatform.setServerIP(device.getIp());
- parentPlatform.setServerPort(device.getPort());
- parentPlatform.setServerGBId(device.getDeviceId());
-
- responseSdpAck(serverTransaction, content.toString(), parentPlatform);
- Dialog dialog = evt.getDialog();
- audioBroadcastCatch.setDialog((SIPDialog) dialog);
- audioBroadcastCatch.setRequest((SIPRequest) request);
- audioBroadcastManager.update(audioBroadcastCatch);
- } catch (SipException | InvalidArgumentException | ParseException | SdpParseException e) {
- logger.error("[鍛戒护鍙戦�佸け璐 璇煶瀵硅: {}", e.getMessage());
- }
- });
-// }
- String key = DeferredResultHolder.CALLBACK_CMD_BROADCAST + device.getDeviceId();
- WVPResult<AudioBroadcastResult> wvpResult = new WVPResult<>();
- wvpResult.setCode(0);
- wvpResult.setMsg("success");
- AudioBroadcastResult audioBroadcastResult = new AudioBroadcastResult();
- audioBroadcastResult.setApp(app);
- audioBroadcastResult.setStream(stream);
- audioBroadcastResult.setStreamInfo(mediaService.getStreamInfoByAppAndStream(mediaServerItem, app, stream, null, null, null,false));
- audioBroadcastResult.setCodec("G.711");
- wvpResult.setData(audioBroadcastResult);
- RequestMessage requestMessage = new RequestMessage();
- requestMessage.setKey(key);
- requestMessage.setData(wvpResult);
- resultHolder.invokeAllResult(requestMessage);
+ Boolean streamReady = zlmrtpServerFactory.isStreamReady(mediaServerItem, app, stream);
+ if (streamReady) {
+ sendOk(device, sendRtpItem, sdp, serverTransaction, mediaServerItem, mediaTransmissionTCP, ssrc);
+ }else {
+ logger.warn("[璇煶閫氳瘽]锛� 鏈彂鐜板緟鎺ㄩ�佺殑娴�,app={},stream={}", app, stream);
+ playService.stopAudioBroadcast(device.getDeviceId(), audioBroadcastCatch.getChannelId());
+ }
} else {
logger.warn("鏉ヨ嚜鏃犳晥璁惧/骞冲彴鐨勮姹�");
responseAck(serverTransaction, Response.BAD_REQUEST);
}
}
+
+ void sendOk(Device device, SendRtpItem sendRtpItem, SessionDescription sdp, ServerTransaction serverTransaction, MediaServerItem mediaServerItem, boolean mediaTransmissionTCP, String ssrc){
+ try {
+ sendRtpItem.setStatus(2);
+ redisCatchStorage.updateSendRTPSever(sendRtpItem);
+ StringBuffer content = new StringBuffer(200);
+ content.append("v=0\r\n");
+ content.append("o="+ config.getId() +" "+ sdp.getOrigin().getSessionId() +" " + sdp.getOrigin().getSessionVersion() + " IN IP4 "+mediaServerItem.getSdpIp()+"\r\n");
+ content.append("s=Play\r\n");
+ content.append("c=IN IP4 "+mediaServerItem.getSdpIp()+"\r\n");
+ content.append("t=0 0\r\n");
+
+ if (mediaTransmissionTCP) {
+ content.append("m=audio "+ sendRtpItem.getLocalPort()+" TCP/RTP/AVP 8\r\n");
+ }else {
+ content.append("m=audio "+ sendRtpItem.getLocalPort()+" RTP/AVP 8\r\n");
+ }
+
+ content.append("a=rtpmap:8 PCMA/8000/1\r\n");
+
+ content.append("a=sendonly\r\n");
+ if (sendRtpItem.isTcp()) {
+ content.append("a=connection:new\r\n");
+ if (!sendRtpItem.isTcpActive()) {
+ content.append("a=setup:active\r\n");
+ }else {
+ content.append("a=setup:passive\r\n");
+ }
+ }
+ content.append("y="+ ssrc + "\r\n");
+ content.append("f=v/////a/1/8/1\r\n");
+
+ ParentPlatform parentPlatform = new ParentPlatform();
+ parentPlatform.setServerIP(device.getIp());
+ parentPlatform.setServerPort(device.getPort());
+ parentPlatform.setServerGBId(device.getDeviceId());
+
+ SIPResponse sipResponse = responseSdpAck(serverTransaction, content.toString(), parentPlatform);
+
+ AudioBroadcastCatch audioBroadcastCatch = audioBroadcastManager.get(device.getDeviceId(), sendRtpItem.getChannelId());
+
+ audioBroadcastCatch.setStatus(AudioBroadcastCatchStatus.Ok);
+ audioBroadcastCatch.setSipTransactionInfoByRequset(sipResponse);
+ audioBroadcastManager.update(audioBroadcastCatch);
+ } catch (SipException | InvalidArgumentException | ParseException | SdpParseException e) {
+ logger.error("[鍛戒护鍙戦�佸け璐 璇煶瀵硅 鍥炲200OK锛圫DP锛�: {}", e.getMessage());
+ }
+ }
}
--
Gitblit v1.8.0