【JAVA】生成视频缩略图并上传至Minio

  1. 需求
    (1)使用照片墙方式将图片上传到Minio
    (2)将上传的图片生成缩略图
    (3)将缩略图上传到Minio

  2. 目的:节省空间、避免图片过多加载不出来

  3. Java端
    (1)pom.xml引入依赖

 	<!--视频缩略图 --><dependency<groupId>org.bytedeco</groupId><artifactId>javacv</artifactId><version>1.4.3</version></dependency><dependency><groupId>org.bytedeco.javacpp-presets</groupId><artifactId>ffmpeg-platform</artifactId><version>4.0.2-1.4.3</version></dependency>

(2)Controller.java

	/*** 批量新增上传的视频*/@PostMapping("/batchSaveMediaVideo")@ApiOperationSupport(order = 11)@ApiOperation(value = "批量新增", notes = "传入List<archiveMediaVideo>")public R batchSaveMediaVideo(@Valid @RequestBody List<ArchiveMediaVideoEntity> archiveMediaVideo) throws FrameGrabber.Exception {boolean result = archiveMediaVideoService.batchSaveMediaVideo(archiveMediaVideo);return R.status(result);}

(3)Service.java

boolean batchSaveMediaVideo(List<ArchiveMediaVideoEntity> archiveMediaVideo) throws FrameGrabber.Exception;

(4)ServiceImpl.java

import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.bytedeco.javacv.FFmpegFrameGrabber;
import org.bytedeco.javacv.Frame;
import org.bytedeco.javacv.FrameGrabber;
import org.bytedeco.javacv.Java2DFrameConverter;
import org.springblade.core.mp.base.BaseServiceImpl;
import org.springblade.core.oss.model.BladeFile;
import org.springblade.modules.archive.vo.ArchiveMediaVideoVO;
import org.springblade.modules.resource.builder.oss.OssBuilder;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.util.ArrayList;@Service
public class ArchiveMediaVideoServiceImpl{// 对象存储构建类Minioprivate final OssBuilder ossBuilder;public ArchiveMediaVideoServiceImpl(OssBuilder ossBuilder) {this.ossBuilder = ossBuilder;}// 具体方法@Overridepublic boolean batchSaveMediaVideo(List<ArchiveMediaVideoEntity> archiveMediaVideo) throws FrameGrabber.Exception {ArrayList<ArchiveMediaVideoEntity> archiveList = new ArrayList<>();for(ArchiveMediaVideoEntity archiveVideoFile  : archiveMediaVideo){// 定义缩略图的名称String substring = archiveVideoFile.getOriginalName().substring(0, archiveVideoFile.getOriginalName().indexOf("."));String fileName = substring + ".jpg";// 根据原视频路径生成缩略图流并上传到MinioFFmpegFrameGrabber ff = new FFmpegFrameGrabber(archiveVideoFile.getLink());try {ff.start();int lenght = ff.getLengthInFrames();int i = 0;Frame f = null;while (i < lenght) {// 过滤前5帧f = ff.grabFrame();if ((i > 48) && (f.image != null)) {break;}i++;}int owidth = f.imageWidth;int oheight = f.imageHeight;// 对截取的帧进行等比例缩放int width = 300;int height = (int) (((double) width / owidth) * oheight);Java2DFrameConverter converter = new Java2DFrameConverter();BufferedImage fecthedImage = converter.getBufferedImage(f);BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR);// 缩略图流bi.getGraphics().drawImage(fecthedImage.getScaledInstance(width, height, Image.SCALE_SMOOTH),0, 0, null);//创建一个空字节输出流ByteArrayOutputStream out1 = new ByteArrayOutputStream();InputStream in = null;// 将缩略图流转为.jpg后缀的图片boolean jpg = ImageIO.write(bi, "jpg", out1);// .jpg后缀的图片转换成输入流in = new ByteArrayInputStream(out1.toByteArray());// 上传缩略图到 minio并命名BladeFile bladeFile = ossBuilder.template().putFile(fileName, in);// 将缩略图更新到表 admin_archive_media_video中archiveVideoFile.setThumbLink(bladeFile.getLink());archiveList.add(archiveVideoFile);// 删除临时文件以及目录} catch (Exception e) {e.printStackTrace();System.out.println("ImgBase64Util fetchFrame() error.");} finally {ff.stop();ff.close();}}boolean result = this.saveOrUpdateBatch(archiveList);return result;}
}
  1. 问题
    (1)Could not initialize class org.bytedeco.javacpp.avutil
    原因:引入的依赖包之间不匹配(最开始引入的javac版本是1.4.1)
    参考:https://blog.csdn.net/weixin_42534940/article/details/84673956
    (2)java.io.FileNotFoundException(拒绝访问)
    原因:找不到目标路径,是要具体到文件名称。
    参考:参考1 和 参考2
    (3)OpenJDK 64-Bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap classpath has been appended
    现象:启动项目时报错
    在这里插入图片描述
    方法:在顶部栏里选择File → Settings… → 输入async+回车 → 把图中的勾选的√去掉 → 保存
    在这里插入图片描述
    (4)获取字符串
    例如:test.mp4
    需求:获取test
    方法:String substring = name().substring(0, name.indexOf(“.”));
    参考:https://www.php1.cn/detail/java_ZiFuChuanJi_107d53e8.html
    (5)生成视频缩略图,如果使用临时存储在本地的方法,那么需要考虑如何删除临时文件。而使用空字节输出流不会有这个问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/14658.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

