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