提交 47dbe6cd 作者: 方治民

feat: 采用本地环境 ffmpeg + wrap 方式处理音视频,减少依赖包大小

上级 075e438f
...@@ -54,10 +54,6 @@ dependencies { ...@@ -54,10 +54,6 @@ dependencies {
implementation "io.minio:minio:${minioVersion}" implementation "io.minio:minio:${minioVersion}"
implementation "com.squareup.okhttp3:okhttp:${okhttpVersion}" implementation "com.squareup.okhttp3:okhttp:${okhttpVersion}"
// Optional: 扩展实现在文件上传时对文件进行预处理,依赖 Minio 模块 // Optional: 扩展实现在文件上传时对文件进行预处理,依赖 Minio 模块
// https://mvnrepository.com/artifact/org.bytedeco/javacv
implementation 'org.bytedeco:javacv:1.5.7'
// https://mvnrepository.com/artifact/org.bytedeco/ffmpeg-platform
implementation 'org.bytedeco:ffmpeg-platform:5.0-1.5.7'
// https://mvnrepository.com/artifact/org.apache.pdfbox/pdfbox // https://mvnrepository.com/artifact/org.apache.pdfbox/pdfbox
implementation "org.apache.pdfbox:pdfbox:${pdfboxVersion}" implementation "org.apache.pdfbox:pdfbox:${pdfboxVersion}"
// https://mvnrepository.com/artifact/net.bramp.ffmpeg/ffmpeg // https://mvnrepository.com/artifact/net.bramp.ffmpeg/ffmpeg
......
...@@ -12,6 +12,7 @@ import java.nio.file.Path; ...@@ -12,6 +12,7 @@ import java.nio.file.Path;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
import java.util.Objects; import java.util.Objects;
import lombok.Cleanup;
import lombok.NonNull; import lombok.NonNull;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
...@@ -106,7 +107,9 @@ public record Minio(MinioConfig config, MinioClient client) { ...@@ -106,7 +107,9 @@ public record Minio(MinioConfig config, MinioClient client) {
} }
Path path = file.toPath(); Path path = file.toPath();
return putObject(Files.newInputStream(path), Files.probeContentType(path), object); @Cleanup
InputStream inputStream = Files.newInputStream(path);
return putObject(inputStream, Files.probeContentType(path), object);
} }
/** /**
......
/* (C) 2022 YiRing, Inc. */ /* (C) 2022 YiRing, Inc. */
package com.yiring.common.service; package com.yiring.common.service;
import java.io.InputStream; import java.nio.file.Path;
/** /**
* 文件上传媒体文件预处理服务 * 文件上传媒体文件预处理服务
...@@ -19,10 +19,10 @@ public interface UploadProcessService { ...@@ -19,10 +19,10 @@ public interface UploadProcessService {
* 视频封面:haha.mp4 -> haha.mp4.jpg 截取视频封面 * 视频封面:haha.mp4 -> haha.mp4.jpg 截取视频封面
* *
* @param object 上传文件存储地址 * @param object 上传文件存储地址
* @param is 文件流 * @param path 文件地址
* @return 预处理后的文件地址(可能对文件名追加了时长、页数、分辨率等标识) * @return 预处理后的文件地址(可能对文件名追加了时长、页数、分辨率等标识)
*/ */
default String handle(String object, InputStream is) { default String handle(String object, Path path) {
return object; return object;
} }
} }
/* (C) 2023 YiRing, Inc. */ /* (C) 2023 YiRing, Inc. */
package com.yiring.common.service.impl; package com.yiring.common.service.impl;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import com.yiring.common.core.Minio; import com.yiring.common.core.Minio;
import com.yiring.common.service.FileManageService; import com.yiring.common.service.FileManageService;
import com.yiring.common.service.UploadProcessService; import com.yiring.common.service.UploadProcessService;
import com.yiring.common.util.Commons;
import java.nio.file.Path;
import java.nio.file.Paths;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
...@@ -39,11 +43,20 @@ public class FileManageServiceImpl implements FileManageService { ...@@ -39,11 +43,20 @@ public class FileManageServiceImpl implements FileManageService {
String uuid = IdUtil.fastSimpleUUID(); String uuid = IdUtil.fastSimpleUUID();
String object = minio.buildUploadPath(filename, "", uuid); String object = minio.buildUploadPath(filename, "", uuid);
// 将上传的文件转存一份到本地临时目录
Path tempFile = Paths.get(FileUtil.getTmpDirPath(), Commons.uuid(), filename);
FileUtil.mkParentDirs(tempFile);
file.transferTo(tempFile);
// 预处理(默认不做任何处理,具体逻辑需自行在外部实现) // 预处理(默认不做任何处理,具体逻辑需自行在外部实现)
object = service.handle(object, file.getInputStream()); object = service.handle(object, tempFile);
// 删除为本次上传进行本地处理所创建的整个临时文件夹目录
// 上传原文件 FileUtil.del(tempFile.getParent());
minio.putObject(file.getInputStream(), file.getContentType(), object);
// 上传原文件(如果是转换成了 m3u8 hls 文件则不保存原文件)
String suffix = ".m3u8";
if (filename.endsWith(suffix) || !object.endsWith(suffix)) {
minio.putObject(file.getInputStream(), file.getContentType(), object);
}
return minio.getDefaultURI(object); return minio.getDefaultURI(object);
} }
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论