Commit 2adf245989f6939ff997885e9e1ee08eae4adde1
1 parent
a0aaf5ab
优化推流鉴权对后续录像查询的影响
Showing
3 changed files
with
57 additions
and
10 deletions
src/main/java/top/panll/assist/config/StartConfig.java
| @@ -73,7 +73,7 @@ public class StartConfig implements CommandLineRunner { | @@ -73,7 +73,7 @@ public class StartConfig implements CommandLineRunner { | ||
| 73 | File[] files = dateFile.listFiles(); | 73 | File[] files = dateFile.listFiles(); |
| 74 | if (files != null && files.length > 0) { | 74 | if (files != null && files.length > 0) { |
| 75 | for (File file : files) { | 75 | for (File file : files) { |
| 76 | - videoFileService.handFile(file); | 76 | + videoFileService.handFile(file, appFile.getName(), streamFile.getName()); |
| 77 | } | 77 | } |
| 78 | } | 78 | } |
| 79 | } | 79 | } |
src/main/java/top/panll/assist/controller/RecordController.java
| @@ -18,6 +18,7 @@ import top.panll.assist.dto.SignInfo; | @@ -18,6 +18,7 @@ import top.panll.assist.dto.SignInfo; | ||
| 18 | import top.panll.assist.dto.SpaceInfo; | 18 | import top.panll.assist.dto.SpaceInfo; |
| 19 | import top.panll.assist.service.VideoFileService; | 19 | import top.panll.assist.service.VideoFileService; |
| 20 | import top.panll.assist.utils.PageInfo; | 20 | import top.panll.assist.utils.PageInfo; |
| 21 | +import top.panll.assist.utils.RedisUtil; | ||
| 21 | 22 | ||
| 22 | import javax.servlet.http.HttpServletRequest; | 23 | import javax.servlet.http.HttpServletRequest; |
| 23 | import java.io.File; | 24 | import java.io.File; |
| @@ -38,6 +39,9 @@ public class RecordController { | @@ -38,6 +39,9 @@ public class RecordController { | ||
| 38 | @Autowired | 39 | @Autowired |
| 39 | private VideoFileService videoFileService; | 40 | private VideoFileService videoFileService; |
| 40 | 41 | ||
| 42 | + @Autowired | ||
| 43 | + private RedisUtil redisUtil; | ||
| 44 | + | ||
| 41 | private SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); | 45 | private SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); |
| 42 | 46 | ||
| 43 | 47 | ||
| @@ -390,9 +394,11 @@ public class RecordController { | @@ -390,9 +394,11 @@ public class RecordController { | ||
| 390 | ret.put("code", 0); | 394 | ret.put("code", 0); |
| 391 | ret.put("msg", "success"); | 395 | ret.put("msg", "success"); |
| 392 | String file_path = json.getString("file_path"); | 396 | String file_path = json.getString("file_path"); |
| 397 | + String app = json.getString("app"); | ||
| 398 | + String stream = json.getString("stream"); | ||
| 393 | logger.debug("ZLM 录制完成,参数:" + file_path); | 399 | logger.debug("ZLM 录制完成,参数:" + file_path); |
| 394 | if (file_path == null) return new ResponseEntity<String>(ret.toString(), HttpStatus.OK); | 400 | if (file_path == null) return new ResponseEntity<String>(ret.toString(), HttpStatus.OK); |
| 395 | - videoFileService.handFile(new File(file_path)); | 401 | + videoFileService.handFile(new File(file_path), app, stream); |
| 396 | 402 | ||
| 397 | return new ResponseEntity<String>(ret.toString(), HttpStatus.OK); | 403 | return new ResponseEntity<String>(ret.toString(), HttpStatus.OK); |
| 398 | } | 404 | } |
| @@ -432,4 +438,22 @@ public class RecordController { | @@ -432,4 +438,22 @@ public class RecordController { | ||
| 432 | ret.put("data", duration); | 438 | ret.put("data", duration); |
| 433 | return new ResponseEntity<>(ret.toString(), HttpStatus.OK); | 439 | return new ResponseEntity<>(ret.toString(), HttpStatus.OK); |
| 434 | } | 440 | } |
| 441 | + | ||
| 442 | + /** | ||
| 443 | + * 增加推流的鉴权信息,用于录像存储使用 | ||
| 444 | + */ | ||
| 445 | + @ApiOperation("增加推流的鉴权信息") | ||
| 446 | + @ApiImplicitParams({ | ||
| 447 | + @ApiImplicitParam(name="app", value = "应用名", required = true, dataTypeClass = String.class), | ||
| 448 | + @ApiImplicitParam(name="stream", value = "流ID", required = true, dataTypeClass = String.class), | ||
| 449 | + @ApiImplicitParam(name="callId", value = "录像自鉴权ID", required = true, dataTypeClass = String.class), | ||
| 450 | + }) | ||
| 451 | + @ResponseBody | ||
| 452 | + @GetMapping(value = "/addStreamCallInfo", produces = "application/json;charset=UTF-8") | ||
| 453 | + @PostMapping(value = "/addStreamCallInfo", produces = "application/json;charset=UTF-8") | ||
| 454 | + public ResponseEntity<String> addStreamCallInfo(String app, String stream, String callId) { | ||
| 455 | + String key = "Stream_Call_Info" + app + "_" + stream; | ||
| 456 | + redisUtil.set(key, callId, -1); | ||
| 457 | + return new ResponseEntity<>(null, HttpStatus.OK); | ||
| 458 | + } | ||
| 435 | } | 459 | } |
src/main/java/top/panll/assist/service/VideoFileService.java
| @@ -131,10 +131,11 @@ public class VideoFileService { | @@ -131,10 +131,11 @@ public class VideoFileService { | ||
| 131 | * @param file | 131 | * @param file |
| 132 | * @throws ParseException | 132 | * @throws ParseException |
| 133 | */ | 133 | */ |
| 134 | - public void handFile(File file) { | 134 | + public void handFile(File file,String app, String stream) { |
| 135 | FFprobe ffprobe = ffmpegExecUtils.getFfprobe(); | 135 | FFprobe ffprobe = ffmpegExecUtils.getFfprobe(); |
| 136 | if(file.exists() && file.isFile() && !file.getName().startsWith(".")&& file.getName().endsWith(".mp4") && file.getName().indexOf(":") < 0) { | 136 | if(file.exists() && file.isFile() && !file.getName().startsWith(".")&& file.getName().endsWith(".mp4") && file.getName().indexOf(":") < 0) { |
| 137 | try { | 137 | try { |
| 138 | + | ||
| 138 | FFmpegProbeResult in = ffprobe.probe(file.getAbsolutePath()); | 139 | FFmpegProbeResult in = ffprobe.probe(file.getAbsolutePath()); |
| 139 | double duration = in.getFormat().duration * 1000; | 140 | double duration = in.getFormat().duration * 1000; |
| 140 | String endTimeStr = file.getName().replace(".mp4", ""); | 141 | String endTimeStr = file.getName().replace(".mp4", ""); |
| @@ -149,9 +150,23 @@ public class VideoFileService { | @@ -149,9 +150,23 @@ public class VideoFileService { | ||
| 149 | long endTime = startTime + durationLong; | 150 | long endTime = startTime + durationLong; |
| 150 | endTime = endTime - endTime%1000; | 151 | endTime = endTime - endTime%1000; |
| 151 | 152 | ||
| 152 | - String newName = file.getAbsolutePath().replace(file.getName(), | ||
| 153 | - simpleDateFormat.format(startTime) + "-" + simpleDateFormat.format(endTime) + "-" + durationLong + ".mp4"); | ||
| 154 | - file.renameTo(new File(newName)); | 153 | + String key = "Stream_Call_Info" + app + "_" + stream; |
| 154 | + String callId = (String) redisUtil.get(key); | ||
| 155 | + if (callId != null) { | ||
| 156 | + | ||
| 157 | + File newPath = new File(file.getParentFile().getParent() + "_" + callId + File.separator + file.getParentFile().getName()); | ||
| 158 | + if (!newPath.exists()) { | ||
| 159 | + newPath.mkdirs(); | ||
| 160 | + } | ||
| 161 | + String newName = newPath.getAbsolutePath() + File.separator+ simpleDateFormat.format(startTime) + "-" + simpleDateFormat.format(endTime) + "-" + durationLong + ".mp4"; | ||
| 162 | + file.renameTo(new File(newName)); | ||
| 163 | + }else { | ||
| 164 | + String newName = file.getAbsolutePath().replace(file.getName(), | ||
| 165 | + simpleDateFormat.format(startTime) + "-" + simpleDateFormat.format(endTime) + "-" + durationLong + ".mp4"); | ||
| 166 | + | ||
| 167 | + file.renameTo(new File(newName)); | ||
| 168 | + } | ||
| 169 | + | ||
| 155 | logger.debug("[处理文件] {}", file.getName()); | 170 | logger.debug("[处理文件] {}", file.getName()); |
| 156 | } catch (IOException e) { | 171 | } catch (IOException e) { |
| 157 | logger.warn("文件可能以损坏[{}]", file.getAbsolutePath()); | 172 | logger.warn("文件可能以损坏[{}]", file.getAbsolutePath()); |
| @@ -340,7 +355,9 @@ public class VideoFileService { | @@ -340,7 +355,9 @@ public class VideoFileService { | ||
| 340 | logger.info("[录像合并] 开始合并,APP:{}, STREAM: {}, 任务ID:{}", app, stream, taskId); | 355 | logger.info("[录像合并] 开始合并,APP:{}, STREAM: {}, 任务ID:{}", app, stream, taskId); |
| 341 | String destDir = "recordTemp" + File.separator + taskId + File.separator + app; | 356 | String destDir = "recordTemp" + File.separator + taskId + File.separator + app; |
| 342 | File recordFile = new File(new File(userSettings.getRecord()).getParentFile().getAbsolutePath() + File.separator + destDir ); | 357 | File recordFile = new File(new File(userSettings.getRecord()).getParentFile().getAbsolutePath() + File.separator + destDir ); |
| 343 | - if (!recordFile.exists()) recordFile.mkdirs(); | 358 | + if (!recordFile.exists()) { |
| 359 | + recordFile.mkdirs(); | ||
| 360 | + } | ||
| 344 | MergeOrCutTaskInfo mergeOrCutTaskInfo = new MergeOrCutTaskInfo(); | 361 | MergeOrCutTaskInfo mergeOrCutTaskInfo = new MergeOrCutTaskInfo(); |
| 345 | mergeOrCutTaskInfo.setId(taskId); | 362 | mergeOrCutTaskInfo.setId(taskId); |
| 346 | mergeOrCutTaskInfo.setApp(app); | 363 | mergeOrCutTaskInfo.setApp(app); |
| @@ -474,9 +491,15 @@ public class VideoFileService { | @@ -474,9 +491,15 @@ public class VideoFileService { | ||
| 474 | 491 | ||
| 475 | public List<MergeOrCutTaskInfo> getTaskListForDownload(Boolean idEnd, String app, String stream, String taskId) { | 492 | public List<MergeOrCutTaskInfo> getTaskListForDownload(Boolean idEnd, String app, String stream, String taskId) { |
| 476 | ArrayList<MergeOrCutTaskInfo> result = new ArrayList<>(); | 493 | ArrayList<MergeOrCutTaskInfo> result = new ArrayList<>(); |
| 477 | - if (app == null) app = "*"; | ||
| 478 | - if (stream == null) stream = "*"; | ||
| 479 | - if (taskId == null) taskId = "*"; | 494 | + if (app == null) { |
| 495 | + app = "*"; | ||
| 496 | + } | ||
| 497 | + if (stream == null) { | ||
| 498 | + stream = "*"; | ||
| 499 | + } | ||
| 500 | + if (taskId == null) { | ||
| 501 | + taskId = "*"; | ||
| 502 | + } | ||
| 480 | List<Object> taskCatch = redisUtil.scan(String.format("%S_%S_%S_%S", keyStr, app, stream, taskId)); | 503 | List<Object> taskCatch = redisUtil.scan(String.format("%S_%S_%S_%S", keyStr, app, stream, taskId)); |
| 481 | for (int i = 0; i < taskCatch.size(); i++) { | 504 | for (int i = 0; i < taskCatch.size(); i++) { |
| 482 | String keyItem = taskCatch.get(i).toString(); | 505 | String keyItem = taskCatch.get(i).toString(); |