xiaoyong931011
2021-12-22 f0afca8e5611e46557f69cd22850c630388d329f
Merge branch 'master' of http://120.27.238.55:7000/r/xc-video
6 files modified
126 ■■■■■ changed files
pom.xml 34 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/common/utils/FileUtil.java 34 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/video/controller/CommonController.java 16 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/video/entity/VideoMasterSourceEntity.java 5 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/video/service/IVideoMasterSourceService.java 2 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/video/service/impl/VideoMasterSourceServiceImpl.java 35 ●●●●● patch | view | raw | blame | history
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>
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);
    }
}
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);
    }
}
src/main/java/cc/mrbird/febs/video/entity/VideoMasterSourceEntity.java
@@ -33,6 +33,11 @@
    private String timeLength;
    /**
     * 视频时长(秒)
     */
    private Integer timeSecond;
    /**
     * 是否同步修改
     */
    @TableField(exist = false)
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);
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;
    }
}