Commit 3b1516afe54cfa95a37b3356e7910c7ad57b32db

Authored by 648540858
1 parent 4f22994c

优化录像配置。不再使用zlm默认的http服务器

src/main/java/com/genersoft/iot/vmp/conf/ProxyServletConfig.java
... ... @@ -169,7 +169,10 @@ public class ProxyServletConfig {
169 169 protected String rewriteQueryStringFromRequest(HttpServletRequest servletRequest, String queryString) {
170 170 String queryStr = super.rewriteQueryStringFromRequest(servletRequest, queryString);
171 171 MediaServerItem mediaInfo = getMediaInfoByUri(servletRequest.getRequestURI());
172   - String remoteHost = String.format("http://%s:%s", mediaInfo.getStreamIp(), mediaInfo.getHttpPort());
  172 + if (mediaInfo == null) {
  173 + return null;
  174 + }
  175 + String remoteHost = String.format("http://%s:%s", mediaInfo.getStreamIp(), mediaInfo.getRecordAssistPort());
173 176 if (!ObjectUtils.isEmpty(queryStr)) {
174 177 queryStr += "&remoteHost=" + remoteHost;
175 178 }else {
... ...
src/main/java/com/genersoft/iot/vmp/conf/UserSetting.java
... ... @@ -54,6 +54,8 @@ public class UserSetting {
54 54  
55 55 private String serverId = "000000";
56 56  
  57 + private String recordPath = null;
  58 +
57 59 private String thirdPartyGBIdReg = "[\\s\\S]*";
58 60  
59 61 private List<String> interfaceAuthenticationExcludes = new ArrayList<>();
... ... @@ -248,5 +250,11 @@ public class UserSetting {
248 250 this.refuseChannelStatusChannelFormNotify = refuseChannelStatusChannelFormNotify;
249 251 }
250 252  
  253 + public String getRecordPath() {
  254 + return recordPath;
  255 + }
251 256  
  257 + public void setRecordPath(String recordPath) {
  258 + this.recordPath = recordPath;
  259 + }
252 260 }
... ...
src/main/java/com/genersoft/iot/vmp/media/zlm/AssistRESTfulUtils.java
... ... @@ -9,17 +9,12 @@ import org.jetbrains.annotations.NotNull;
9 9 import org.slf4j.Logger;
10 10 import org.slf4j.LoggerFactory;
11 11 import org.springframework.stereotype.Component;
12   -import org.springframework.util.ObjectUtils;
13   -import org.springframework.util.StringUtils;
14 12  
15   -import java.io.File;
16   -import java.io.FileOutputStream;
17 13 import java.io.IOException;
18 14 import java.net.ConnectException;
19 15 import java.util.HashMap;
20 16 import java.util.Map;
21 17 import java.util.Objects;
22   -import java.util.concurrent.TimeUnit;
23 18  
24 19 @Component
25 20 public class AssistRESTfulUtils {
... ... @@ -137,6 +132,11 @@ public class AssistRESTfulUtils {
137 132 return sendGet(mediaServerItem, "api/record/file/duration",param, callback);
138 133 }
139 134  
  135 + public JSONObject getInfo(MediaServerItem mediaServerItem, RequestCallback callback){
  136 + Map<String, Object> param = new HashMap<>();
  137 + return sendGet(mediaServerItem, "api/record/info",param, callback);
  138 + }
  139 +
140 140 public JSONObject addStreamCallInfo(MediaServerItem mediaServerItem, String app, String stream, String callId, RequestCallback callback){
141 141 Map<String, Object> param = new HashMap<>();
142 142 param.put("app",app);
... ...
src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java
... ... @@ -253,6 +253,24 @@ public class ZLMHttpHookListener {
253 253 result.setEnable_mp4(true);
254 254 }
255 255 }
  256 + if (mediaInfo.getRecordAssistPort() > 0 && userSetting.getRecordPath() == null) {
  257 + logger.info("推流时发现尚未设置录像路径,从assist服务中读取");
  258 + JSONObject info = assistRESTfulUtils.getInfo(mediaInfo, null);
  259 + if (info != null && info.getInteger("code") != null && info.getInteger("code") == 0 ) {
  260 + JSONObject dataJson = info.getJSONObject("data");
  261 + if (dataJson != null) {
  262 + String recordPath = dataJson.getString("record");
  263 + userSetting.setRecordPath(recordPath);
  264 + result.setMp4_save_path(recordPath);
  265 + // 修改zlm中的录像路径
  266 + if (mediaInfo.isAutoConfig()) {
  267 + taskExecutor.execute(() -> {
  268 + mediaServerService.setZLMConfig(mediaInfo, false);
  269 + });
  270 + }
  271 + }
  272 + }
  273 + }
256 274 return result;
257 275 }
258 276  
... ...
src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMServerConfig.java
... ... @@ -10,21 +10,87 @@ public class ZLMServerConfig {
10 10 @JSONField(name = "api.secret")
11 11 private String apiSecret;
12 12  
  13 + @JSONField(name = "api.snapRoot")
  14 + private String apiSnapRoot;
  15 +
  16 + @JSONField(name = "api.defaultSnap")
  17 + private String apiDefaultSnap;
  18 +
13 19 @JSONField(name = "ffmpeg.bin")
14 20 private String ffmpegBin;
15 21  
16 22 @JSONField(name = "ffmpeg.cmd")
17 23 private String ffmpegCmd;
18 24  
  25 + @JSONField(name = "ffmpeg.snap")
  26 + private String ffmpegSnap;
  27 +
19 28 @JSONField(name = "ffmpeg.log")
20 29 private String ffmpegLog;
21 30  
  31 + @JSONField(name = "ffmpeg.restart_sec")
  32 + private String ffmpegRestartSec;
  33 +
  34 + @JSONField(name = "protocol.modify_stamp")
  35 + private String protocolModifyStamp;
  36 +
  37 + @JSONField(name = "protocol.enable_audio")
  38 + private String protocolEnableAudio;
  39 +
  40 + @JSONField(name = "protocol.add_mute_audio")
  41 + private String protocolAddMuteAudio;
  42 +
  43 + @JSONField(name = "protocol.continue_push_ms")
  44 + private String protocolContinuePushMs;
  45 +
  46 + @JSONField(name = "protocol.enable_hls")
  47 + private String protocolEnableHls;
  48 +
  49 + @JSONField(name = "protocol.enable_mp4")
  50 + private String protocolEnableMp4;
  51 +
  52 + @JSONField(name = "protocol.enable_rtsp")
  53 + private String protocolEnableRtsp;
  54 +
  55 + @JSONField(name = "protocol.enable_rtmp")
  56 + private String protocolEnableRtmp;
  57 +
  58 + @JSONField(name = "protocol.enable_ts")
  59 + private String protocolEnableTs;
  60 +
  61 + @JSONField(name = "protocol.enable_fmp4")
  62 + private String protocolEnableFmp4;
  63 +
  64 + @JSONField(name = "protocol.mp4_as_player")
  65 + private String protocolMp4AsPlayer;
  66 +
  67 + @JSONField(name = "protocol.mp4_max_second")
  68 + private String protocolMp4MaxSecond;
  69 +
  70 + @JSONField(name = "protocol.mp4_save_path")
  71 + private String protocolMp4SavePath;
  72 +
  73 + @JSONField(name = "protocol.hls_save_path")
  74 + private String protocolHlsSavePath;
  75 +
  76 + @JSONField(name = "protocol.hls_demand")
  77 + private String protocolHlsDemand;
  78 +
  79 + @JSONField(name = "protocol.rtsp_demand")
  80 + private String protocolRtspDemand;
  81 +
  82 + @JSONField(name = "protocol.rtmp_demand")
  83 + private String protocolRtmpDemand;
  84 +
  85 + @JSONField(name = "protocol.ts_demand")
  86 + private String protocolTsDemand;
  87 +
  88 + @JSONField(name = "protocol.fmp4_demand")
  89 + private String protocolFmp4Demand;
  90 +
22 91 @JSONField(name = "general.enableVhost")
23 92 private String generalEnableVhost;
24 93  
25   - @JSONField(name = "general.mediaServerId")
26   - private String generalMediaServerId;
27   -
28 94 @JSONField(name = "general.flowThreshold")
29 95 private String generalFlowThreshold;
30 96  
... ... @@ -34,6 +100,25 @@ public class ZLMServerConfig {
34 100 @JSONField(name = "general.streamNoneReaderDelayMS")
35 101 private int generalStreamNoneReaderDelayMS;
36 102  
  103 + @JSONField(name = "general.resetWhenRePlay")
  104 + private String generalResetWhenRePlay;
  105 +
  106 + @JSONField(name = "general.mergeWriteMS")
  107 + private String generalMergeWriteMS;
  108 +
  109 + @JSONField(name = "general.mediaServerId")
  110 + private String generalMediaServerId;
  111 +
  112 + @JSONField(name = "general.wait_track_ready_ms")
  113 + private String generalWaitTrackReadyMs;
  114 +
  115 + @JSONField(name = "general.wait_add_track_ms")
  116 + private String generalWaitAddTrackMs;
  117 +
  118 + @JSONField(name = "general.unready_frame_cache")
  119 + private String generalUnreadyFrameCache;
  120 +
  121 +
37 122 @JSONField(name = "ip")
38 123 private String ip;
39 124  
... ... @@ -59,6 +144,18 @@ public class ZLMServerConfig {
59 144 @JSONField(name = "hls.segNum")
60 145 private String hlsSegNum;
61 146  
  147 + @JSONField(name = "hls.segRetain")
  148 + private String hlsSegRetain;
  149 +
  150 + @JSONField(name = "hls.broadcastRecordTs")
  151 + private String hlsBroadcastRecordTs;
  152 +
  153 + @JSONField(name = "hls.deleteDelaySec")
  154 + private String hlsDeleteDelaySec;
  155 +
  156 + @JSONField(name = "hls.segKeep")
  157 + private String hlsSegKeep;
  158 +
62 159 @JSONField(name = "hook.access_file_except_hls")
63 160 private String hookAccessFileExceptHLS;
64 161  
... ... @@ -104,6 +201,18 @@ public class ZLMServerConfig {
104 201 @JSONField(name = "hook.on_stream_not_found")
105 202 private String hookOnStreamNotFound;
106 203  
  204 + @JSONField(name = "hook.on_server_started")
  205 + private String hookOnServerStarted;
  206 +
  207 + @JSONField(name = "hook.on_server_keepalive")
  208 + private String hookOnServerKeepalive;
  209 +
  210 + @JSONField(name = "hook.on_send_rtp_stopped")
  211 + private String hookOnSendRtpStopped;
  212 +
  213 + @JSONField(name = "hook.on_rtp_server_timeout")
  214 + private String hookOnRtpServerTimeout;
  215 +
107 216 @JSONField(name = "hook.timeoutSec")
108 217 private String hookTimeoutSec;
109 218  
... ... @@ -813,4 +922,292 @@ public class ZLMServerConfig {
813 922 public void setPortRange(String portRange) {
814 923 this.portRange = portRange;
815 924 }
  925 +
  926 + public String getApiSnapRoot() {
  927 + return apiSnapRoot;
  928 + }
  929 +
  930 + public void setApiSnapRoot(String apiSnapRoot) {
  931 + this.apiSnapRoot = apiSnapRoot;
  932 + }
  933 +
  934 + public String getApiDefaultSnap() {
  935 + return apiDefaultSnap;
  936 + }
  937 +
  938 + public void setApiDefaultSnap(String apiDefaultSnap) {
  939 + this.apiDefaultSnap = apiDefaultSnap;
  940 + }
  941 +
  942 + public String getFfmpegSnap() {
  943 + return ffmpegSnap;
  944 + }
  945 +
  946 + public void setFfmpegSnap(String ffmpegSnap) {
  947 + this.ffmpegSnap = ffmpegSnap;
  948 + }
  949 +
  950 + public String getFfmpegRestartSec() {
  951 + return ffmpegRestartSec;
  952 + }
  953 +
  954 + public void setFfmpegRestartSec(String ffmpegRestartSec) {
  955 + this.ffmpegRestartSec = ffmpegRestartSec;
  956 + }
  957 +
  958 + public String getProtocolModifyStamp() {
  959 + return protocolModifyStamp;
  960 + }
  961 +
  962 + public void setProtocolModifyStamp(String protocolModifyStamp) {
  963 + this.protocolModifyStamp = protocolModifyStamp;
  964 + }
  965 +
  966 + public String getProtocolEnableAudio() {
  967 + return protocolEnableAudio;
  968 + }
  969 +
  970 + public void setProtocolEnableAudio(String protocolEnableAudio) {
  971 + this.protocolEnableAudio = protocolEnableAudio;
  972 + }
  973 +
  974 + public String getProtocolAddMuteAudio() {
  975 + return protocolAddMuteAudio;
  976 + }
  977 +
  978 + public void setProtocolAddMuteAudio(String protocolAddMuteAudio) {
  979 + this.protocolAddMuteAudio = protocolAddMuteAudio;
  980 + }
  981 +
  982 + public String getProtocolContinuePushMs() {
  983 + return protocolContinuePushMs;
  984 + }
  985 +
  986 + public void setProtocolContinuePushMs(String protocolContinuePushMs) {
  987 + this.protocolContinuePushMs = protocolContinuePushMs;
  988 + }
  989 +
  990 + public String getProtocolEnableHls() {
  991 + return protocolEnableHls;
  992 + }
  993 +
  994 + public void setProtocolEnableHls(String protocolEnableHls) {
  995 + this.protocolEnableHls = protocolEnableHls;
  996 + }
  997 +
  998 + public String getProtocolEnableMp4() {
  999 + return protocolEnableMp4;
  1000 + }
  1001 +
  1002 + public void setProtocolEnableMp4(String protocolEnableMp4) {
  1003 + this.protocolEnableMp4 = protocolEnableMp4;
  1004 + }
  1005 +
  1006 + public String getProtocolEnableRtsp() {
  1007 + return protocolEnableRtsp;
  1008 + }
  1009 +
  1010 + public void setProtocolEnableRtsp(String protocolEnableRtsp) {
  1011 + this.protocolEnableRtsp = protocolEnableRtsp;
  1012 + }
  1013 +
  1014 + public String getProtocolEnableRtmp() {
  1015 + return protocolEnableRtmp;
  1016 + }
  1017 +
  1018 + public void setProtocolEnableRtmp(String protocolEnableRtmp) {
  1019 + this.protocolEnableRtmp = protocolEnableRtmp;
  1020 + }
  1021 +
  1022 + public String getProtocolEnableTs() {
  1023 + return protocolEnableTs;
  1024 + }
  1025 +
  1026 + public void setProtocolEnableTs(String protocolEnableTs) {
  1027 + this.protocolEnableTs = protocolEnableTs;
  1028 + }
  1029 +
  1030 + public String getProtocolEnableFmp4() {
  1031 + return protocolEnableFmp4;
  1032 + }
  1033 +
  1034 + public void setProtocolEnableFmp4(String protocolEnableFmp4) {
  1035 + this.protocolEnableFmp4 = protocolEnableFmp4;
  1036 + }
  1037 +
  1038 + public String getProtocolMp4AsPlayer() {
  1039 + return protocolMp4AsPlayer;
  1040 + }
  1041 +
  1042 + public void setProtocolMp4AsPlayer(String protocolMp4AsPlayer) {
  1043 + this.protocolMp4AsPlayer = protocolMp4AsPlayer;
  1044 + }
  1045 +
  1046 + public String getProtocolMp4MaxSecond() {
  1047 + return protocolMp4MaxSecond;
  1048 + }
  1049 +
  1050 + public void setProtocolMp4MaxSecond(String protocolMp4MaxSecond) {
  1051 + this.protocolMp4MaxSecond = protocolMp4MaxSecond;
  1052 + }
  1053 +
  1054 + public String getProtocolMp4SavePath() {
  1055 + return protocolMp4SavePath;
  1056 + }
  1057 +
  1058 + public void setProtocolMp4SavePath(String protocolMp4SavePath) {
  1059 + this.protocolMp4SavePath = protocolMp4SavePath;
  1060 + }
  1061 +
  1062 + public String getProtocolHlsSavePath() {
  1063 + return protocolHlsSavePath;
  1064 + }
  1065 +
  1066 + public void setProtocolHlsSavePath(String protocolHlsSavePath) {
  1067 + this.protocolHlsSavePath = protocolHlsSavePath;
  1068 + }
  1069 +
  1070 + public String getProtocolHlsDemand() {
  1071 + return protocolHlsDemand;
  1072 + }
  1073 +
  1074 + public void setProtocolHlsDemand(String protocolHlsDemand) {
  1075 + this.protocolHlsDemand = protocolHlsDemand;
  1076 + }
  1077 +
  1078 + public String getProtocolRtspDemand() {
  1079 + return protocolRtspDemand;
  1080 + }
  1081 +
  1082 + public void setProtocolRtspDemand(String protocolRtspDemand) {
  1083 + this.protocolRtspDemand = protocolRtspDemand;
  1084 + }
  1085 +
  1086 + public String getProtocolRtmpDemand() {
  1087 + return protocolRtmpDemand;
  1088 + }
  1089 +
  1090 + public void setProtocolRtmpDemand(String protocolRtmpDemand) {
  1091 + this.protocolRtmpDemand = protocolRtmpDemand;
  1092 + }
  1093 +
  1094 + public String getProtocolTsDemand() {
  1095 + return protocolTsDemand;
  1096 + }
  1097 +
  1098 + public void setProtocolTsDemand(String protocolTsDemand) {
  1099 + this.protocolTsDemand = protocolTsDemand;
  1100 + }
  1101 +
  1102 + public String getProtocolFmp4Demand() {
  1103 + return protocolFmp4Demand;
  1104 + }
  1105 +
  1106 + public void setProtocolFmp4Demand(String protocolFmp4Demand) {
  1107 + this.protocolFmp4Demand = protocolFmp4Demand;
  1108 + }
  1109 +
  1110 + public String getGeneralResetWhenRePlay() {
  1111 + return generalResetWhenRePlay;
  1112 + }
  1113 +
  1114 + public void setGeneralResetWhenRePlay(String generalResetWhenRePlay) {
  1115 + this.generalResetWhenRePlay = generalResetWhenRePlay;
  1116 + }
  1117 +
  1118 + public String getGeneralMergeWriteMS() {
  1119 + return generalMergeWriteMS;
  1120 + }
  1121 +
  1122 + public void setGeneralMergeWriteMS(String generalMergeWriteMS) {
  1123 + this.generalMergeWriteMS = generalMergeWriteMS;
  1124 + }
  1125 +
  1126 + public String getGeneralWaitTrackReadyMs() {
  1127 + return generalWaitTrackReadyMs;
  1128 + }
  1129 +
  1130 + public void setGeneralWaitTrackReadyMs(String generalWaitTrackReadyMs) {
  1131 + this.generalWaitTrackReadyMs = generalWaitTrackReadyMs;
  1132 + }
  1133 +
  1134 + public String getGeneralWaitAddTrackMs() {
  1135 + return generalWaitAddTrackMs;
  1136 + }
  1137 +
  1138 + public void setGeneralWaitAddTrackMs(String generalWaitAddTrackMs) {
  1139 + this.generalWaitAddTrackMs = generalWaitAddTrackMs;
  1140 + }
  1141 +
  1142 + public String getGeneralUnreadyFrameCache() {
  1143 + return generalUnreadyFrameCache;
  1144 + }
  1145 +
  1146 + public void setGeneralUnreadyFrameCache(String generalUnreadyFrameCache) {
  1147 + this.generalUnreadyFrameCache = generalUnreadyFrameCache;
  1148 + }
  1149 +
  1150 + public String getHlsSegRetain() {
  1151 + return hlsSegRetain;
  1152 + }
  1153 +
  1154 + public void setHlsSegRetain(String hlsSegRetain) {
  1155 + this.hlsSegRetain = hlsSegRetain;
  1156 + }
  1157 +
  1158 + public String getHlsBroadcastRecordTs() {
  1159 + return hlsBroadcastRecordTs;
  1160 + }
  1161 +
  1162 + public void setHlsBroadcastRecordTs(String hlsBroadcastRecordTs) {
  1163 + this.hlsBroadcastRecordTs = hlsBroadcastRecordTs;
  1164 + }
  1165 +
  1166 + public String getHlsDeleteDelaySec() {
  1167 + return hlsDeleteDelaySec;
  1168 + }
  1169 +
  1170 + public void setHlsDeleteDelaySec(String hlsDeleteDelaySec) {
  1171 + this.hlsDeleteDelaySec = hlsDeleteDelaySec;
  1172 + }
  1173 +
  1174 + public String getHlsSegKeep() {
  1175 + return hlsSegKeep;
  1176 + }
  1177 +
  1178 + public void setHlsSegKeep(String hlsSegKeep) {
  1179 + this.hlsSegKeep = hlsSegKeep;
  1180 + }
  1181 +
  1182 + public String getHookOnServerStarted() {
  1183 + return hookOnServerStarted;
  1184 + }
  1185 +
  1186 + public void setHookOnServerStarted(String hookOnServerStarted) {
  1187 + this.hookOnServerStarted = hookOnServerStarted;
  1188 + }
  1189 +
  1190 + public String getHookOnServerKeepalive() {
  1191 + return hookOnServerKeepalive;
  1192 + }
  1193 +
  1194 + public void setHookOnServerKeepalive(String hookOnServerKeepalive) {
  1195 + this.hookOnServerKeepalive = hookOnServerKeepalive;
  1196 + }
  1197 +
  1198 + public String getHookOnSendRtpStopped() {
  1199 + return hookOnSendRtpStopped;
  1200 + }
  1201 +
  1202 + public void setHookOnSendRtpStopped(String hookOnSendRtpStopped) {
  1203 + this.hookOnSendRtpStopped = hookOnSendRtpStopped;
  1204 + }
  1205 +
  1206 + public String getHookOnRtpServerTimeout() {
  1207 + return hookOnRtpServerTimeout;
  1208 + }
  1209 +
  1210 + public void setHookOnRtpServerTimeout(String hookOnRtpServerTimeout) {
  1211 + this.hookOnRtpServerTimeout = hookOnRtpServerTimeout;
  1212 + }
816 1213 }
... ...
src/main/java/com/genersoft/iot/vmp/media/zlm/dto/hook/HookResultForOnPublish.java
... ... @@ -5,6 +5,7 @@ public class HookResultForOnPublish extends HookResult{
5 5 private boolean enable_audio;
6 6 private boolean enable_mp4;
7 7 private int mp4_max_second;
  8 + private String mp4_save_path;
8 9  
9 10 public HookResultForOnPublish() {
10 11 }
... ... @@ -41,4 +42,12 @@ public class HookResultForOnPublish extends HookResult{
41 42 public void setMp4_max_second(int mp4_max_second) {
42 43 this.mp4_max_second = mp4_max_second;
43 44 }
  45 +
  46 + public String getMp4_save_path() {
  47 + return mp4_save_path;
  48 + }
  49 +
  50 + public void setMp4_save_path(String mp4_save_path) {
  51 + this.mp4_save_path = mp4_save_path;
  52 + }
44 53 }
... ...
src/main/java/com/genersoft/iot/vmp/service/impl/MediaServerServiceImpl.java
... ... @@ -11,6 +11,7 @@ import com.genersoft.iot.vmp.conf.exception.ControllerException;
11 11 import com.genersoft.iot.vmp.gb28181.event.EventPublisher;
12 12 import com.genersoft.iot.vmp.gb28181.session.SsrcConfig;
13 13 import com.genersoft.iot.vmp.gb28181.session.VideoStreamSessionManager;
  14 +import com.genersoft.iot.vmp.media.zlm.AssistRESTfulUtils;
14 15 import com.genersoft.iot.vmp.media.zlm.ZLMRESTfulUtils;
15 16 import com.genersoft.iot.vmp.media.zlm.ZLMRTPServerFactory;
16 17 import com.genersoft.iot.vmp.media.zlm.ZLMServerConfig;
... ... @@ -38,6 +39,7 @@ import org.springframework.transaction.TransactionDefinition;
38 39 import org.springframework.transaction.TransactionStatus;
39 40 import org.springframework.util.ObjectUtils;
40 41  
  42 +import java.io.File;
41 43 import java.time.LocalDateTime;
42 44 import java.util.*;
43 45  
... ... @@ -64,6 +66,9 @@ public class MediaServerServiceImpl implements IMediaServerService {
64 66 private UserSetting userSetting;
65 67  
66 68 @Autowired
  69 + private AssistRESTfulUtils assistRESTfulUtils;
  70 +
  71 + @Autowired
67 72 private ZLMRESTfulUtils zlmresTfulUtils;
68 73  
69 74 @Autowired
... ... @@ -407,13 +412,27 @@ public class MediaServerServiceImpl implements IMediaServerService {
407 412 }
408 413 RedisUtil.set(key, serverItem);
409 414 resetOnlineServerItem(serverItem);
  415 +
  416 +
410 417 if (serverItem.isAutoConfig()) {
  418 + // 查看assist服务的录像路径配置
  419 + if (serverItem.getRecordAssistPort() > 0 && userSetting.getRecordPath() == null) {
  420 + JSONObject info = assistRESTfulUtils.getInfo(serverItem, null);
  421 + if (info != null && info.getInteger("code") != null && info.getInteger("code") == 0 ) {
  422 + JSONObject dataJson = info.getJSONObject("data");
  423 + if (dataJson != null) {
  424 + String recordPath = dataJson.getString("record");
  425 + userSetting.setRecordPath(recordPath);
  426 + }
  427 + }
  428 + }
411 429 setZLMConfig(serverItem, "0".equals(zlmServerConfig.getHookEnable()));
412 430 }
413 431 final String zlmKeepaliveKey = zlmKeepaliveKeyPrefix + serverItem.getId();
414 432 dynamicTask.stop(zlmKeepaliveKey);
415 433 dynamicTask.startDelay(zlmKeepaliveKey, new KeepAliveTimeoutRunnable(serverItem), (Math.getExponent(serverItem.getHookAliveInterval()) + 5) * 1000);
416 434 publisher.zlmOnlineEventPublish(serverItem.getId());
  435 +
417 436 logger.info("[ZLM] 连接成功 {} - {}:{} ",
418 437 zlmServerConfig.getGeneralMediaServerId(), zlmServerConfig.getIp(), zlmServerConfig.getHttpPort());
419 438 }
... ... @@ -584,6 +603,13 @@ public class MediaServerServiceImpl implements IMediaServerService {
584 603 param.put("rtp_proxy.port_range", mediaServerItem.getRtpPortRange().replace(",", "-"));
585 604 }
586 605  
  606 + if (userSetting.getRecordPath() != null) {
  607 + File recordPathFile = new File(userSetting.getRecordPath());
  608 + File mp4SavePathFile = recordPathFile.getParentFile().getAbsoluteFile();
  609 + param.put("protocol.mp4_save_path", mp4SavePathFile.getAbsoluteFile());
  610 + param.put("record.appName", recordPathFile.getName());
  611 + }
  612 +
587 613 JSONObject responseJSON = zlmresTfulUtils.setServerConfig(mediaServerItem, param);
588 614  
589 615 if (responseJSON != null && responseJSON.getInteger("code") == 0) {
... ...
src/main/java/com/genersoft/iot/vmp/utils/DateUtil.java
... ... @@ -45,7 +45,6 @@ public class DateUtil {
45 45  
46 46 public static String ISO8601Toyyyy_MM_dd_HH_mm_ss(String formatTime) {
47 47 return formatter.format(formatterCompatibleISO8601.parse(formatTime));
48   -
49 48 }
50 49  
51 50 /**
... ...
web_src/src/components/CloudRecordDetail.vue
... ... @@ -18,7 +18,7 @@
18 18 <i class="el-icon-video-camera" ></i>
19 19 {{ item.substring(0,17)}}
20 20 </el-tag>
21   - <a class="el-icon-download" style="color: #409EFF;font-weight: 600;margin-left: 10px;" :href="`${basePath}/download.html?url=record/${recordFile.app}/${recordFile.stream}/${chooseDate}/${item}`" target="_blank" />
  21 + <a class="el-icon-download" style="color: #409EFF;font-weight: 600;margin-left: 10px;" :href="`${getFileBasePath()}/download.html?url=download/${recordFile.app}/${recordFile.stream}/${chooseDate}/${item}`" target="_blank" />
22 22 </li>
23 23 </ul>
24 24 </div>
... ... @@ -76,7 +76,7 @@
76 76 <li class="task-list-item" v-for="(item, index) in taskListEnded" :key="index">
77 77 <div class="task-list-item-box" style="height: 2rem;line-height: 2rem;">
78 78 <span>{{ item.startTime.substr(10) }}-{{item.endTime.substr(10)}}</span>
79   - <a class="el-icon-download download-btn" :href="mediaServerPath + '/download.html?url=../' + item.recordFile" target="_blank">
  79 + <a class="el-icon-download download-btn" :href="getFileBasePath() + '/download.html?url=download/' + item.recordFile" target="_blank">
80 80 </a>
81 81 </div>
82 82 </li>
... ... @@ -107,15 +107,15 @@
107 107 import uiHeader from '../layout/UiHeader.vue'
108 108 import player from './dialog/easyPlayer.vue'
109 109 import moment from 'moment'
  110 + import axios from "axios";
110 111 export default {
111 112 name: 'app',
112 113 components: {
113 114 uiHeader, player
114 115 },
115   - props: ['recordFile', 'mediaServerId', 'dateFiles', 'mediaServerPath'],
  116 + props: ['recordFile', 'mediaServerId', 'dateFiles'],
116 117 data() {
117 118 return {
118   - basePath: `${this.mediaServerPath}`,
119 119 dateFilesObj: [],
120 120 detailFiles: [],
121 121 chooseDate: null,
... ... @@ -267,13 +267,23 @@
267 267 if (file == null) {
268 268 this.videoUrl = "";
269 269 }else {
270   - // TODO 控制列表滚动条
271   - this.videoUrl = `${this.basePath}/record/${this.recordFile.app}/${this.recordFile.stream}/${this.chooseDate}/${this.choosedFile}`
  270 + this.videoUrl = `${this.getFileBasePath()}/download/${this.recordFile.app}/${this.recordFile.stream}/${this.chooseDate}/${this.choosedFile}`
  271 +
272 272 console.log(this.videoUrl)
273 273 }
274 274  
275 275 },
276 276  
  277 + getFileBasePath(){
  278 + let basePath = ""
  279 + if (axios.defaults.baseURL.startsWith("http")) {
  280 + basePath = `${axios.defaults.baseURL}/record_proxy/${this.mediaServerId}`
  281 + }else {
  282 + basePath = `${window.location.origin}${axios.defaults.baseURL}/record_proxy/${this.mediaServerId}`
  283 + }
  284 + return basePath;
  285 + },
  286 +
277 287 getDataWidth(item){
278 288 let timeForFile = this.getTimeForFile(item);
279 289 let result = (timeForFile[2])/((this.sliderMax - this.sliderMIn)*1000)
... ...