From ca17d6ee8df1e7c28645e70f43deb6b60a8890f8 Mon Sep 17 00:00:00 2001
From: Helius <wangdoubleone@gmail.com>
Date: Wed, 22 Dec 2021 14:14:44 +0800
Subject: [PATCH] fix

---
 src/main/java/cc/mrbird/febs/common/utils/FileUtil.java                           |   34 +++++++++++
 src/main/java/cc/mrbird/febs/video/controller/CommonController.java               |   16 +++++
 src/main/java/cc/mrbird/febs/video/service/IVideoMasterSourceService.java         |    2 
 src/main/java/cc/mrbird/febs/video/service/impl/VideoMasterSourceServiceImpl.java |   35 +++++++++++
 src/main/java/cc/mrbird/febs/video/entity/VideoMasterSourceEntity.java            |    5 +
 pom.xml                                                                           |   34 +++++++++++
 6 files changed, 125 insertions(+), 1 deletions(-)

diff --git a/pom.xml b/pom.xml
index 57c559f..ed17d46 100644
--- a/pom.xml
+++ b/pom.xml
@@ -270,6 +270,40 @@
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-amqp</artifactId>
         </dependency>
+
+        <!-- jave 核心依赖 -->
+        <dependency>
+            <groupId>ws.schild</groupId>
+            <artifactId>jave-core</artifactId>
+            <version>2.4.6</version>
+        </dependency>
+
+        <!-- 根据不同操作系统引入不同FFmpeg包 -->
+
+        <!-- window32位 FFmpeg -->
+        <dependency>
+            <groupId>ws.schild</groupId>
+            <artifactId>jave-native-win32</artifactId>
+            <version>2.4.6</version>
+        </dependency>
+        <!-- window64位 FFmpeg -->
+        <dependency>
+            <groupId>ws.schild</groupId>
+            <artifactId>jave-native-win64</artifactId>
+            <version>2.4.6</version>
+        </dependency>
+        <!-- linux64位 FFmpeg -->
+        <dependency>
+            <groupId>ws.schild</groupId>
+            <artifactId>jave-native-linux64</artifactId>
+            <version>2.4.6</version>
+        </dependency>
+        <!-- macos64位 FFmpeg -->
+        <dependency>
+            <groupId>ws.schild</groupId>
+            <artifactId>jave-native-osx64</artifactId>
+            <version>2.4.6</version>
+        </dependency>
     </dependencies>
 
     <build>
diff --git a/src/main/java/cc/mrbird/febs/common/utils/FileUtil.java b/src/main/java/cc/mrbird/febs/common/utils/FileUtil.java
index 69a5d5d..9cc622c 100644
--- a/src/main/java/cc/mrbird/febs/common/utils/FileUtil.java
+++ b/src/main/java/cc/mrbird/febs/common/utils/FileUtil.java
@@ -1,10 +1,16 @@
 package cc.mrbird.febs.common.utils;
 
 import cc.mrbird.febs.common.entity.FebsConstant;
+import cc.mrbird.febs.common.exception.FebsException;
 import com.google.common.base.Preconditions;
+import com.google.common.collect.ImmutableList;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.io.FilenameUtils;
 import org.apache.commons.lang3.ArrayUtils;
 import org.apache.commons.lang3.StringUtils;
+import ws.schild.jave.EncoderException;
+import ws.schild.jave.MultimediaInfo;
+import ws.schild.jave.MultimediaObject;
 
 import javax.servlet.http.HttpServletResponse;
 import java.io.*;
@@ -23,6 +29,8 @@
 public class FileUtil {
 
     private static final int BUFFER = 1024 * 8;
+    private static ImmutableList<String> videoSuffixList = ImmutableList.of("mp4", "mov", "avi", "mkv", "m4v", "wmv",
+            "asf", "asx", "rm", "rmvb", "3gp", "dat", "flv", "vob");
 
     /**
      * 压缩文件或目录
@@ -162,4 +170,30 @@
             }
         }
     }
+
+    public static boolean isVideo(File file) {
+        return videoSuffixList.contains(FilenameUtils.getExtension(file.getName()));
+    }
+
+    /**
+     * 获取视频时长(秒)
+     *
+     * @param file
+     * @return
+     */
+    public static Integer getVideoTimeSecond(File file) {
+        if (!isVideo(file)){
+            throw new FebsException("不是视频");
+        }
+
+        MultimediaObject multimediaObject = new MultimediaObject(file);
+        MultimediaInfo info = null;
+        try {
+            info = multimediaObject.getInfo();
+        } catch (EncoderException e) {
+            log.error("视频异常:", e);
+            throw new FebsException("视频处理异常");
+        }
+        return (int) Math.ceil((double) info.getDuration() / 1000);
+    }
 }
diff --git a/src/main/java/cc/mrbird/febs/video/controller/CommonController.java b/src/main/java/cc/mrbird/febs/video/controller/CommonController.java
index 662ea12..785d190 100644
--- a/src/main/java/cc/mrbird/febs/video/controller/CommonController.java
+++ b/src/main/java/cc/mrbird/febs/video/controller/CommonController.java
@@ -2,6 +2,7 @@
 
 import cc.mrbird.febs.common.entity.FebsResponse;
 import cc.mrbird.febs.common.exception.FebsException;
+import cc.mrbird.febs.common.utils.FileUtil;
 import cn.hutool.core.lang.UUID;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
@@ -11,6 +12,9 @@
 import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.multipart.MultipartFile;
 import org.springframework.web.multipart.MultipartRequest;
