|
@@ -0,0 +1,128 @@
|
|
|
+package com.iden.bms.service;
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
|
|
+import com.iden.common.entity.*;
|
|
|
+import com.iden.common.service.*;
|
|
|
+import com.iden.common.util.DateUtils;
|
|
|
+import com.iden.common.util.FileUtil;
|
|
|
+import com.iden.common.videotool.VideoTool;
|
|
|
+import org.apache.logging.log4j.LogManager;
|
|
|
+import org.apache.logging.log4j.Logger;
|
|
|
+import org.springframework.beans.factory.annotation.Value;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+
|
|
|
+import javax.annotation.Resource;
|
|
|
+import java.io.File;
|
|
|
+import java.util.Date;
|
|
|
+import java.util.UUID;
|
|
|
+
|
|
|
+
|
|
|
+/**
|
|
|
+ * @Author: stw
|
|
|
+ * @Date: 2021/7/14
|
|
|
+ * @Desc:
|
|
|
+ */
|
|
|
+@Service
|
|
|
+public class VideoService {
|
|
|
+ @Resource
|
|
|
+ private IdenCameraService idenCameraService;
|
|
|
+
|
|
|
+ @Resource
|
|
|
+ private IdenCameraVideoService idenCameraVideoService;
|
|
|
+
|
|
|
+
|
|
|
+ @Value("${iden.root:#{null}}")
|
|
|
+ private String idenRoot;
|
|
|
+ @Value("${file.url:#{null}}")
|
|
|
+ private String fileUrl;
|
|
|
+ @Value("${ffmpeg.path:#{null}}")
|
|
|
+ private String ffmpegPath;
|
|
|
+
|
|
|
+
|
|
|
+ private static final Logger logger = LogManager.getLogger(VideoService.class);
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 把摄像头上传的图像解开为一帧帧图片,放到图像目录下,等待识别引擎处理
|
|
|
+ * @throws Exception
|
|
|
+ */
|
|
|
+ public void handleCameraVideo() throws Exception {
|
|
|
+ logger.info("FaceIdenService.handleCameraVideo start...");
|
|
|
+ File originVideoDirFile = new File(idenRoot + "data/origin/camera/video");
|
|
|
+ //使用摄像头编码做目录名,里面存放视频,名称里包含拍摄结束时间
|
|
|
+ // 比如 20211217123343_76639ced-6409-11ec-b8f9-fa883e4e1e9f.mp4
|
|
|
+ if (originVideoDirFile.isDirectory()) {
|
|
|
+ File[] cameraCodeDirs = originVideoDirFile.listFiles();
|
|
|
+ if (cameraCodeDirs != null && cameraCodeDirs.length > 0) {
|
|
|
+ for(File cameraCodedir : cameraCodeDirs) {
|
|
|
+ if (cameraCodedir.isDirectory()) {
|
|
|
+ File[] videoFiles = FileUtil.sortByName(cameraCodedir.listFiles());
|
|
|
+ if (videoFiles != null && videoFiles.length > 0) {
|
|
|
+ String cameraCode = cameraCodedir.getName();
|
|
|
+ QueryWrapper<IdenCamera> queryWrapper = new QueryWrapper<>();
|
|
|
+ queryWrapper.lambda().eq(IdenCamera::getCode,cameraCode);
|
|
|
+ IdenCamera idenCamera = idenCameraService.getOne(queryWrapper);
|
|
|
+ if(idenCamera == null){
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ for(File videoFile : videoFiles){
|
|
|
+ String videoFileName = videoFile.getName();
|
|
|
+ logger.info("FaceIdenService.handleCameraVideo ...videoFile.getName() == " + videoFileName);
|
|
|
+
|
|
|
+ String shootEndTimeStr = videoFileName.substring(0, videoFileName.indexOf("_"));
|
|
|
+ Date shootEndTime = DateUtils.strToDate(shootEndTimeStr,"yyyyMMddHHmmss");
|
|
|
+
|
|
|
+
|
|
|
+ String tmp = UUID.randomUUID().toString();
|
|
|
+ File finalDirTmp = new File(videoFile.getParentFile().getAbsolutePath().replace("origin","discard") + "/" + tmp);
|
|
|
+ if(!finalDirTmp.exists()){
|
|
|
+ finalDirTmp.mkdirs();
|
|
|
+ }
|
|
|
+ logger.info("FaceIdenService.handleCameraVideo ...originImageDir == " + finalDirTmp.getAbsolutePath());
|
|
|
+
|
|
|
+ File originImageDir = new File(videoFile.getParentFile().getAbsolutePath().replace("video","image"));
|
|
|
+ if(!originImageDir.exists()){
|
|
|
+ originImageDir.mkdirs();
|
|
|
+ }
|
|
|
+ logger.info("FaceIdenService.handleCameraVideo ...originImageDir == " + originImageDir.getAbsolutePath());
|
|
|
+
|
|
|
+ //先把分解图片放入临时目录,临时目录下的文件重命名后移到原始目录等待图像识别
|
|
|
+ Long duration = VideoTool.fetchAllPic(ffmpegPath, videoFile.getAbsolutePath(),finalDirTmp.getAbsolutePath(),originImageDir.getAbsolutePath(), shootEndTime);
|
|
|
+
|
|
|
+ File finalVideoDir = new File(videoFile.getParentFile().getAbsolutePath().replace("origin","final"));
|
|
|
+ if(!finalVideoDir.exists()){
|
|
|
+ finalVideoDir.mkdirs();
|
|
|
+ }
|
|
|
+ logger.info("FaceIdenService.handleCameraVideo ...finalVideoDir == " + finalVideoDir.getAbsolutePath());
|
|
|
+
|
|
|
+ File finalVideoFile = new File(finalVideoDir, videoFileName);
|
|
|
+ logger.info("FaceIdenService.handleCameraVideo ...finalVideoFile == " + finalVideoFile.getAbsolutePath());
|
|
|
+ videoFile.renameTo(finalVideoFile);//把视频文件移动到最终目录
|
|
|
+
|
|
|
+ //保存数据库
|
|
|
+ IdenCameraVideo idenCameraVideo = new IdenCameraVideo();
|
|
|
+ idenCameraVideo.setVideoUrl(fileUrl + "camera/video/" + cameraCode + "/" + videoFileName);
|
|
|
+ idenCameraVideo.setCameraId(idenCamera.getId());
|
|
|
+ idenCameraVideo.setCommunityId(idenCamera.getCommunityId());
|
|
|
+ idenCameraVideo.setName(videoFileName.substring(0,videoFileName.lastIndexOf(".")));
|
|
|
+ Long begin = shootEndTime.getTime() - duration;
|
|
|
+ idenCameraVideo.setPhotographBeginTime(new Date(begin));
|
|
|
+ idenCameraVideo.setPhotographEndTime(shootEndTime);
|
|
|
+ idenCameraVideo.setDuration(duration);
|
|
|
+ idenCameraVideo.setCreateTime(new Date());
|
|
|
+ idenCameraVideoService.save(idenCameraVideo);
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ logger.info("FaceIdenService.handleCameraVideo end");
|
|
|
+ }
|
|
|
+
|
|
|
+}
|