Sfoglia il codice sorgente

添加对音频文件的处理, 目前仅支持 aac 和 mp3 编码

reghao 2 anni fa
parent
commit
dfe9f7b42c

+ 14 - 0
dfs-store/src/main/java/cn/reghao/dfs/store/db/mapper/AudioFileMapper.java

@@ -0,0 +1,14 @@
+package cn.reghao.dfs.store.db.mapper;
+
+import cn.reghao.dfs.store.model.po.AudioFile;
+import cn.reghao.jutil.jdk.db.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * @author reghao
+ * @date 2023-07-05 16:47:46
+ */
+@Mapper
+public interface AudioFileMapper extends BaseMapper<AudioFile> {
+    AudioFile findByFileId(String audioFileId);
+}

+ 14 - 1
dfs-store/src/main/java/cn/reghao/dfs/store/db/repository/MediaRepository.java

@@ -1,8 +1,10 @@
 package cn.reghao.dfs.store.db.repository;
 
+import cn.reghao.dfs.store.db.mapper.AudioFileMapper;
 import cn.reghao.dfs.store.db.mapper.ImageFileMapper;
 import cn.reghao.dfs.store.db.mapper.VideoFileMapper;
 import cn.reghao.dfs.store.db.mapper.VideoUrlMapper;
+import cn.reghao.dfs.store.model.po.AudioFile;
 import cn.reghao.dfs.store.model.po.ImageFile;
 import cn.reghao.dfs.store.model.po.VideoFile;
 import cn.reghao.dfs.store.model.po.VideoUrl;