+import ws.schild.jave.EncoderException;
+import ws.schild.jave.MultimediaInfo;
+import ws.schild.jave.MultimediaObject;
 
 import java.io.File;
 import java.io.IOException;
@@ -98,5 +102,15 @@
         return fileUrlMap;
 
     }
-    
+
+    public static void main(String[] args) throws EncoderException {
+        File file = new File("http://120.27.238.55:8000/video/20211216/9c7d8952-aadb-4fa1-b9c7-a07ab414a394.mp4");
+
+        boolean directory = file.isDirectory();
+        boolean video = FileUtil.isVideo(file);
+        MultimediaObject multimediaObject = new MultimediaObject(file);
+        MultimediaInfo info = multimediaObject.getInfo();
+        int duration = (int) Math.ceil((double) info.getDuration() / 1000);
+        System.out.println(duration);
+    }
 }
diff --git a/src/main/java/cc/mrbird/febs/video/entity/VideoMasterSourceEntity.java b/src/main/java/cc/mrbird/febs/video/entity/VideoMasterSourceEntity.java
index 038815d..284b790 100644
--- a/src/main/java/cc/mrbird/febs/video/entity/VideoMasterSourceEntity.java
+++ b/src/main/java/cc/mrbird/febs/video/entity/VideoMasterSourceEntity.java
@@ -33,6 +33,11 @@
     private String timeLength;
 
     /**
+     * 视频时长(秒)
+     */
+    private Integer timeSecond;
+
+    /**
      * 是否同步修改
      */
     @TableField(exist = false)
diff --git a/src/main/java/cc/mrbird/febs/video/service/IVideoMasterSourceService.java b/src/main/java/cc/mrbird/febs/video/service/IVideoMasterSourceService.java
index 07f974e..1cb68aa 100644
--- a/src/main/java/cc/mrbird/febs/video/service/IVideoMasterSourceService.java
+++ b/src/main/java/cc/mrbird/febs/video/service/IVideoMasterSourceService.java
@@ -10,6 +10,8 @@
 
     IPage<VideoMasterSourceEntity> findInPage(VideoMasterSourceEntity source, QueryRequest queryRequest);
 
+    void addSource(VideoMasterSourceEntity source);
+
     void modifySourceById(VideoMasterSourceEntity source);
 
     void delSource(String ids);
diff --git a/src/main/java/cc/mrbird/febs/video/service/impl/VideoMasterSourceServiceImpl.java b/src/main/java/cc/mrbird/febs/video/service/impl/VideoMasterSourceServiceImpl.java
index 207399f..b67a20f 100644
--- a/src/main/java/cc/mrbird/febs/video/service/impl/VideoMasterSourceServiceImpl.java
+++ b/src/main/java/cc/mrbird/febs/video/service/impl/VideoMasterSourceServiceImpl.java
@@ -2,19 +2,23 @@
 
 import cc.mrbird.febs.common.entity.QueryRequest;
 import cc.mrbird.febs.common.utils.AppContants;
+import cc.mrbird.febs.common.utils.FileUtil;
 import cc.mrbird.febs.video.entity.VideoMasterSourceEntity;
 import cc.mrbird.febs.video.mapper.VideoMasterItemsMapper;
 import cc.mrbird.febs.video.mapper.VideoMasterSourceMapper;
 import cc.mrbird.febs.video.service.IVideoMasterSourceService;
+import cn.hutool.core.lang.Assert;
 import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.io.File;
 import java.util.Date;
 import java.util.List;
 
@@ -29,6 +33,12 @@
 
     private final VideoMasterItemsMapper videoMasterItemsMapper;
 
+    @Value("${system.images.path}")
+    private String baseSavePath;
+
+    @Value("${system.images.url}")
+    private String baseUrl;
+
     @Override
     public IPage<VideoMasterSourceEntity> findInPage(VideoMasterSourceEntity source, QueryRequest queryRequest) {
         Page<VideoMasterSourceEntity> page = new Page<>(queryRequest.getPageNum(), queryRequest.getPageSize());
@@ -36,10 +46,21 @@
         return this.baseMapper.selectInPage(source, page);
     }
 
+    @Override
+    public void addSource(VideoMasterSourceEntity source) {
+        Integer second = getVideoTimeLength(source.getUrl());
+        source.setTimeSecond(second);
+        source.setTimeLength(timeFormat(second));
+        this.baseMapper.insert(source);
+    }
+
     @Transactional
     @Override
     public void modifySourceById(VideoMasterSourceEntity source) {
+        Integer second = getVideoTimeLength(source.getUrl());
         source.setUpdatedTime(new Date());
+        source.setTimeSecond(second);
+        source.setTimeLength(timeFormat(second));
         this.baseMapper.updateById(source);
 
         // 同步修改 即将所有关联到这个资源的视频中的url更新为最新url
@@ -53,4 +74,18 @@
         List<String> idList = StrUtil.split(ids, ',');
         this.baseMapper.updateDelFlag(AppContants.FLAG_INT_Y, idList);
     }
+
+    private Integer getVideoTimeLength(String url) {
+        Assert.notBlank(url);
+
+        String filePath = baseSavePath + url.replaceAll(baseUrl, "");
+        File file = new File(filePath);
+        return FileUtil.getVideoTimeSecond(file);
+    }
+
+    private String timeFormat(Integer time) {
+        int minutes = time / 60;
+        int second = time -  time * 60;
+        return  minutes + ":" + second;
+    }
 }

--
Gitblit v1.9.1