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; } }