@@ -18,11 +20,14 @@ import java.util.List;
 @Repository
 public class MediaRepository {
     private final ImageFileMapper imageFileMapper;
+    private final AudioFileMapper audioFileMapper;
     private final VideoFileMapper videoFileMapper;
     private final VideoUrlMapper videoUrlMapper;
 
-    public MediaRepository(ImageFileMapper imageFileMapper, VideoFileMapper videoFileMapper, VideoUrlMapper videoUrlMapper) {
+    public MediaRepository(ImageFileMapper imageFileMapper, AudioFileMapper audioFileMapper,
+                           VideoFileMapper videoFileMapper, VideoUrlMapper videoUrlMapper) {
         this.imageFileMapper = imageFileMapper;
+        this.audioFileMapper = audioFileMapper;
         this.videoFileMapper = videoFileMapper;
         this.videoUrlMapper = videoUrlMapper;
     }
@@ -37,6 +42,10 @@ public class MediaRepository {
         imageFileMapper.save(imageFile);
     }
 
+    public void saveAudioFile(AudioFile audioFile) {
+        audioFileMapper.save(audioFile);
+    }
+
     public VideoFile findVideoFile(String videoFileId) {
         return videoFileMapper.findByVideoFileId(videoFileId);
     }
@@ -48,4 +57,8 @@ public class MediaRepository {
     public ImageFile findImageFile(String imageFileId) {
         return imageFileMapper.findByImageFileId(imageFileId);
     }
+
+    public AudioFile findAudioFile(String audioFileId) {
+        return audioFileMapper.findByFileId(audioFileId);
+    }
 }

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

@@ -0,0 +1,29 @@
+package cn.reghao.dfs.store.model.po;
+
+import cn.reghao.jutil.jdk.db.BaseObject;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+/**
+ * 音频文件
+ *
+ * @author reghao
+ * @date 2023-07-05 16:42:01
+ */
+@NoArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class AudioFile extends BaseObject<Integer> {
+    private String audioFileId;
+    private String objectId;
+    private String codec;
+    private String url;
+
+    public AudioFile(String audioFileId, String objectId, String codec, String url) {
+        this.audioFileId = audioFileId;
+        this.objectId = objectId;
+        this.codec = codec;
+        this.url = url;
+    }
+}

+ 5 - 5
dfs-store/src/main/java/cn/reghao/dfs/store/service/FileStoreService.java

@@ -26,10 +26,10 @@ public class FileStoreService {
         this.loadBalancer = loadBalancer;
     }
 
-    public String genFilePath(String contentId, long size) {
+    public String genFilePath(String contentId, long size, String suffix) {
         StoreDir storeDir = loadBalancer.getStoreDir(size);
         String fileDir = storeDir.getAbsoluteDirPath();
-        return String.format("%s/%s", fileDir, contentId);
+        return String.format("%s/%s%s", fileDir, contentId, suffix);
     }
 
     public void createSparseFile(String absolutePath, long len) throws IOException {
@@ -55,7 +55,7 @@ public class FileStoreService {
     }
 
     public File saveFile(byte[] bytes, String contentId) throws IOException {
-        String absolutePath = genFilePath(contentId, bytes.length);
+        String absolutePath = genFilePath(contentId, bytes.length, "");
         File file = new File(absolutePath);
         if (file.exists()) {
             throw new IOException(absolutePath + " exist");
@@ -73,7 +73,7 @@ public class FileStoreService {
     }
 
     public File saveFile(File srcFile, String contentId) throws IOException {
-        String absolutePath = genFilePath(contentId, srcFile.length());
+        String absolutePath = genFilePath(contentId, srcFile.length(), "");
         File file = new File(absolutePath);
         if (file.exists()) {
             throw new IOException(absolutePath + " exist");
@@ -84,7 +84,7 @@ public class FileStoreService {
     }
 
     public File saveFile(InputStream inputStream, String contentId, long size) throws IOException {
-        String absolutePath = genFilePath(contentId, size);
+        String absolutePath = genFilePath(contentId, size, "");
         File file = new File(absolutePath);
         if (file.exists()) {
             throw new IOException(absolutePath + " exist");

+ 1 - 1
dfs-store/src/main/java/cn/reghao/dfs/store/service/ObjectMultipartUploadService.java

@@ -86,7 +86,7 @@ public class ObjectMultipartUploadService {
         Set<Long> set = map.computeIfAbsent(sha256sum, k -> new HashSet<>());
         if (set.isEmpty()) {
             String contentId = UUID.randomUUID().toString().replace("-", "");
-            String absolutePath = fileStoreService.genFilePath(contentId, totalSize);
+            String absolutePath = fileStoreService.genFilePath(contentId, totalSize, "");
             fileStoreService.createSparseFile(absolutePath, totalSize);
 
             PathUrl pathUrl = new PathUrl(contentId, absolutePath);

+ 35 - 30
dfs-store/src/main/java/cn/reghao/dfs/store/task/AudioFileProcessor.java

@@ -1,19 +1,17 @@
 package cn.reghao.dfs.store.task;
 
 import cn.reghao.dfs.store.db.repository.MediaRepository;
-import cn.reghao.dfs.store.model.po.VideoUrl;
+import cn.reghao.dfs.store.model.po.AudioFile;
 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.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.oss.api.constant.UploadChannel;
 import cn.reghao.oss.api.rest.UploadFileRet;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
@@ -47,63 +45,70 @@ public class AudioFileProcessor {
     }
 
     public UploadFileRet process(ObjectResult objectResult) {
-        String objectId = objectResult.getObjectId();
+        String originalObjectName = objectResult.getObjectName();
+        String originalObjectId = objectResult.getObjectId();
         boolean duplicate = objectResult.isDuplicate();
         if (duplicate) {
+            ObjectResult objectResult1 = putObjectService.copyObject(originalObjectName, ".m4a");
+            String objectId1 = objectResult1.getObjectId();
+            String url1 = objectNameService.getObjectUrl(objectResult1.getObjectName());
+
             String dupObjectId = objectResult.getDupObjectId();
-            return null;
+            AudioFile audioFile = mediaRepository.findAudioFile(dupObjectId);
+            String audioCodec = audioFile.getCodec();
+            AudioFile audioFile1 = new AudioFile(originalObjectId, objectId1, audioCodec, url1);
+            mediaRepository.saveAudioFile(audioFile1);
+            return new UploadFileRet(objectId1, url1);
         }
 
-        String objectName = objectResult.getObjectName();
         String absolutePath = objectResult.getAbsolutePath();
         MediaProps mediaProps = FFmpegWrapper.getMediaProps(absolutePath);
-        if (mediaProps == null) {
-            log.info("{} 的 FFmpeg 媒体信息为 null", objectName);
+        if (mediaProps == null || mediaProps.getAudioProps() == null) {
+            log.error("{} 的 FFmpeg 音频信息为 null", originalObjectName);
             return null;
         }
 
         AudioProps audioProps = mediaProps.getAudioProps();
-        if (audioProps == null) {
-            log.info("{} 的 FFmpeg 音频信息为 null", objectName);
-            return null;
-        }
-
         String audioCodec = audioProps.getCodecName();
         if (!audioCodecs.contains(audioCodec)) {
-            log.error("{} 对象的音频非 aac 编码, 暂不处理", objectName);
-            return null;
+            log.info("将 {} 对象的音频转换为 aac 编码", originalObjectName);
+            File file = new File(objectResult.getAbsolutePath());
+            UploadFileRet uploadFileRet = getConvertedAudioFile(originalObjectId, file, originalObjectName, ".m4a");
+            return uploadFileRet;
         }
 
-        //log.info("添加视频格式转码任务");
-        //threadPool.submit(new ConvertTask());
-        return null;
+        ObjectResult objectResult1 = putObjectService.copyObject(originalObjectName, ".m4a");
+        String objectId1 = objectResult1.getObjectId();
+        String url1 = objectNameService.getObjectUrl(objectResult1.getObjectName());
+        AudioFile audioFile = new AudioFile(originalObjectId, objectId1, audioCodec, url1);
+        mediaRepository.saveAudioFile(audioFile);
+        return new UploadFileRet(objectId1, url1);
     }
 
-    private VideoUrl getConvertedAudioUrl(String audioFileId, File file) {
+    private UploadFileRet getConvertedAudioFile(String audioFileId, File file, String originalObjectName, String suffix) {
         String contentId = UUID.randomUUID().toString().replace("-", "");
-        fileStoreService.genFilePath(contentId, file.length());
-        String absolutePath = fileStoreService.genFilePath(contentId, file.length());
+        String destPath = fileStoreService.genFilePath(contentId, file.length(), suffix);
         try {
-            File savedFile = new File(absolutePath);
+            File savedFile = new File(destPath);
             if (savedFile.exists()) {
-                throw new IOException(absolutePath + " exist");
+                throw new IOException(destPath + " exist");
             }
 
-            String suffix = "m4a";
-            int ret = FFmpegWrapper.convertAudio(file.getAbsolutePath(), absolutePath + "." + suffix);
+            int ret = FFmpegWrapper.convertAudio(file.getAbsolutePath(), destPath);
             if (ret != 0) {
                 throw new Exception("音频转码失败");
             }
-            String sha256sum = DigestUtil.sha256sum(absolutePath);
+            String sha256sum = DigestUtil.sha256sum(destPath);
 
-            ObjectProp objectProp = objectNameService.getObjectProp(UploadChannel.audio.getCode());
+            ObjectProp objectProp = objectNameService.getObjectProp(originalObjectName, suffix);
             String originalFilename = "";
             ObjectResult objectResult = putObjectService.putObject(objectProp, contentId, savedFile, originalFilename, sha256sum);
-
             String objectId = objectResult.getObjectId();
             String url = objectNameService.getObjectUrl(objectResult.getObjectName());
-            String urlType = FileType.getVideoUrlType(absolutePath);
-            return null;
+            String codec = "aac";
+            AudioFile audioFile = new AudioFile(audioFileId, objectId, codec, url);
+            mediaRepository.saveAudioFile(audioFile);
+            return new UploadFileRet(objectId, url);
         } catch (Exception e) {
             e.printStackTrace();
         }

+ 1 - 0
dfs-store/src/main/java/cn/reghao/dfs/store/task/FileProcessor.java

@@ -42,6 +42,7 @@ public class FileProcessor {
                 break;
             case Audio:
                 uploadFileRet = audioFileProcessor.process(objectResult);
+                break;
             case Text:
             case Other:
             default:

+ 3 - 6
dfs-store/src/main/java/cn/reghao/dfs/store/task/VideoFileProcessor.java

@@ -4,7 +4,6 @@ import cn.reghao.dfs.store.db.repository.MediaRepository;
 import cn.reghao.jutil.media.model.AudioProps;
 import cn.reghao.jutil.media.model.MediaProps;
 import cn.reghao.jutil.media.model.VideoProps;
-import cn.reghao.oss.api.constant.UploadChannel;
 import cn.reghao.dfs.store.model.vo.ObjectProp;
 import cn.reghao.dfs.store.model.vo.ObjectResult;
 import cn.reghao.dfs.store.service.FileStoreService;
@@ -24,7 +23,6 @@ import org.springframework.stereotype.Service;
 
 import java.io.File;
 import java.io.IOException;
-import java.util.HashSet;
 import java.util.Set;
 import java.util.UUID;
 import java.util.concurrent.ExecutorService;
@@ -84,13 +82,13 @@ public class VideoFileProcessor {
         String absolutePath = objectResult.getAbsolutePath();
         MediaProps mediaProps = FFmpegWrapper.getMediaProps(absolutePath);
         if (mediaProps == null) {
-            log.info("{} 的 FFmpeg 媒体信息为 null", objectName);
+            log.error("{} 的 FFmpeg 媒体信息为 null", objectName);
             return null;
         }
 
         VideoProps videoProps = mediaProps.getVideoProps();
         if (videoProps == null) {
-            log.info("{} 的 FFmpeg 视频信息为 null", objectName);
+            log.error("{} 的 FFmpeg 视频信息为 null", objectName);
             return null;
         }
 
@@ -133,8 +131,7 @@ public class VideoFileProcessor {
     private VideoUrl getConvertedVideoUrl(String videoFileId, File file, String originalObjectName,
                                           int width, int height, String suffix) {
         String contentId = UUID.randomUUID().toString().replace("-", "");
-        fileStoreService.genFilePath(contentId, file.length());
-        String absolutePath = fileStoreService.genFilePath(contentId, file.length());
+        String absolutePath = fileStoreService.genFilePath(contentId, file.length(), suffix);
         try {
             File savedFile = new File(absolutePath);
             if (savedFile.exists()) {

+ 19 - 0
dfs-store/src/main/resources/mapper/AudioFileMapper.xml

@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="cn.reghao.dfs.store.db.mapper.AudioFileMapper">
+    <insert id="save" useGeneratedKeys="true" keyProperty="id">
+        insert into audio_file
+        (`id`,`deleted`,`create_time`,`update_time`,`audio_file_id`,`object_id`,`codec`,`url`)
+        values
+        (#{id},#{deleted},#{createTime},#{updateTime},#{audioFileId},#{objectId},#{codec},#{url})
+    </insert>
+
+    <select id="findAll" resultType="cn.reghao.dfs.store.model.po.AudioFile">
+        select * from audio_file
+    </select>
+    <select id="findByFileId" resultType="cn.reghao.dfs.store.model.po.AudioFile">
+        select * from audio_file
+        where audio_file_id=#{audioFileId}
+    </select>
+</mapper>

+ 5 - 3
dfs-store/src/test/java/FileTest.java

@@ -1,3 +1,4 @@
+import cn.reghao.jutil.jdk.io.FileType;
 import cn.reghao.jutil.media.FFmpegWrapper;
 import cn.reghao.jutil.media.MediaQuality;
 import cn.reghao.jutil.media.MediaResolution;
@@ -101,14 +102,15 @@ public class FileTest {
 
     @Test
     public void test22() throws IOException {
-        String baseDir = "/home/reghao/mnt/porn/1.待发布/13996.反差婊系列/p/";
-        Path path = Path.of(baseDir);
+        //String baseDir = "/home/reghao/mnt/porn/1.待发布/13996.反差婊系列/p/";
+        //Path path = Path.of(baseDir);
         //walkDir(path);
 
         String filePath = "/home/reghao/Downloads/仁和区 2.m4a";
         filePath = "/home/reghao/Downloads/三生三世.wav";
-        FFmpegWrapper.convertAudio(filePath, "/home/reghao/Downloads/三生三世.m4a");
+        String mediaType = FileType.getMediaType(filePath);
         MediaProps mediaProps = FFmpegWrapper.getMediaProps(filePath);
+        //FFmpegWrapper.convertAudio(filePath, "/home/reghao/Downloads/三生三世.m4a");
         System.out.println();
     }
 }