From c593e0c7e9d62a1bfc4316ff62085d1ed036f8d3 Mon Sep 17 00:00:00 2001 From: Jerry Yan <792602257@qq.com> Date: Tue, 9 Sep 2025 12:17:08 +0800 Subject: [PATCH 1/6] =?UTF-8?q?fix(task):=20=E4=BF=AE=E5=A4=8D=E5=B7=A1?= =?UTF-8?q?=E9=80=BB=E6=97=B6=E9=95=BF=E8=AE=A1=E7=AE=97=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 将 endDate 的计算方式从 0 分钟偏移改为 1 分钟偏移 - 这样可以确保包含第一张人脸采样图片在内的时间区间为 [startDate, endDate)- 从而更准确地计算巡逻时长 --- .../com/ycwl/basic/service/task/impl/TaskFaceServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/ycwl/basic/service/task/impl/TaskFaceServiceImpl.java b/src/main/java/com/ycwl/basic/service/task/impl/TaskFaceServiceImpl.java index fdc1f28..44f4beb 100644 --- a/src/main/java/com/ycwl/basic/service/task/impl/TaskFaceServiceImpl.java +++ b/src/main/java/com/ycwl/basic/service/task/impl/TaskFaceServiceImpl.java @@ -234,7 +234,7 @@ public class TaskFaceServiceImpl implements TaskFaceService { if (tourMinutes > 0) { List acceptFaceSampleList = faceSampleMapper.listByIds(acceptFaceSampleIds); Date startDate = DateUtil.offsetMinute(firstFaceSample.get().getCreateAt(), -tourMinutes); - Date endDate = DateUtil.offsetMinute(firstFaceSample.get().getCreateAt(), 0); + Date endDate = DateUtil.offsetMinute(firstFaceSample.get().getCreateAt(), 1); acceptFaceSampleIds = acceptFaceSampleList.stream() .filter(faceSample -> faceSample.getCreateAt().after(startDate) && faceSample.getCreateAt().before(endDate)) .map(FaceSampleEntity::getId) From 1e3d2e9e3aec0f94caeed30d95bb2d9c09d5b33d Mon Sep 17 00:00:00 2001 From: Jerry Yan <792602257@qq.com> Date: Tue, 9 Sep 2025 12:52:45 +0800 Subject: [PATCH 2/6] =?UTF-8?q?perf(task):=20=E8=B0=83=E6=95=B4=20FFmpeg?= =?UTF-8?q?=20=E5=91=BD=E4=BB=A4=E5=8F=82=E6=95=B0=E9=A1=BA=E5=BA=8F?= =?UTF-8?q?=E4=BB=A5=E4=BC=98=E5=8C=96=E8=A7=86=E9=A2=91=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 将 -ss 参数移到 -i 参数之前,以提高视频处理效率 -这种修改可以减少 FFmpeg 在处理视频时的计算量,从而加快处理速度 --- src/main/java/com/ycwl/basic/task/VideoPieceGetter.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/ycwl/basic/task/VideoPieceGetter.java b/src/main/java/com/ycwl/basic/task/VideoPieceGetter.java index 6259ff9..7e1cb09 100644 --- a/src/main/java/com/ycwl/basic/task/VideoPieceGetter.java +++ b/src/main/java/com/ycwl/basic/task/VideoPieceGetter.java @@ -522,13 +522,13 @@ public class VideoPieceGetter { ffmpegCmd.add("ffmpeg"); ffmpegCmd.add("-hide_banner"); ffmpegCmd.add("-y"); + ffmpegCmd.add("-ss"); + ffmpegCmd.add(offset.toPlainString()); ffmpegCmd.add("-i"); ffmpegCmd.add(inputFile); ffmpegCmd.add("-c:v"); ffmpegCmd.add("copy"); ffmpegCmd.add("-an"); - ffmpegCmd.add("-ss"); - ffmpegCmd.add(offset.toPlainString()); ffmpegCmd.add("-t"); ffmpegCmd.add(length.toPlainString()); ffmpegCmd.add("-f"); From 3697093bed9208c12a554e36937781122de4b584 Mon Sep 17 00:00:00 2001 From: Jerry Yan <792602257@qq.com> Date: Tue, 9 Sep 2025 12:59:55 +0800 Subject: [PATCH 3/6] =?UTF-8?q?refactor(task):=20=E7=A7=BB=E9=99=A4?= =?UTF-8?q?=E8=A7=86=E9=A2=91=E4=B8=8A=E4=BC=A0=E7=9B=B8=E5=85=B3=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 删除了 TaskTaskServiceImpl 中的视频上传调用 - 移除了 VideoReUploader 中的 addVideoTask 方法和相关代码 - 优化了代码结构,减少了不必要的导入 --- .../task/impl/TaskTaskServiceImpl.java | 1 - .../com/ycwl/basic/utils/VideoReUploader.java | 43 ------------------- 2 files changed, 44 deletions(-) diff --git a/src/main/java/com/ycwl/basic/service/task/impl/TaskTaskServiceImpl.java b/src/main/java/com/ycwl/basic/service/task/impl/TaskTaskServiceImpl.java index 3e07afd..0f14633 100644 --- a/src/main/java/com/ycwl/basic/service/task/impl/TaskTaskServiceImpl.java +++ b/src/main/java/com/ycwl/basic/service/task/impl/TaskTaskServiceImpl.java @@ -492,7 +492,6 @@ public class TaskTaskServiceImpl implements TaskService { String hash = MD5.create().digestHex(task.getTaskParams()); String filename = StorageUtil.joinPath(StorageConstant.VLOG_PATH, hash + "_" + task.getScenicId() + ".mp4"); adapter.setAcl(StorageAcl.PUBLIC_READ, filename); - videoReUploader.addVideoTask(video.getId()); int isBuy = 0; FaceEntity face = faceRepository.getFace(task.getFaceId()); if (face != null) { diff --git a/src/main/java/com/ycwl/basic/utils/VideoReUploader.java b/src/main/java/com/ycwl/basic/utils/VideoReUploader.java index fe2d462..9169074 100644 --- a/src/main/java/com/ycwl/basic/utils/VideoReUploader.java +++ b/src/main/java/com/ycwl/basic/utils/VideoReUploader.java @@ -7,15 +7,12 @@ import com.ycwl.basic.mapper.SourceMapper; import com.ycwl.basic.mapper.VideoMapper; import com.ycwl.basic.model.pc.scenic.entity.ScenicConfigEntity; import com.ycwl.basic.model.pc.source.entity.SourceEntity; -import com.ycwl.basic.model.pc.video.entity.VideoEntity; import com.ycwl.basic.repository.ScenicRepository; import com.ycwl.basic.repository.VideoRepository; import com.ycwl.basic.service.pc.ScenicService; import com.ycwl.basic.storage.adapters.IStorageAdapter; -import com.ycwl.basic.storage.enums.StorageAcl; import com.ycwl.basic.storage.utils.StorageUtil; import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.Strings; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -94,44 +91,4 @@ public class VideoReUploader { } }); } - public void addVideoTask(Long videoId) { - VideoEntity entity = videoMapper.getEntity(videoId); - if (entity == null) { - return; - } - if (entity.getScenicId() == null) { - return; - } - final String dstFilePath = StorageUtil.joinPath(StorageConstant.VLOG_PATH, entity.getTaskId() + "_" + entity.getScenicId() + ".mp4"); - final IStorageAdapter adapter = scenicService.getScenicStorageAdapter(entity.getScenicId()); - if (Strings.CS.equals(entity.getVideoUrl(), adapter.getUrl(dstFilePath))) { - return; - } - String tmpFilePath = UUID.randomUUID().toString(); - executor.execute(() -> { - // 先下载,后上传 - File dstFile = new File(tmpFilePath); - log.info("下载视频:{};videoId:{}", entity.getVideoUrl(), videoId); - long size = HttpUtil.downloadFile(entity.getVideoUrl(), dstFile); - log.info("下载视频完成:{};大小:{};videoId:{}", entity.getVideoUrl(), size, videoId); - try { - log.info("开始上传:{};videoId:{}", dstFilePath, videoId); - String newUrl = adapter.uploadFile("video/mp4", dstFile, dstFilePath); - adapter.setAcl(StorageAcl.PUBLIC_READ, dstFilePath); - log.info("上传成功:{};videoId:{}", newUrl, videoId); - VideoEntity updateEntity = new VideoEntity(); - updateEntity.setId(videoId); - updateEntity.setVideoUrl(newUrl); - videoMapper.update(updateEntity); - } catch (Exception e) { - log.info("上传失败:{};videoId:{}", dstFilePath, videoId, e); - } finally { - videoRepository.clearVideoCache(videoId); - try { - dstFile.delete(); - } catch (Exception ignored) { - } - } - }); - } } From 9587354d0a0efe80abefac375aad9d0638dccbf4 Mon Sep 17 00:00:00 2001 From: Jerry Yan <792602257@qq.com> Date: Tue, 9 Sep 2025 13:08:42 +0800 Subject: [PATCH 4/6] =?UTF-8?q?fix(device):=20=E4=BF=AE=E5=A4=8D=E9=98=BF?= =?UTF-8?q?=E9=87=8C=E4=BA=91=20OSS=20=E6=96=87=E4=BB=B6=E6=A3=80=E7=B4=A2?= =?UTF-8?q?=E5=92=8C=E8=BF=9E=E6=8E=A5=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 修改 AliOssStorageOperator 中的时间增量,从分钟改为天 - 在 DeviceFactory 中为阿里云 OSS操作器添加域名替换,以解决连接问题 --- src/main/java/com/ycwl/basic/device/DeviceFactory.java | 2 +- .../com/ycwl/basic/device/operator/AliOssStorageOperator.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/ycwl/basic/device/DeviceFactory.java b/src/main/java/com/ycwl/basic/device/DeviceFactory.java index e37bf5a..cb0ff6f 100644 --- a/src/main/java/com/ycwl/basic/device/DeviceFactory.java +++ b/src/main/java/com/ycwl/basic/device/DeviceFactory.java @@ -23,7 +23,7 @@ public class DeviceFactory { return null; } if (Integer.valueOf(DeviceStoreTypeEnum.ALI_OSS.getType()).equals(config.getStoreType())) { - operator = new AliOssStorageOperator(config.getStoreConfigJson()); + operator = new AliOssStorageOperator(config.getStoreConfigJson().replace("-internal.aliyuncs.com", ".aliyuncs.com")); } else if (Integer.valueOf(DeviceStoreTypeEnum.WVP_ACTIVE.getType()).equals(config.getStoreType())) { operator = new WvpActiveStorageOperator(config.getStoreConfigJson()); } else if (Integer.valueOf(DeviceStoreTypeEnum.WVP_PASSIVE.getType()).equals(config.getStoreType())) { diff --git a/src/main/java/com/ycwl/basic/device/operator/AliOssStorageOperator.java b/src/main/java/com/ycwl/basic/device/operator/AliOssStorageOperator.java index f6a2f35..d765332 100644 --- a/src/main/java/com/ycwl/basic/device/operator/AliOssStorageOperator.java +++ b/src/main/java/com/ycwl/basic/device/operator/AliOssStorageOperator.java @@ -84,7 +84,7 @@ public class AliOssStorageOperator extends ADeviceStorageOperator { return null; } fileList.addAll(fileListByPrefix); - calendar.add(Calendar.MINUTE, 1); + calendar.add(Calendar.DATE, 1); } calendar.clear(); return fileList.stream() From 9e9e2458010c5c4ced2551f4d061f50a610bd61e Mon Sep 17 00:00:00 2001 From: Jerry Yan <792602257@qq.com> Date: Tue, 9 Sep 2025 13:13:17 +0800 Subject: [PATCH 5/6] =?UTF-8?q?fix(task):=20=E8=B0=83=E6=95=B4=E8=A7=86?= =?UTF-8?q?=E9=A2=91=E5=89=AA=E8=BE=91=E5=91=BD=E4=BB=A4=E7=9A=84=E5=8F=82?= =?UTF-8?q?=E6=95=B0=E9=A1=BA=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 将 '-ss' 参数及其值移动到 '-i' 参数之后 - 优化了 ffmpeg 命令的参数顺序,提高视频处理效率 --- src/main/java/com/ycwl/basic/task/VideoPieceGetter.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/ycwl/basic/task/VideoPieceGetter.java b/src/main/java/com/ycwl/basic/task/VideoPieceGetter.java index 7e1cb09..6259ff9 100644 --- a/src/main/java/com/ycwl/basic/task/VideoPieceGetter.java +++ b/src/main/java/com/ycwl/basic/task/VideoPieceGetter.java @@ -522,13 +522,13 @@ public class VideoPieceGetter { ffmpegCmd.add("ffmpeg"); ffmpegCmd.add("-hide_banner"); ffmpegCmd.add("-y"); - ffmpegCmd.add("-ss"); - ffmpegCmd.add(offset.toPlainString()); ffmpegCmd.add("-i"); ffmpegCmd.add(inputFile); ffmpegCmd.add("-c:v"); ffmpegCmd.add("copy"); ffmpegCmd.add("-an"); + ffmpegCmd.add("-ss"); + ffmpegCmd.add(offset.toPlainString()); ffmpegCmd.add("-t"); ffmpegCmd.add(length.toPlainString()); ffmpegCmd.add("-f"); From ac91921c28564af46514b34c2cc3e8f89dfe22d5 Mon Sep 17 00:00:00 2001 From: Jerry Yan <792602257@qq.com> Date: Tue, 9 Sep 2025 13:32:58 +0800 Subject: [PATCH 6/6] =?UTF-8?q?refactor(device):=20=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E5=88=97=E8=A1=A8=E8=8E=B7=E5=8F=96=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 移除了不必要的循环遍历,简化了代码结构 - 仅根据起始日期获取一次文件列表,提高了效率- 清除了无用的日历操作,减少了代码复杂性 --- .../device/operator/AliOssStorageOperator.java | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/ycwl/basic/device/operator/AliOssStorageOperator.java b/src/main/java/com/ycwl/basic/device/operator/AliOssStorageOperator.java index d765332..faa0135 100644 --- a/src/main/java/com/ycwl/basic/device/operator/AliOssStorageOperator.java +++ b/src/main/java/com/ycwl/basic/device/operator/AliOssStorageOperator.java @@ -69,22 +69,14 @@ public class AliOssStorageOperator extends ADeviceStorageOperator { if (startDate == null || endDate == null) { return null; } - List fileList = new ArrayList<>(); - if (startDate.after(endDate)) { - return fileList; - } Calendar calendar = Calendar.getInstance(); calendar.setTime(startDate); calendar.set(Calendar.SECOND, 0); SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd"); - while (calendar.getTime().before(endDate)) { - String prefix = dateFormat.format(calendar.getTime()); - List fileListByPrefix = getOssFileListByPrefix(prefix); - if (fileListByPrefix == null) { - return null; - } - fileList.addAll(fileListByPrefix); - calendar.add(Calendar.DATE, 1); + String prefix = dateFormat.format(calendar.getTime()); + List fileList = getOssFileListByPrefix(prefix); + if (fileList == null) { + return null; } calendar.clear(); return fileList.stream()