Commit ede562fc6099abadea033202d10e0a607943d5e8

Authored by 648540858
1 parent 061b35eb

修改下载文件名格式为:stream_callId.mp4, 查询合并文件列表增加app,stream, callId过滤参数

src/main/java/top/panll/assist/controller/RecordController.java
... ... @@ -73,9 +73,12 @@ public class RecordController {
73 73 @GetMapping(value = "/file/download/task/list")
74 74 @ResponseBody
75 75 public List<MergeOrCutTaskInfo> getTaskListForDownload(
  76 + @RequestParam(required = false) String app,
  77 + @RequestParam(required = false) String stream,
  78 + @RequestParam(required = false) String callId,
76 79 @RequestParam(required = false) String taskId,
77 80 @RequestParam(required = false) Boolean isEnd){
78   - List<MergeOrCutTaskInfo> taskList = videoFileService.getTaskListForDownload(isEnd, taskId);
  81 + List<MergeOrCutTaskInfo> taskList = videoFileService.getTaskListForDownload(app, stream, callId, isEnd, taskId);
79 82 if (taskList == null) {
80 83 throw new ControllerException(ErrorCode.ERROR100);
81 84 }
... ...
src/main/java/top/panll/assist/service/FFmpegExecUtils.java
... ... @@ -77,7 +77,7 @@ public class FFmpegExecUtils implements InitializingBean{
77 77 }
78 78  
79 79 @Async
80   - public void mergeOrCutFile(List<File> fils, File dest, String destFileName, VideoHandEndCallBack callBack){
  80 + public void mergeOrCutFile(List<File> fils, File dest, String destFileName, VideoHandEndCallBack callBack){
81 81  
82 82 if (fils == null || fils.size() == 0 || ffmpeg == null || ffprobe == null || dest== null || !dest.exists()){
83 83 callBack.run("error", 0.0, null);
... ... @@ -129,15 +129,15 @@ public class FFmpegExecUtils implements InitializingBean{
129 129 double percentage = progress.out_time_ns / duration_ns;
130 130  
131 131 // Print out interesting information about the progress
132   - System.out.println(String.format(
133   - "[%.0f%%] status:%s frame:%d time:%s ms fps:%.0f speed:%.2fx",
134   - percentage * 100,
135   - progress.status,
136   - progress.frame,
137   - FFmpegUtils.toTimecode(progress.out_time_ns, TimeUnit.NANOSECONDS),
138   - progress.fps.doubleValue(),
139   - progress.speed
140   - ));
  132 +// System.out.println(String.format(
  133 +// "[%.0f%%] status:%s frame:%d time:%s ms fps:%.0f speed:%.2fx",
  134 +// percentage * 100,
  135 +// progress.status,
  136 +// progress.frame,
  137 +// FFmpegUtils.toTimecode(progress.out_time_ns, TimeUnit.NANOSECONDS),
  138 +// progress.fps.doubleValue(),
  139 +// progress.speed
  140 +// ));
141 141  
142 142 if (progress.status.equals(Progress.Status.END)){
143 143 callBack.run(progress.status.name(), percentage, recordFileResultPath);
... ...
src/main/java/top/panll/assist/service/VideoFileService.java
... ... @@ -10,6 +10,7 @@ import org.springframework.beans.factory.annotation.Autowired;
10 10 import org.springframework.data.redis.core.RedisTemplate;
11 11 import org.springframework.stereotype.Service;
12 12 import org.springframework.util.DigestUtils;
  13 +import org.springframework.util.ObjectUtils;
13 14 import top.panll.assist.controller.bean.ControllerException;
14 15 import top.panll.assist.controller.bean.ErrorCode;
15 16 import top.panll.assist.dto.*;
... ... @@ -211,22 +212,24 @@ public class VideoFileService {
211 212 assert videoTaskInfo.getFilePathList() != null;
212 213 assert !videoTaskInfo.getFilePathList().isEmpty();
213 214 String taskId = DigestUtils.md5DigestAsHex(String.valueOf(System.currentTimeMillis()).getBytes());
214   - logger.info("[录像合并] 开始合并, 任务ID:{}: ", taskId);
  215 + String logInfo = String.format("app: %S, stream: %S, callId: %S, 任务ID:%S",
  216 + videoTaskInfo.getApp(), videoTaskInfo.getStream(), videoTaskInfo.getCallId(), taskId);
  217 + logger.info("[录像合并] 开始合并,{} ", logInfo);
215 218 List<File> fileList = new ArrayList<>();
216 219 for (String filePath : videoTaskInfo.getFilePathList()) {
217 220 File file = new File(filePath);
218 221 if (!file.exists()) {
219   - logger.info("[录像合并] 失败, 任务ID:{}, 文件不存在: {}", taskId, filePath);
  222 + logger.info("[录像合并] 失败,{} ", logInfo);
220 223 throw new ControllerException(ErrorCode.ERROR100.getCode(), filePath + "文件不存在");
221 224 }
222   - logger.info("[录像合并] 添加文件, 任务ID:{}, 文件: {}", taskId, filePath);
  225 + logger.info("[录像合并] 添加文件,{}, 文件: {}", logInfo, filePath);
223 226 fileList.add(file);
224 227 }
225 228  
226 229 File recordFile = new File(userSettings.getRecordTempPath() );
227 230 if (!recordFile.exists()) {
228 231 if (!recordFile.mkdirs()) {
229   - logger.info("[录像合并] 失败, 任务ID:{}, 创建临时目录失败", taskId);
  232 + logger.info("[录像合并] 失败,{}, 创建临时目录失败", logInfo);
230 233 throw new ControllerException(ErrorCode.ERROR100.getCode(), "创建临时目录失败");
231 234 }
232 235 }
... ... @@ -238,29 +241,30 @@ public class VideoFileService {
238 241 mergeOrCutTaskInfo.setStartTime(videoTaskInfo.getStartTime());
239 242 mergeOrCutTaskInfo.setEndTime(videoTaskInfo.getEndTime());
240 243 mergeOrCutTaskInfo.setCreateTime(simpleDateFormatForTime.format(System.currentTimeMillis()));
  244 + String destFileName = videoTaskInfo.getStream() + "_" + videoTaskInfo.getCallId();
241 245 if (fileList.size() == 1) {
242 246  
243 247 // 文件只有一个则不合并,直接复制过去
244 248 mergeOrCutTaskInfo.setPercentage("1");
245 249 // 处理文件路径
246   - String recordFileResultPath = recordFile.getAbsolutePath() + File.separator + taskId + ".mp4";
247   - String relativize = taskId + ".mp4";
  250 +
  251 + String recordFileResultPath = recordFile.getAbsolutePath() + File.separator + destFileName + ".mp4";
248 252 try {
249 253 Files.copy(fileList.get(0).toPath(), Paths.get(recordFileResultPath));
250 254 } catch (IOException e) {
251   - logger.info("[录像合并] 失败, 任务ID:{}", taskId, e);
  255 + logger.info("[录像合并] 失败, {}", logInfo, e);
252 256 throw new ControllerException(ErrorCode.ERROR100.getCode(), e.getMessage());
253 257 }
254   - mergeOrCutTaskInfo.setRecordFile("/download/" + relativize.toString());
  258 + mergeOrCutTaskInfo.setRecordFile("/download/" + destFileName + ".mp4");
255 259 if (videoTaskInfo.getRemoteHost() != null) {
256   - mergeOrCutTaskInfo.setDownloadFile(videoTaskInfo.getRemoteHost() + "/download.html?url=download/" + relativize);
257   - mergeOrCutTaskInfo.setPlayFile(videoTaskInfo.getRemoteHost() + "/download/" + relativize);
  260 + mergeOrCutTaskInfo.setDownloadFile(videoTaskInfo.getRemoteHost() + "/download.html?url=download/" + destFileName + ".mp4");
  261 + mergeOrCutTaskInfo.setPlayFile(videoTaskInfo.getRemoteHost() + "/download/" + destFileName + ".mp4");
258 262 }
259 263 String key = String.format("%S_%S_%S", AssistConstants.MERGEORCUT , userSettings.getId(), mergeOrCutTaskInfo.getId());
260 264 redisUtil.set(key, mergeOrCutTaskInfo);
261 265 logger.info("[录像合并] 成功, 任务ID:{}", taskId);
262 266 }else {
263   - ffmpegExecUtils.mergeOrCutFile(fileList, recordFile, taskId, (status, percentage, result)->{
  267 + ffmpegExecUtils.mergeOrCutFile(fileList, recordFile, destFileName, (status, percentage, result)->{
264 268 // 发出redis通知
265 269 if (status.equals(Progress.Status.END.name())) {
266 270 mergeOrCutTaskInfo.setPercentage("1");
... ... @@ -272,7 +276,7 @@ public class VideoFileService {
272 276 mergeOrCutTaskInfo.setDownloadFile(videoTaskInfo.getRemoteHost() + "/download.html?url=download/" + relativize);
273 277 mergeOrCutTaskInfo.setPlayFile(videoTaskInfo.getRemoteHost() + "/download/" + relativize);
274 278 }
275   - logger.info("[录像合并] 成功, 任务ID:{}", taskId);
  279 + logger.info("[录像合并] 成功, {}", logInfo);
276 280 }else {
277 281 mergeOrCutTaskInfo.setPercentage(percentage + "");
278 282 }
... ... @@ -336,7 +340,9 @@ public class VideoFileService {
336 340 return dateFileList;
337 341 }
338 342  
339   - public List<MergeOrCutTaskInfo> getTaskListForDownload(Boolean idEnd, String taskId) {
  343 + public List<MergeOrCutTaskInfo> getTaskListForDownload(String app, String stream, String callId, Boolean isEnd, String taskId) {
  344 + logger.info("[查询录像合成列表] app: {}, stream: {}, callId: {}, isEnd: {}, taskId: {}",
  345 + app, stream, callId, isEnd, taskId);
340 346 ArrayList<MergeOrCutTaskInfo> result = new ArrayList<>();
341 347 if (taskId == null) {
342 348 taskId = "*";
... ... @@ -346,19 +352,27 @@ public class VideoFileService {
346 352 for (int i = 0; i < taskCatch.size(); i++) {
347 353 String keyItem = taskCatch.get(i).toString();
348 354 MergeOrCutTaskInfo mergeOrCutTaskInfo = (MergeOrCutTaskInfo)redisUtil.get(keyItem);
349   - if (mergeOrCutTaskInfo != null && mergeOrCutTaskInfo.getPercentage() != null){
350   - if (idEnd != null ) {
351   - if (idEnd) {
352   - if (Double.parseDouble(mergeOrCutTaskInfo.getPercentage()) == 1){
353   - result.add(mergeOrCutTaskInfo);
  355 + if (mergeOrCutTaskInfo != null){
  356 + if ((!ObjectUtils.isEmpty(app) && !mergeOrCutTaskInfo.getApp().equals(app))
  357 + || (!ObjectUtils.isEmpty(stream) && !mergeOrCutTaskInfo.getStream().equals(stream))
  358 + || (!ObjectUtils.isEmpty(callId) && !mergeOrCutTaskInfo.getCallId().equals(callId))
  359 + ) {
  360 + continue;
  361 + }
  362 + if (mergeOrCutTaskInfo.getPercentage() != null){
  363 + if (isEnd != null ) {
  364 + if (isEnd) {
  365 + if (Double.parseDouble(mergeOrCutTaskInfo.getPercentage()) == 1){
  366 + result.add(mergeOrCutTaskInfo);
  367 + }
  368 + }else {
  369 + if (Double.parseDouble(mergeOrCutTaskInfo.getPercentage()) < 1){
  370 + result.add((MergeOrCutTaskInfo)redisUtil.get(keyItem));
  371 + }
354 372 }
355 373 }else {
356   - if (Double.parseDouble(mergeOrCutTaskInfo.getPercentage()) < 1){
357   - result.add((MergeOrCutTaskInfo)redisUtil.get(keyItem));
358   - }
  374 + result.add((MergeOrCutTaskInfo)redisUtil.get(keyItem));
359 375 }
360   - }else {
361   - result.add((MergeOrCutTaskInfo)redisUtil.get(keyItem));
362 376 }
363 377 }
364 378 }
... ...