From 9d61a93077d22dec47760c294a8658f5a5223b67 Mon Sep 17 00:00:00 2001
From: 648540858 <648540858@qq.com>
Date: 星期三, 03 一月 2024 15:50:47 +0800
Subject: [PATCH] 优化数据库sql文件组织方式
---
src/main/java/com/genersoft/iot/vmp/service/impl/PlayServiceImpl.java | 153 ++++++++++++++++----------------------------------
1 files changed, 50 insertions(+), 103 deletions(-)
diff --git a/src/main/java/com/genersoft/iot/vmp/service/impl/PlayServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/service/impl/PlayServiceImpl.java
index 1e8dee7..2376942 100755
--- a/src/main/java/com/genersoft/iot/vmp/service/impl/PlayServiceImpl.java
+++ b/src/main/java/com/genersoft/iot/vmp/service/impl/PlayServiceImpl.java
@@ -1,6 +1,5 @@
package com.genersoft.iot.vmp.service.impl;
-import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
import com.genersoft.iot.vmp.common.InviteInfo;
@@ -15,11 +14,9 @@
import com.genersoft.iot.vmp.gb28181.bean.*;
import com.genersoft.iot.vmp.gb28181.event.SipSubscribe;
import com.genersoft.iot.vmp.gb28181.session.VideoStreamSessionManager;
-import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder;
import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander;
import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommanderFroPlatform;
import com.genersoft.iot.vmp.gb28181.utils.SipUtils;
-import com.genersoft.iot.vmp.media.zlm.AssistRESTfulUtils;
import com.genersoft.iot.vmp.media.zlm.ZLMRESTfulUtils;
import com.genersoft.iot.vmp.media.zlm.ZLMServerFactory;
import com.genersoft.iot.vmp.media.zlm.ZlmHttpHookSubscribe;
@@ -32,6 +29,7 @@
import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
import com.genersoft.iot.vmp.storager.IVideoManagerStorage;
import com.genersoft.iot.vmp.storager.dao.CloudRecordServiceMapper;
+import com.genersoft.iot.vmp.utils.CloudRecordUtils;
import com.genersoft.iot.vmp.utils.DateUtil;
import com.genersoft.iot.vmp.vmanager.bean.ErrorCode;
import gov.nist.javax.sip.message.SIPResponse;
@@ -230,6 +228,15 @@
HookSubscribeForStreamChange hookSubscribe = HookSubscribeFactory.on_stream_changed("rtp", ssrcInfo.getStream(), true, "rtsp", mediaServerItem.getId());
subscribe.removeSubscribe(hookSubscribe);
}
+ }else {
+ logger.info("[鐐规挱瓒呮椂] 鏀舵祦瓒呮椂 deviceId: {}, channelId: {},鐮佹祦绫诲瀷锛歿}锛岀鍙o細{}, SSRC: {}",
+ device.getDeviceId(), channelId, device.isSwitchPrimarySubStream() ? "杈呯爜娴�" : "涓荤爜娴�",
+ ssrcInfo.getPort(), ssrcInfo.getSsrc());
+
+ mediaServerService.releaseSsrc(mediaServerItem.getId(), ssrcInfo.getSsrc());
+
+ mediaServerService.closeRTPServer(mediaServerItem.getId(), ssrcInfo.getStream());
+ streamSession.remove(device.getDeviceId(), channelId, ssrcInfo.getStream());
}
}, userSetting.getPlayTimeout());
@@ -260,6 +267,7 @@
InviteOKHandler(eventResult, ssrcInfo, mediaServerItem, device, channelId,
timeOutTaskKey, callback, inviteInfo, InviteSessionType.PLAY);
}, (event) -> {
+ logger.info("[鐐规挱澶辫触] deviceId: {}, channelId:{}, {}: {}", device.getDeviceId(), channelId, event.statusCode, event.msg);
dynamicTask.stop(timeOutTaskKey);
mediaServerService.closeRTPServer(mediaServerItem, ssrcInfo.getStream());
// 閲婃斁ssrc
@@ -301,7 +309,13 @@
if (!device.getStreamMode().equalsIgnoreCase("TCP-ACTIVE")) {
return;
}
- String substring = contentString.substring(0, contentString.indexOf("y="));
+
+ String substring;
+ if (contentString.indexOf("y=") > 0) {
+ substring = contentString.substring(0, contentString.indexOf("y="));
+ }else {
+ substring = contentString;
+ }
try {
SessionDescription sdp = SdpFactory.getInstance().createSessionDescription(substring);
int port = -1;
@@ -391,7 +405,7 @@
deviceChannel.setStreamId(streamInfo.getStream());
storager.startPlay(deviceId, channelId, streamInfo.getStream());
}
- InviteInfo inviteInfo = inviteStreamService.getInviteInfoByDeviceAndChannel(InviteSessionType.PLAYBACK, deviceId, channelId);
+ InviteInfo inviteInfo = inviteStreamService.getInviteInfoByStream(InviteSessionType.PLAYBACK, ((OnStreamChangedHookParam) param).getStream());
if (inviteInfo != null) {
inviteInfo.setStatus(InviteSessionStatus.ok);
@@ -416,23 +430,6 @@
}
if (mediaServerItem == null) {
logger.warn("鐐规挱鏃舵湭鎵惧埌鍙娇鐢ㄧ殑ZLM...");
- }
- return mediaServerItem;
- }
-
- @Override
- public MediaServerItem getNewMediaServerItemHasAssist(Device device) {
- if (device == null) {
- return null;
- }
- MediaServerItem mediaServerItem;
- if (ObjectUtils.isEmpty(device.getMediaServerId()) || "auto".equals(device.getMediaServerId())) {
- mediaServerItem = mediaServerService.getMediaServerForMinimumLoad(true);
- } else {
- mediaServerItem = mediaServerService.getOne(device.getMediaServerId());
- }
- if (mediaServerItem == null) {
- logger.warn("[鑾峰彇鍙敤鐨刏LM鑺傜偣]鏈壘鍒板彲浣跨敤鐨刏LM...");
}
return mediaServerItem;
}
@@ -534,7 +531,6 @@
// 澶勭悊鏀跺埌200ok鍚庣殑TCP涓诲姩杩炴帴浠ュ強SSRC涓嶄竴鑷寸殑闂
InviteOKHandler(eventResult, ssrcInfo, mediaServerItem, device, channelId,
playBackTimeOutTaskKey, callback, inviteInfo, InviteSessionType.PLAYBACK);
-
}, errorEvent);
} catch (InvalidArgumentException | SipException | ParseException e) {
logger.error("[鍛戒护鍙戦�佸け璐 褰曞儚鍥炴斁: {}", e.getMessage());
@@ -555,6 +551,10 @@
ResponseEvent responseEvent = (ResponseEvent) eventResult.event;
String contentString = new String(responseEvent.getResponse().getRawContent());
String ssrcInResponse = SipUtils.getSsrcFromSdp(contentString);
+ // 鍏煎鍥炲鐨勬秷鎭腑缂哄皯ssrc(y瀛楁)鐨勬儏鍐�
+ if (ssrcInResponse == null) {
+ ssrcInResponse = ssrcInfo.getSsrc();
+ }
if (ssrcInfo.getSsrc().equals(ssrcInResponse)) {
// ssrc 涓�鑷�
if (mediaServerItem.isRtpEnable()) {
@@ -633,13 +633,14 @@
+
@Override
public void download(String deviceId, String channelId, String startTime, String endTime, int downloadSpeed, ErrorCallback<Object> callback) {
Device device = storager.queryVideoDevice(deviceId);
if (device == null) {
return;
}
- MediaServerItem newMediaServerItem = getNewMediaServerItemHasAssist(device);
+ MediaServerItem newMediaServerItem = this.getNewMediaServerItem(device);
if (newMediaServerItem == null) {
callback.run(InviteErrorCode.ERROR_FOR_ASSIST_NOT_READY.getCode(),
InviteErrorCode.ERROR_FOR_ASSIST_NOT_READY.getMsg(),
@@ -718,6 +719,28 @@
// 澶勭悊鏀跺埌200ok鍚庣殑TCP涓诲姩杩炴帴浠ュ強SSRC涓嶄竴鑷寸殑闂
InviteOKHandler(eventResult, ssrcInfo, mediaServerItem, device, channelId,
downLoadTimeOutTaskKey, callback, inviteInfo, InviteSessionType.DOWNLOAD);
+
+ // 娉ㄥ唽褰曞儚鍥炶皟浜嬩欢锛屽綍鍍忎笅杞界粨鏉熷悗鍐欏叆涓嬭浇鍦板潃
+ ZlmHttpHookSubscribe.Event hookEventForRecord = (mediaServerItemInuse, hookParam) -> {
+ logger.info("[褰曞儚涓嬭浇] 鏀跺埌褰曞儚鍐欏叆纾佺洏娑堟伅锛� 锛� {}/{}-{}",
+ inviteInfo.getDeviceId(), inviteInfo.getChannelId(), ssrcInfo.getStream());
+ logger.info("[褰曞儚涓嬭浇] 鏀跺埌褰曞儚鍐欏叆纾佺洏娑堟伅鍐呭锛� " + hookParam);
+ OnRecordMp4HookParam recordMp4HookParam = (OnRecordMp4HookParam)hookParam;
+ String filePath = recordMp4HookParam.getFile_path();
+ DownloadFileInfo downloadFileInfo = CloudRecordUtils.getDownloadFilePath(mediaServerItem, filePath);
+ InviteInfo inviteInfoForNew = inviteStreamService.getInviteInfo(inviteInfo.getType(), inviteInfo.getDeviceId()
+ , inviteInfo.getChannelId(), inviteInfo.getStream());
+ inviteInfoForNew.getStreamInfo().setDownLoadFilePath(downloadFileInfo);
+ inviteStreamService.updateInviteInfo(inviteInfoForNew);
+ };
+ HookSubscribeForRecordMp4 hookSubscribe = HookSubscribeFactory.on_record_mp4(
+ mediaServerItem.getId(), "rtp", ssrcInfo.getStream());
+
+ // 璁剧疆杩囨湡鏃堕棿锛屼笅杞藉け璐ユ椂鑷姩澶勭悊璁㈤槄鏁版嵁
+// long difference = DateUtil.getDifference(startTime, endTime)/1000;
+// Instant expiresInstant = Instant.now().plusSeconds(TimeUnit.MINUTES.toSeconds(difference * 2));
+// hookSubscribe.setExpires(expiresInstant);
+ subscribe.addSubscribe(hookSubscribe, hookEventForRecord);
});
} catch (InvalidArgumentException | SipException | ParseException e) {
logger.error("[鍛戒护鍙戦�佸け璐 褰曞儚涓嬭浇: {}", e.getMessage());
@@ -791,89 +814,13 @@
BigDecimal totalCount = new BigDecimal((end - start) * 1000);
BigDecimal divide = currentCount.divide(totalCount, 2, RoundingMode.HALF_UP);
double process = divide.doubleValue();
+ if (process > 0.999) {
+ process = 1.0;
+ }
inviteInfo.getStreamInfo().setProgress(process);
}
inviteStreamService.updateInviteInfo(inviteInfo);
return inviteInfo.getStreamInfo();
- }
-
- @Override
- public void getFilePath(String deviceId, String channelId, String stream, ErrorCallback<DownloadFileInfo> callback) {
- InviteInfo inviteInfo = inviteStreamService.getInviteInfo(InviteSessionType.DOWNLOAD, deviceId, channelId, stream);
- if (inviteInfo == null || inviteInfo.getStreamInfo() == null) {
- logger.warn("[鑾峰彇褰曞儚涓嬭浇鏂囦欢鍦板潃] 鏈煡璇㈠埌褰曞儚涓嬭浇鐨勪俊鎭紝 {}/{}-{}", deviceId, channelId, stream);
- callback.run(ErrorCode.ERROR100.getCode(), "鏈煡璇㈠埌褰曞儚涓嬭浇鐨勪俊鎭�", null);
- return ;
- }
-
- if (!ObjectUtils.isEmpty(inviteInfo.getStreamInfo().getDownLoadFilePath())) {
- callback.run(ErrorCode.SUCCESS.getCode(), ErrorCode.SUCCESS.getMsg(),
- inviteInfo.getStreamInfo().getDownLoadFilePath());
- return;
- }
-
- StreamAuthorityInfo streamAuthorityInfo = redisCatchStorage.getStreamAuthorityInfo("rtp", stream);
- if (streamAuthorityInfo == null) {
- logger.warn("[鑾峰彇褰曞儚涓嬭浇鏂囦欢鍦板潃] 鏈煡璇㈠埌褰曞儚鐨勮棰戜俊鎭紝 {}/{}-{}", deviceId, channelId, stream);
- callback.run(ErrorCode.ERROR100.getCode(), "鏈煡璇㈠埌褰曞儚鐨勮棰戜俊鎭�", null);
- return ;
- }
-
- // 鑾峰彇褰撳墠宸蹭笅杞芥椂闀�
- String mediaServerId = inviteInfo.getStreamInfo().getMediaServerId();
- MediaServerItem mediaServerItem = mediaServerService.getOne(mediaServerId);
- if (mediaServerItem == null) {
- logger.warn("[鑾峰彇褰曞儚涓嬭浇鏂囦欢鍦板潃] 鏌ヨ褰曞儚淇℃伅鏃跺彂鐜拌妭鐐逛笉瀛樺湪锛� {}/{}-{}", deviceId, channelId, stream);
- callback.run(ErrorCode.ERROR100.getCode(), "鏌ヨ褰曞儚淇℃伅鏃跺彂鐜拌妭鐐逛笉瀛樺湪", null);
- return ;
- }
-
- List<CloudRecordItem> cloudRecordItemList = cloudRecordServiceMapper.getListByCallId(streamAuthorityInfo.getCallId());
- if (!cloudRecordItemList.isEmpty()) {
- String filePath = cloudRecordItemList.get(0).getFilePath();
-
- DownloadFileInfo downloadFileInfo = getDownloadFilePath(mediaServerItem, filePath);
- inviteInfo.getStreamInfo().setDownLoadFilePath(downloadFileInfo);
- inviteStreamService.updateInviteInfo(inviteInfo);
- callback.run(ErrorCode.SUCCESS.getCode(), ErrorCode.SUCCESS.getMsg(), downloadFileInfo);
- }else {
- // 鍙兘灏氭湭鐢熸垚锛岄偅灏辩洃鍚琱ook绛夌潃鏀跺埌瀵瑰簲鐨勫綍鍍忛�氱煡
- ZlmHttpHookSubscribe.Event hookEvent = (mediaServerItemInuse, hookParam) -> {
- logger.info("[褰曞儚涓嬭浇]鏀跺埌璁㈤槄娑堟伅锛� 锛� {}/{}-{}", deviceId, channelId, stream);
- logger.info("[褰曞儚涓嬭浇]鏀跺埌璁㈤槄娑堟伅鍐呭锛� " + hookParam);
- dynamicTask.stop(streamAuthorityInfo.getCallId());
- OnRecordMp4HookParam recordMp4HookParam = (OnRecordMp4HookParam)hookParam;
- String filePath = recordMp4HookParam.getFile_path();
- DownloadFileInfo downloadFileInfo = getDownloadFilePath(mediaServerItem, filePath);
- inviteInfo.getStreamInfo().setDownLoadFilePath(downloadFileInfo);
- inviteStreamService.updateInviteInfo(inviteInfo);
- callback.run(ErrorCode.SUCCESS.getCode(), ErrorCode.SUCCESS.getMsg(), downloadFileInfo);
- };
- HookSubscribeForRecordMp4 hookSubscribe = HookSubscribeFactory.on_record_mp4(mediaServerId, "rtp", stream);
- subscribe.addSubscribe(hookSubscribe, hookEvent);
-
- // 璁剧疆瓒呮椂锛岃秴鏃剁粨鏉熺洃鍚�
- dynamicTask.startDelay(streamAuthorityInfo.getCallId(), ()->{
- logger.info("[褰曞儚涓嬭浇] 鎺ユ敹hook瓒呮椂锛� {}/{}-{}", deviceId, channelId, stream);
- subscribe.removeSubscribe(hookSubscribe);
- callback.run(ErrorCode.ERROR100.getCode(), "鎺ユ敹hook瓒呮椂", null);
- }, 10000);
- }
- }
-
- private DownloadFileInfo getDownloadFilePath(MediaServerItem mediaServerItem, String filePath) {
- DownloadFileInfo downloadFileInfo = new DownloadFileInfo();
-
- String pathTemplate = "%s://%s:%s/index/api/downloadFile?file_path=" + filePath;
-
- downloadFileInfo.setHttpPath(String.format(pathTemplate, "http", mediaServerItem.getStreamIp(),
- mediaServerItem.getHttpPort()));
-
- if (mediaServerItem.getHttpSSlPort() > 0) {
- downloadFileInfo.setHttpsPath(String.format(pathTemplate, "https", mediaServerItem.getStreamIp(),
- mediaServerItem.getHttpSSlPort()));
- }
- return downloadFileInfo;
}
private StreamInfo onPublishHandlerForDownload(MediaServerItem mediaServerItemInuse, HookParam hookParam, String deviceId, String channelId, String startTime, String endTime) {
--
Gitblit v1.8.0