华为OD机试真题 Java 实现【查找树中元素】【2023 B卷 100分】,附详细解题思路

目录 一、题目描述二、输入描述三、输出描述四、补充说明五、Java算法源码六、效果展示1、输入2、输出 一、题目描述 已知树形结构的所有节点信息&#xff0c;现要求根据输入坐标&#xff08;x,y&#xff09;找到该节点保存的内容值&#xff1b; 其中&#xff1a; x表示节点…

VSCode中打开NodeJS项目自动切换对应版本的配置

这几年搞了不少静态站点&#xff0c;有的是Hexo的&#xff0c;有的是VuePress的。由于不同的主题对于NodeJS的版本要求不同&#xff0c;所以本机上不少NodeJS的版本。 关于如何管理多个NodeJS版本&#xff0c;很早之前就写过用nvm来管理的相关文章&#xff0c;这里就不赘述了&a…

迁移学习入门,新手该如何下手?

推荐迁移学习技术的实用入门图书:《自然语言处理迁移学习实战》 [加纳] 保罗阿祖雷&#xff08;Paul Azunre&#xff09; 著&#xff0c;李想&#xff0c;朱仲书&#xff0c;张世武 译 一本书带你读懂ChatGPT背后的技术&#xff0c;自然语言处理迁移学习&#xff0c;解锁机器学…

WiFi 时钟+本地温度

[ WiFi 时钟 ] [ WiFi 天气时钟 ] [ WiFi 时钟本地温度 ] 夏天到了&#xff0c;显示器上放一个时钟&#xff0c;顺便实时测量本地室温&#xff0c;看看空调工作是否正常也算是个实用制作。 用到零件共 4 个&#xff1a; 400孔面包板 &#xff08; 大号…

RabbitMQ系列(29)--RabbitMQ搭建Shovel

前言&#xff1a; Federation具备的数据转发功能类似&#xff0c;Shovel能够可靠、持续地从一个Broker中的队列(作为源端&#xff0c;即source)拉取数据并转发至另一个Broker中的交换器(作为目的端&#xff0c;即destination)。作为源端的队列和作为目的端的交换器可以同时位于…

windows设置右键一键打开文件的配置

在安装软件时一般通过msi或者exe安装&#xff0c;这是一般会有提示绑定到鼠标右键&#xff0c;如果没有勾选则安装后就无法通过右键打开&#xff0c;这是需要把文件拖到快捷方式上面才可以使用该软件打开。 另外如何下载的是zip的压缩包源码格式根本没有设置的选项&#xff0c…

MySQL数据库——表操作的练习

题目一 &#xff08;1&#xff09; mysql> create database Market; &#xff08;2&#xff09; mysql> use Market; Database changed mysql> create table customers(->c_num INT(11) primary key auto_increment,->c_name varchar(50),->c_contact varcha…

45. 跳跃游戏 II (贪心)

题目链接&#xff1a;力扣 解题思路&#xff1a;贪心&#xff0c;尽可能地找到下一跳能够跳到的最远距离&#xff0c;这样到达终点时&#xff0c;所需跳跃次数最少 以nums [2,3,1,1,4,2]为例&#xff1a; 以当前位置begin作为起跳点&#xff0c;能够跳跃的最远距离为m&#…

B067-基础环境-抽取Basegit

目录 抽取base抽取domain和querymapper接口抽取service抽取 Git优点&#xff1a;Git安装及操作Git Bash命令行操作图形化客户端TortoiseGit操作Git集成Idea操作idea会把workspace作为本地仓库gitee操作idea解决代码冲突 抽取base 抽取domain和query domain&#xff1a;所有实体…

抖音seo矩阵源码*开发搭建*代码打包部署(开源)分享

1一、 抖音seo矩阵源码开发搭建&#xff08;支持二开&#xff09;概述 抖音SEO矩阵指的是一系列通过搜索引擎优化&#xff08;SEO&#xff09;技术和策略来提升抖音账号在搜索结果中排名的方法和工具。在抖音上&#xff0c;用户可以通过搜索关键词来查找与其相关的视频和账号…

Oracle-奇怪的expdp备份报错LPX-00217

问题背景: 接用户报障&#xff0c;数据库每天晚上正常的expdp备份&#xff0c;从2天前开始出现奇怪的备份报错LPX-00217: invalid character 3 问题分析: 检查expdp备份的日志&#xff0c;从2天前晚上开始的备份均出现LPX-00217: invalid character 3的报错&#xff0c;报错均…

两个好用到爆的Python模块,建议收藏!

在日常开发工作中&#xff0c;经常会遇到这样的一个问题&#xff1a;要对数据中的某个字段进行匹配&#xff0c;但这个字段有可能会有微小的差异。比如同样是招聘岗位的数据&#xff0c;里面省份一栏有的写“广西”&#xff0c;有的写“广西壮族自治区”&#xff0c;甚至还有写…