Sfoglia il codice sorgente

更新数据模型

reghao 2 anni fa
parent
commit
c902cca631

+ 4 - 0
dfs-store/src/main/java/cn/reghao/dfs/store/db/repository/VideoRepository.java

@@ -51,6 +51,10 @@ public class VideoRepository {
         return list.isEmpty() ? null : list.get(0);
     }
 
+    public List<VideoFile> findVideoFiles(String videoFileId) {
+        return videoFileMapper.findByVideoFileId(videoFileId);
+    }
+
     @Cacheable(cacheNames = "oss:store:videoUrls", key = "#videoFileId", unless = "#result.empty")
     public List<VideoUrlDto> findVideoUrls(String videoFileId) {
         return videoFileMapper.findVideoUrls(videoFileId);

+ 11 - 0
dfs-store/src/main/java/cn/reghao/dfs/store/model/po/AudioFile.java

@@ -6,6 +6,8 @@ import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.NoArgsConstructor;
 
+import java.nio.charset.StandardCharsets;
+
 /**
  * 音频文件
  *
@@ -23,4 +25,13 @@ public class AudioFile extends BaseObject<Integer> {
     private String codec;
     private Long bitRate;
     private String url;
+
+    public AudioFile(String audioFileId, String objectId, String url, AudioFile audioFile) {
+        this.audioFileId = audioFileId;
+        this.objectId = objectId;
+        this.duration = audioFile.getDuration();
+        this.codec = audioFile.getCodec();
+        this.bitRate = audioFile.getBitRate();
+        this.url = url;
+    }
 }

+ 4 - 4
dfs-store/src/main/java/cn/reghao/dfs/store/model/po/ImageFile.java

@@ -34,11 +34,11 @@ public class ImageFile extends BaseObject<Integer> {
         this.horizontal = width > height;
     }
 
-    public ImageFile(ImageFile imageFile) {
-        this.imageFileId = imageFile.getImageFileId();
-        this.objectId = imageFile.getObjectId();
+    public ImageFile(String imageFileId, String objectId, String url, ImageFile imageFile) {
+        this.imageFileId = imageFileId;
+        this.objectId = objectId;
         this.format = imageFile.getFormat();
-        this.url = imageFile.getUrl();
+        this.url = url;
         this.width = imageFile.getWidth();
         this.height = imageFile.getHeight();
         this.horizontal = imageFile.getHorizontal();

+ 11 - 8
dfs-store/src/main/java/cn/reghao/dfs/store/model/po/VideoFile.java

@@ -19,10 +19,11 @@ public class VideoFile extends BaseObject<Integer> {
     private String videoFileId;
     private String objectId;
     private String videoCodec;
+    private Long vbitRate;
     private String audioCodec;
+    private Long abitRate;
     private String urlType;
     private String url;
-    private Long bitRate;
     private String quality;
     private Integer width;
     private Integer height;
@@ -30,15 +31,16 @@ public class VideoFile extends BaseObject<Integer> {
     // 单位秒
     private Integer duration;
 
-    public VideoFile(String videoFileId, String objectId, String videoCodec, String audioCodec,
-                     String urlType, String url, long bitRate, String quality, int width, int height, int duration) {
+    public VideoFile(String videoFileId, String objectId, String videoCodec, long vbitRate, String audioCodec, long abitRate,
+                     String urlType, String url, String quality, int width, int height, int duration) {
         this.videoFileId = videoFileId;
         this.objectId = objectId;
         this.videoCodec = videoCodec;
+        this.vbitRate = vbitRate;
         this.audioCodec = audioCodec;
+        this.abitRate = abitRate;
         this.urlType = urlType;
         this.url = url;
-        this.bitRate = bitRate;
         this.quality = quality;
         this.width = width;
         this.height = height;
@@ -46,14 +48,15 @@ public class VideoFile extends BaseObject<Integer> {
         this.duration = duration;
     }
 
-    public VideoFile(String videoFileId, VideoFile videoFile) {
+    public VideoFile(String videoFileId, String objectId, String url, VideoFile videoFile) {
         this.videoFileId = videoFileId;
-        this.objectId = videoFile.getObjectId();
+        this.objectId = objectId;
         this.videoCodec = videoFile.getVideoCodec();
+        this.vbitRate = videoFile.getVbitRate();
         this.audioCodec = videoFile.getAudioCodec();
+        this.abitRate = videoFile.getAbitRate();
         this.urlType = videoFile.getUrlType();
-        this.url = videoFile.getUrl();
-        this.bitRate = videoFile.getBitRate();
+        this.url = url;
         this.quality = videoFile.getQuality();
         this.width = videoFile.getWidth();
         this.height = videoFile.getHeight();

+ 30 - 0
dfs-store/src/main/java/cn/reghao/dfs/store/rpc/media/ConvertServiceImpl.java

@@ -0,0 +1,30 @@
+package cn.reghao.dfs.store.rpc.media;
+
+import cn.reghao.dfs.store.task.MediaConverter;
+import cn.reghao.oss.api.iface.media.ConvertService;
+import org.apache.dubbo.config.annotation.DubboService;
+import org.springframework.stereotype.Service;
+
+/**
+ * @author reghao
+ * @date 2023-10-08 16:54:25
+ */
+@DubboService
+@Service
+public class ConvertServiceImpl implements ConvertService {
+    private final MediaConverter mediaConverter;
+
+    public ConvertServiceImpl(MediaConverter mediaConverter) {
+        this.mediaConverter = mediaConverter;
+    }
+
+    @Override
+    public void convertVideo(String videoFileId) {
+        mediaConverter.convertVideo(videoFileId);
+    }
+
+    @Override
+    public void convertAudio(String audioFileId) {
+        mediaConverter.convertAudio(audioFileId);
+    }
+}

+ 12 - 2
dfs-store/src/main/java/cn/reghao/dfs/store/rpc/media/VideoFileServiceImpl.java

@@ -2,6 +2,7 @@ package cn.reghao.dfs.store.rpc.media;
 
 import cn.reghao.dfs.store.db.repository.ObjectRepository;
 import cn.reghao.dfs.store.db.repository.VideoRepository;
+import cn.reghao.dfs.store.task.MediaConverter;
 import cn.reghao.oss.api.dto.media.VideoInfo;
 import cn.reghao.oss.api.dto.media.VideoUrlDto;
 import cn.reghao.oss.api.iface.media.VideoFileService;
@@ -19,10 +20,13 @@ import java.util.List;
 public class VideoFileServiceImpl implements VideoFileService {
     private final VideoRepository videoRepository;
     private final ObjectRepository objectRepository;
+    private final MediaConverter mediaConverter;
 
-    public VideoFileServiceImpl(VideoRepository videoRepository, ObjectRepository objectRepository) {
+    public VideoFileServiceImpl(VideoRepository videoRepository, ObjectRepository objectRepository,
+                                MediaConverter mediaConverter) {
         this.videoRepository = videoRepository;
         this.objectRepository = objectRepository;
+        this.mediaConverter = mediaConverter;
     }
 
     @Override
@@ -38,6 +42,12 @@ public class VideoFileServiceImpl implements VideoFileService {
 
     @Override
     public List<VideoUrlDto> getVideoUrls(String videoFileId) {
-        return videoRepository.findVideoUrls(videoFileId);
+        List<VideoUrlDto> list = videoRepository.findVideoUrls(videoFileId);
+        return list;
+    }
+
+    @Override
+    public void convert(String videoFileId) {
+        mediaConverter.convertVideo(videoFileId);
     }
 }

+ 17 - 0
dfs-store/src/main/java/cn/reghao/dfs/store/service/PutObjectService.java

@@ -87,6 +87,23 @@ public class PutObjectService {
         return new ObjectResult(toObjectName, toObjectId, fileType, savedPath);
     }
 
+    public ObjectResult copyObject1(String fromObjectId) {
+        FileMeta fileMeta = objectRepository.getByObjectId(fromObjectId);
+        int fileType = fileMeta.getFileType();
+
+        String fromObjectName = fileMeta.getObjectName();
+        String suffix = StringUtil.getSuffix(fromObjectName);
+        String filename = fileMeta.getFilename();
+        String savedPath = "";
+        boolean diskFile = fileMeta.getDiskFile();
+        int scope = fileMeta.getScope();
+        String toObjectName = objectNameService.getObjectNameFromOriginal(fromObjectName, suffix);
+        String toObjectId = UUID.randomUUID().toString().replace("-", "");
+        FileMeta fileMeta1 = new FileMeta(toObjectName, toObjectId, filename, fileMeta, diskFile, scope);
+        objectRepository.saveFileMeta(fileMeta1);
+        return new ObjectResult(toObjectName, toObjectId, fileType, savedPath);
+    }
+
     public void deleteObject(String objectId) {
         objectRepository.deleteByObjectId(objectId);
     }

+ 0 - 54
dfs-store/src/main/java/cn/reghao/dfs/store/task/ConvertTask.java

@@ -1,54 +0,0 @@
-package cn.reghao.dfs.store.task;
-
-import cn.reghao.dfs.store.service.ObjectNameService;
-import cn.reghao.jutil.media.FFmpegWrapper;
-import cn.reghao.jutil.media.model.MediaProps;
-import cn.reghao.jutil.media.model.VideoProps;
-import cn.reghao.jutil.media.MediaQuality;
-import cn.reghao.jutil.media.MediaResolution;
-
-import java.io.File;
-import java.util.UUID;
-
-/**
- * @author reghao
- * @date 2023-05-11 09:46:28
- */
-public class ConvertTask implements Runnable {
-    private String videoFileId;
-    private String absolutePath;
-    private ObjectNameService objectNameService;
-
-    public ConvertTask() {
-    }
-
-    public ConvertTask(String videoFileId, String absolutePath, ObjectNameService objectNameService) {
-        this.videoFileId = videoFileId;
-        this.absolutePath = absolutePath;
-        this.objectNameService = objectNameService;
-    }
-
-    @Override
-    public void run() {
-        String filename = String.format("%s.mp4", UUID.randomUUID().toString().replace("-", ""));
-        String destPath = String.format("/opt/tmp/tomcat/%s", filename);
-        FFmpegWrapper.formatCovert(absolutePath, destPath, "mp4");
-        String objectName = String.format("video/playback/%s/%s", videoFileId, filename);
-        try {
-            String url = objectNameService.getObjectUrl(objectName);
-            File destFile = new File(destPath);
-            MediaProps mediaProps = FFmpegWrapper.getMediaProps(destPath);
-            VideoProps videoProps = mediaProps.getVideoProps();
-            int width = videoProps.getCodedWidth().intValue();
-            int height = videoProps.getCodedHeight().intValue();
-
-            String videoCodec = "h264";
-            String audioCodec = "aac";
-            long bitRate = videoProps.getBitRate();
-            MediaResolution mediaResolution = MediaQuality.getQuality(width, height);
-            destFile.delete();
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-    }
-}

+ 158 - 0
dfs-store/src/main/java/cn/reghao/dfs/store/task/MediaConverter.java

@@ -0,0 +1,158 @@
+package cn.reghao.dfs.store.task;
+
+import cn.reghao.dfs.store.db.repository.AudioRepository;
+import cn.reghao.dfs.store.db.repository.ObjectRepository;
+import cn.reghao.dfs.store.db.repository.VideoRepository;
+import cn.reghao.dfs.store.model.po.AudioFile;
+import cn.reghao.dfs.store.model.po.VideoFile;
+import cn.reghao.dfs.store.model.vo.ObjectProp;
+import cn.reghao.dfs.store.model.vo.ObjectResult;
+import cn.reghao.dfs.store.service.FileStoreService;
+import cn.reghao.dfs.store.service.ObjectNameService;
+import cn.reghao.dfs.store.service.PutObjectService;
+import cn.reghao.dfs.store.util.FileType;
+import cn.reghao.dfs.store.util.UserContext;
+import cn.reghao.jutil.jdk.security.DigestUtil;
+import cn.reghao.jutil.jdk.thread.ThreadPoolWrapper;
+import cn.reghao.jutil.media.FFmpegWrapper;
+import cn.reghao.jutil.media.model.AudioProps;
+import cn.reghao.jutil.media.model.MediaProps;
+import cn.reghao.jutil.media.MediaQuality;
+import cn.reghao.jutil.media.MediaResolution;
+import cn.reghao.jutil.media.model.VideoProps;
+import cn.reghao.oss.api.dto.ObjectMeta;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.List;
+import java.util.UUID;
+import java.util.concurrent.ExecutorService;
+
+/**
+ * @author reghao
+ * @date 2023-10-08 13:46:28
+ */
+@Slf4j
+@Service
+public class MediaConverter {
+    private final ExecutorService threadPool = ThreadPoolWrapper.threadPool("converter-pool", 10);
+    private final ObjectRepository objectRepository;
+    private final VideoRepository videoRepository;
+    private final AudioRepository audioRepository;
+    private final ObjectNameService objectNameService;
+    private final FileStoreService fileStoreService;
+    private final PutObjectService putObjectService;
+
+    public MediaConverter(ObjectRepository objectRepository, VideoRepository videoRepository,
+                          AudioRepository audioRepository, ObjectNameService objectNameService,
+                          FileStoreService fileStoreService, PutObjectService putObjectService) {
+        this.objectRepository = objectRepository;
+        this.videoRepository = videoRepository;
+        this.audioRepository = audioRepository;
+        this.objectNameService = objectNameService;
+        this.fileStoreService = fileStoreService;
+        this.putObjectService = putObjectService;
+    }
+
+    public void convertVideo(String videoFileId) {
+        threadPool.submit(new ConvertVideoTask(videoFileId));
+    }
+
+    public void convertAudio(String audioFileId) {
+        threadPool.submit(new ConvertAudioTask(audioFileId));
+    }
+
+    class ConvertVideoTask implements Runnable {
+        private final String videoFileId;
+
+        public ConvertVideoTask(String videoFileId) {
+            this.videoFileId = videoFileId;
+        }
+
+        public void run() {
+            log.info("convert video file {}", videoFileId);
+            VideoFile videoFile = videoRepository.findVideoFile(videoFileId);
+            int width = videoFile.getWidth();
+            int height = videoFile.getHeight();
+
+            ObjectMeta objectMeta = objectRepository.getObjectMetaById(videoFileId);
+            UserContext userContext = new UserContext(objectMeta.getUploadBy());
+            String originalObjectName = objectMeta.getObjectName();
+            String srcPath = objectMeta.getAbsolutePath();
+            File srcFile = new File(srcPath);
+
+            String contentId = UUID.randomUUID().toString().replace("-", "");
+            String suffix = ".mp4";
+            String destPath = fileStoreService.genFilePath(contentId, srcFile.length(), suffix);
+            try {
+                File savedFile = new File(destPath);
+                if (savedFile.exists()) {
+                    throw new IOException(destPath + " exist");
+                }
+
+                String format = suffix.replace(".", "");
+                int ret = FFmpegWrapper.formatCovert(srcFile.getAbsolutePath(), destPath, format);
+                if (ret != 0) {
+                    throw new Exception("视频转码失败");
+                }
+                String sha256sum = DigestUtil.sha256sum(destPath);
+
+                ObjectProp objectProp = objectNameService.getObjectProp(originalObjectName, suffix);
+                String originalFilename = "converted_video";
+                ObjectResult objectResult = putObjectService.putObject(objectProp, contentId, savedFile, originalFilename, sha256sum);
+
+                String objectId = objectResult.getObjectId();
+                String url = objectNameService.getObjectUrl(objectResult.getObjectName());
+                String urlType = FileType.getVideoUrlType(destPath);
+
+                MediaProps mediaProps = FFmpegWrapper.getMediaProps(destPath);
+                if (mediaProps == null) {
+                    log.error("{} 的 FFmpeg 媒体信息为 null", destPath);
+                    return;
+                }
+
+                VideoProps videoProps = mediaProps.getVideoProps();
+                if (videoProps == null) {
+                    log.error("{} 的 FFmpeg 视频信息为 null", destPath);
+                    return;
+                }
+
+                String videoCodec = videoProps.getCodecName();
+                long vbitRate = videoProps.getBitRate();
+
+                String audioCodec = null;
+                long abitRate = 0;
+                AudioProps audioProps1 = mediaProps.getAudioProps();
+                if (audioProps1 != null) {
+                    audioCodec = audioProps1.getCodecName();
+                    abitRate = audioProps1.getBitRate();
+                }
+
+                int duration = videoFile.getDuration();
+                MediaResolution mediaResolution = MediaQuality.getQuality(width, height);
+                String quality = mediaResolution.getQualityStr();
+                VideoFile videoFile1 = new VideoFile(videoFileId, objectId, videoCodec, vbitRate, audioCodec, abitRate,
+                        urlType, url, quality, width, height, duration);
+                videoRepository.saveVideoFiles(List.of(videoFile1));
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+    }
+
+    class ConvertAudioTask implements Runnable {
+        private final String audioFileId;
+
+        public ConvertAudioTask(String audioFileId) {
+            this.audioFileId = audioFileId;
+        }
+
+        @Override
+        public void run() {
+            log.info("convert audio file {}", audioFileId);
+            AudioFile audioFile = audioRepository.findAudioFile(audioFileId);
+        }
+    }
+}

+ 6 - 12
dfs-store/src/main/java/cn/reghao/dfs/store/task/processor/AudioFileProcessor.java

@@ -46,21 +46,16 @@ public class AudioFileProcessor {
 
     public UploadFileRet process(ObjectResult objectResult) {
         String objectName = objectResult.getObjectName();
-        String audioFileId = objectResult.getObjectId();
+        String objectId = objectResult.getObjectId();
+        String audioFileId = objectId;
+        String objectUrl = objectNameService.getObjectUrl(objectName);
         boolean duplicate = objectResult.isDuplicate();
         if (duplicate) {
-            ObjectResult objectResult1 = putObjectService.copyObject(objectName);
-            String objectId1 = objectResult1.getObjectId();
-            String url1 = objectNameService.getObjectUrl(objectResult1.getObjectName());
-
             String dupObjectId = objectResult.getDupObjectId();
             AudioFile audioFile = audioRepository.findAudioFile(dupObjectId);
-            int duration = audioFile.getDuration();
-            String audioCodec = audioFile.getCodec();
-            long bitRate = audioFile.getBitRate();
-            AudioFile audioFile1 = new AudioFile(audioFileId, objectId1, duration, audioCodec, bitRate, url1);
+            AudioFile audioFile1 = new AudioFile(audioFileId, objectId, objectUrl, audioFile);
             audioRepository.saveAudioFile(audioFile1);
-            return new UploadFileRet(objectId1, null);
+            return new UploadFileRet(objectId, null);
         }
 
         String absolutePath = objectResult.getAbsolutePath();
@@ -80,8 +75,7 @@ public class AudioFileProcessor {
             return getConvertedAudioFile(audioFileId, file, objectName, ".m4a");
         }
 
-        String url1 = objectNameService.getObjectUrl(objectName);
-        AudioFile audioFile = new AudioFile(audioFileId, audioFileId, duration, audioCodec, bitRate, url1);
+        AudioFile audioFile = new AudioFile(audioFileId, objectId, duration, audioCodec, bitRate, objectUrl);
         audioRepository.saveAudioFile(audioFile);
         return new UploadFileRet(audioFileId, null);
     }

+ 2 - 2
dfs-store/src/main/java/cn/reghao/dfs/store/task/processor/DiskFileProcessor.java

@@ -20,7 +20,7 @@ public class DiskFileProcessor {
     public UploadFileRet process(ObjectResult objectResult) {
         String objectName = objectResult.getObjectName();
         String objectId = objectResult.getObjectId();
-        String url = objectNameService.getObjectUrl(objectName);
-        return new UploadFileRet(objectId, url);
+        String objectUrl = objectNameService.getObjectUrl(objectName);
+        return new UploadFileRet(objectId, objectUrl);
     }
 }

+ 9 - 12
dfs-store/src/main/java/cn/reghao/dfs/store/task/processor/ImageFileProcessor.java

@@ -46,11 +46,13 @@ public class ImageFileProcessor {
     public UploadFileRet processImage(ObjectResult objectResult) {
         String objectName = objectResult.getObjectName();
         String objectId = objectResult.getObjectId();
+        String imageFileId = objectId;
+        String objectUrl = objectNameService.getObjectUrl(objectName);
         boolean duplicate = objectResult.isDuplicate();
         if (duplicate) {
             String dupObjectId = objectResult.getDupObjectId();
             ImageFile imageFile = imageRepository.getImageFile(dupObjectId);
-            ImageFile imageFile1 = new ImageFile(imageFile);
+            ImageFile imageFile1 = new ImageFile(imageFileId, objectId, objectUrl, imageFile);
             imageRepository.saveImageFiles(List.of(imageFile1));
             return new UploadFileRet(objectId, null);
         }
@@ -62,9 +64,8 @@ public class ImageFileProcessor {
                 ImageOps.Size size = ImageOps.info(new File(absolutePath));
                 int width = size.getWidth();
                 int height = size.getHeight();
-                String url = objectNameService.getObjectUrl(objectName);
 
-                ImageFile imageFile = new ImageFile(objectId, objectId, format, url, width, height);
+                ImageFile imageFile = new ImageFile(imageFileId, objectId, format, objectUrl, width, height);
                 imageRepository.saveImageFiles(List.of(imageFile));
                 return new UploadFileRet(objectId, null);
             } else {
@@ -79,11 +80,13 @@ public class ImageFileProcessor {
     public UploadFileRet processPhoto(ObjectResult objectResult) {
         String objectName = objectResult.getObjectName();
         String objectId = objectResult.getObjectId();
+        String imageFileId = objectId;
+        String objectUrl = objectNameService.getObjectUrl(objectName);
         boolean duplicate = objectResult.isDuplicate();
         if (duplicate) {
             String dupObjectId = objectResult.getDupObjectId();
             ImageFile imageFile = imageRepository.getImageFile(dupObjectId);
-            ImageFile imageFile1 = new ImageFile(imageFile);
+            ImageFile imageFile1 = new ImageFile(imageFileId, objectId, objectUrl, imageFile);
             imageRepository.saveImageFiles(List.of(imageFile1));
             return new UploadFileRet(objectId, null);
         }
@@ -95,16 +98,15 @@ public class ImageFileProcessor {
                 ImageOps.Size size = ImageOps.info(new File(absolutePath));
                 int width = size.getWidth();
                 int height = size.getHeight();
-                String url = objectNameService.getObjectUrl(objectName);
 
                 List<ImageFile> imageFiles = new ArrayList<>();
-                imageFiles.add(new ImageFile(objectId, objectId, format, url, width, height));
+                imageFiles.add(new ImageFile(imageFileId, objectId, format, objectUrl, width, height));
                 if (!"webp".equals(format)) {
                     ObjectResult webpResult = getWebpObject(objectResult);
                     String webpObjectName = webpResult.getObjectName();
                     String webpObjectId = webpResult.getObjectId();
                     String webpUrl = objectNameService.getObjectUrl(webpObjectName);
-                    imageFiles.add(new ImageFile(objectId, webpObjectId, "webp", webpUrl, width, height));
+                    imageFiles.add(new ImageFile(imageFileId, webpObjectId, "webp", webpUrl, width, height));
                 }
 
                 imageRepository.saveImageFiles(imageFiles);
@@ -118,11 +120,6 @@ public class ImageFileProcessor {
         return null;
     }
 
-    private ObjectResult getCopiedObject(String url) {
-        String objectName = objectNameService.getObjectNameFromUrl(url);
-        return putObjectService.copyObject(objectName);
-    }
-
     private ObjectResult getJpegObject(ObjectResult objectResult, String format) throws Exception {
         String originalObjectName = objectResult.getObjectName();
         String absolutePath = objectResult.getAbsolutePath();

+ 33 - 68
dfs-store/src/main/java/cn/reghao/dfs/store/task/processor/VideoFileProcessor.java

@@ -1,31 +1,24 @@
 package cn.reghao.dfs.store.task.processor;
 
 import cn.reghao.dfs.store.db.repository.VideoRepository;
+import cn.reghao.dfs.store.service.PutObjectService;
 import cn.reghao.jutil.media.model.AudioProps;
 import cn.reghao.jutil.media.model.MediaProps;
 import cn.reghao.jutil.media.model.VideoProps;
-import cn.reghao.dfs.store.model.vo.ObjectProp;
 import cn.reghao.dfs.store.model.vo.ObjectResult;
-import cn.reghao.dfs.store.service.FileStoreService;
 import cn.reghao.dfs.store.util.FileType;
 import cn.reghao.dfs.store.service.ObjectNameService;
-import cn.reghao.dfs.store.service.PutObjectService;
-import cn.reghao.jutil.jdk.security.DigestUtil;
 import cn.reghao.dfs.store.model.po.VideoFile;
 import cn.reghao.jutil.media.FFmpegWrapper;
 import cn.reghao.jutil.media.MediaQuality;
 import cn.reghao.jutil.media.MediaResolution;
-import cn.reghao.jutil.jdk.thread.ThreadPoolWrapper;
 import cn.reghao.oss.api.rest.UploadFileRet;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 
-import java.io.File;
-import java.io.IOException;
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Set;
-import java.util.UUID;
-import java.util.concurrent.ExecutorService;
 
 /**
  * @author reghao
@@ -35,30 +28,43 @@ import java.util.concurrent.ExecutorService;
 @Service
 public class VideoFileProcessor {
     private final VideoRepository videoRepository;
-    private final PutObjectService putObjectService;
     private final ObjectNameService objectNameService;
-    private final FileStoreService fileStoreService;
-    private final ExecutorService threadPool = ThreadPoolWrapper.threadPool("converter-pool", 10);
+    private PutObjectService putObjectService;
     private final Set<String> audioCodecs = Set.of("aac", "mp3");
     private final Set<String> videoCodecs = Set.of("h264");
 
-    public VideoFileProcessor(VideoRepository videoRepository, PutObjectService putObjectService,
-                              ObjectNameService objectNameService, FileStoreService fileStoreService) {
+    public VideoFileProcessor(VideoRepository videoRepository, ObjectNameService objectNameService,
+                              PutObjectService putObjectService) {
         this.videoRepository = videoRepository;
-        this.putObjectService = putObjectService;
         this.objectNameService = objectNameService;
-        this.fileStoreService = fileStoreService;
+        this.putObjectService = putObjectService;
     }
 
     public UploadFileRet process(ObjectResult objectResult) {
         String objectName = objectResult.getObjectName();
-        String videoFileId = objectResult.getObjectId();
+        String objectId = objectResult.getObjectId();
+        String videoFileId = objectId;
+        String objectUrl = objectNameService.getObjectUrl(objectName);
         boolean duplicate = objectResult.isDuplicate();
         if (duplicate) {
             String dupObjectId = objectResult.getDupObjectId();
-            VideoFile videoFile = videoRepository.findVideoFile(dupObjectId);
-            VideoFile videoFile1 = new VideoFile(videoFileId, videoFile);
-            videoRepository.saveVideoFiles(List.of(videoFile1));
+            List<VideoFile> videoFiles = videoRepository.findVideoFiles(dupObjectId);
+            VideoFile videoFile = videoFiles.get(0);
+            VideoFile videoFile1 = new VideoFile(videoFileId, objectId, objectUrl, videoFile);
+            List<VideoFile> list = new ArrayList<>();
+            list.add(videoFile1);
+
+            if (videoFiles.size() > 1) {
+                for (int i = 1; i < videoFiles.size(); i++) {
+                    VideoFile videoFile2 = videoFiles.get(i);
+                    ObjectResult objectResult1 = putObjectService.copyObject1(videoFile2.getObjectId());
+                    String objectId1 = objectResult1.getObjectId();
+                    String objectUrl1 = objectNameService.getObjectUrl(objectResult1.getObjectName());
+                    list.add(new VideoFile(videoFileId, objectId1, objectUrl1, videoFile2));
+                }
+            }
+
+            videoRepository.saveVideoFiles(list);
             return new UploadFileRet(videoFileId, null);
         }
 
@@ -75,11 +81,15 @@ public class VideoFileProcessor {
             return null;
         }
 
-        String videoCodec = mediaProps.getVideoProps().getCodecName();
+        String videoCodec = videoProps.getCodecName();
+        long vbitRate = videoProps.getBitRate();
+
         String audioCodec = null;
+        long abitRate = 0;
         AudioProps audioProps1 = mediaProps.getAudioProps();
         if (audioProps1 != null) {
             audioCodec = audioProps1.getCodecName();
+            abitRate = audioProps1.getBitRate();
         }
 
         /*if (videoCodecs.contains(videoCodec)) {
@@ -94,58 +104,13 @@ public class VideoFileProcessor {
         }*/
         int width = videoProps.getCodedWidth().intValue();
         int height = videoProps.getCodedHeight().intValue();
-        boolean horizontal = width>height;
         int duration = videoProps.getDuration().intValue();
-        String originalUrl = objectNameService.getObjectUrl(objectName);
-        long bitRate = videoProps.getBitRate();
         MediaResolution mediaResolution = MediaQuality.getQuality(width, height);
         String quality = mediaResolution.getQualityStr();
         String urlType = FileType.getVideoUrlType(absolutePath);
-        VideoFile videoFile = new VideoFile(videoFileId, videoFileId, videoCodec, audioCodec, urlType, originalUrl,
-                bitRate, quality, width, height, duration);
+        VideoFile videoFile = new VideoFile(videoFileId, objectId, videoCodec, vbitRate, audioCodec, abitRate,
+                urlType, objectUrl, quality, width, height, duration);
         videoRepository.saveVideoFiles(List.of(videoFile));
         return new UploadFileRet(videoFileId, null);
-
-        //log.info("添加视频格式转码任务");
-        //threadPool.submit(new ConvertTask());
-    }
-
-    private VideoFile getConvertedVideoFile(String videoFileId, File file, String originalObjectName,
-                                          int width, int height, String suffix) {
-        String contentId = UUID.randomUUID().toString().replace("-", "");
-        String absolutePath = fileStoreService.genFilePath(contentId, file.length(), suffix);
-        try {
-            File savedFile = new File(absolutePath);
-            if (savedFile.exists()) {
-                throw new IOException(absolutePath + " exist");
-            }
-
-            String format = suffix.replace(".", "");
-            int ret = FFmpegWrapper.formatCovert(file.getAbsolutePath(), absolutePath + suffix, format);
-            if (ret != 0) {
-                throw new Exception("视频转码失败");
-            }
-            String sha256sum = DigestUtil.sha256sum(absolutePath);
-
-            ObjectProp objectProp = objectNameService.getObjectProp(originalObjectName, suffix);
-            String originalFilename = "";
-            ObjectResult objectResult = putObjectService.putObject(objectProp, contentId, savedFile, originalFilename, sha256sum);
-
-            String objectId = objectResult.getObjectId();
-            String videoCodec = "h264";
-            String audioCodec = "aac";
-            String url = objectNameService.getObjectUrl(objectResult.getObjectName());
-            String urlType = FileType.getVideoUrlType(absolutePath);
-            long bitRate = 0;
-            int duration = 0;
-            MediaResolution mediaResolution = MediaQuality.getQuality(width, height);
-            String quality = mediaResolution.getQualityStr();
-            return new VideoFile(videoFileId, objectId, videoCodec, audioCodec, urlType, url, bitRate,
-                    quality, width, height, duration);
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-
-        return null;
     }
 }

+ 6 - 6
dfs-store/src/main/resources/mapper/VideoFileMapper.xml

@@ -4,16 +4,16 @@
 <mapper namespace="cn.reghao.dfs.store.db.mapper.VideoFileMapper">
     <insert id="save" useGeneratedKeys="true" keyProperty="id">
         insert into video_file
-        (`video_file_id`,`object_id`,`video_codec`,`audio_codec`,`url_type`,`url`,`bit_rate`,`quality`,`width`,`height`,`horizontal`,`duration`)
+        (`video_file_id`,`object_id`,`video_codec`,`vbit_rate`,`audio_codec`,`abit_rate`,`url_type`,`url`,`quality`,`width`,`height`,`horizontal`,`duration`)
         values 
-        (#{videoFileId},#{objectId},#{videoCodec},#{audioCodec},#{urlType},#{url},#{bitRate},#{quality},#{width},#{height},#{horizontal},#{duration})
+        (#{videoFileId},#{objectId},#{videoCodec},#{vbitRate},#{audioCodec},#{abitRate},#{urlType},#{url},#{quality},#{width},#{height},#{horizontal},#{duration})
     </insert>
     <insert id="saveAll" useGeneratedKeys="true" keyProperty="id">
         insert into video_file
-        (`video_file_id`,`object_id`,`video_codec`,`audio_codec`,`url_type`,`url`,`bit_rate`,`quality`,`width`,`height`,`horizontal`,`duration`)
+        (`video_file_id`,`object_id`,`video_codec`,`vbit_rate`,`audio_codec`,`abit_rate`,`url_type`,`url`,`quality`,`width`,`height`,`horizontal`,`duration`)
         values
         <foreach collection="list" item="item" index="index" separator=",">
-            (#{item.videoFileId},#{item.objectId},#{item.videoCodec},#{item.audioCodec},#{item.urlType},#{item.url},#{item.bitRate},#{item.quality},#{item.width},#{item.height},#{item.horizontal},#{item.duration})
+            (#{item.videoFileId},#{item.objectId},#{item.videoCodec},#{item.vbitRate},#{item.audioCodec},#{item.abitRate},#{item.urlType},#{item.url},#{item.quality},#{item.width},#{item.height},#{item.horizontal},#{item.duration})
         </foreach>
     </insert>
 
@@ -29,7 +29,7 @@
         select * from video_file
     </select>
     <select id="findVideoInfo" resultType="cn.reghao.oss.api.dto.media.VideoInfo">
-        select video_file.video_file_id,video_file.duration,video_file.horizontal,quality
+        select video_file_id,duration,horizontal,quality,video_codec,audio_codec
         from video_file
         where video_file_id=#{videoFileId}
         order by quality desc
@@ -40,7 +40,7 @@
         where video_file_id=#{videoFileId}
     </select>
     <select id="findVideoUrls" resultType="cn.reghao.oss.api.dto.media.VideoUrlDto">
-        select url_type as type,url,width,height,quality_str as quality
+        select url_type as type,url,width,height,quality
         from video_file
         where video_file_id=#{videoFileId}
     </select>

+ 2 - 0
oss-api/src/main/java/cn/reghao/oss/api/dto/media/VideoInfo.java

@@ -21,4 +21,6 @@ public class VideoInfo implements Serializable {
     private Integer duration;
     private Boolean horizontal;
     private String quality;
+    private String videoCodec;
+    private String audioCodec;
 }

+ 12 - 0
oss-api/src/main/java/cn/reghao/oss/api/iface/media/ConvertService.java

@@ -0,0 +1,12 @@
+package cn.reghao.oss.api.iface.media;
+
+/**
+ * 音视频转码服务
+ *
+ * @author reghao
+ * @date 2023-10-08 16:53:33
+ */
+public interface ConvertService {
+    void convertVideo(String videoFileId);
+    void convertAudio(String audioFileId);
+}

+ 1 - 0
oss-api/src/main/java/cn/reghao/oss/api/iface/media/VideoFileService.java

@@ -13,4 +13,5 @@ public interface VideoFileService {
     void deleteVideoFile(String videoFileId);
     VideoInfo getVideoInfo(String videoFileId);
     List<VideoUrlDto> getVideoUrls(String videoFileId);
+    void convert(String videoFileId);
 }