Java实现批量视频抽帧2.0

继上个版本 对其进行略微升级    🤓

上个版本仅对一个视频进行抽帧处理

此版本可对一个文件夹内的全部视频进行抽帧并对应的文件夹进行帧图片的保存

 1️⃣配置pom.xml        (保持上次不变)

    <dependencies><dependency><groupId>org.bytedeco</groupId><artifactId>javacv-platform</artifactId><version>1.5.7</version></dependency></dependencies>

2️⃣创建Util工具类        (本次所有方法都在次类中)

import org.bytedeco.javacv.FFmpegFrameGrabber;
import org.bytedeco.javacv.Frame;
import org.bytedeco.javacv.Java2DFrameConverter;import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;public class Util {//读取文件夹的内容并执行1️⃣创建文件夹2️⃣抽帧public static String ReadFolderFiles(String address) {//存放读取到的路径ArrayList<String> strings = new ArrayList<>();// 文件夹路径String folderPath = address;// 创建File对象File folder = new File(folderPath);// 检查文件夹是否存在if (folder.exists() && folder.isDirectory()) {int num;String strCreate = "";String strFrame = "";// 获取文件夹中的所有文件名File[] files = folder.listFiles();// 将子文件夹的名称添加到ArrayList中并过滤掉当前文件夹名for (File file : files) {if (!file.getName().equals(".DS_Store")) {strings.add(file.getName());}}num = strings.size();// 输出文件名数组for (String fileName : strings) {String oldfileName = address+"/"+fileName;String str = fileName.substring(0,fileName.indexOf('.'));String newFileName = address+"/"+str;strCreate = CreateFolder(newFileName);strFrame = FrameExtractor(oldfileName);}return String.format(strCreate+"\n已对%d个视频进行抽帧\n"+strFrame+"至对应文件夹",num);} else {return "指定的文件夹不存在或不是一个文件夹";}}//1️⃣根据视频名称创建对应文件夹private static String CreateFolder(String fileName){String str;// 文件夹名String folderName = fileName;// 创建一个File对象,表示文件夹路径File folder = new File(folderName);// 使用mkdir()方法创建文件夹if (!folder.exists()) {if (folder.mkdir()) {str = "文件夹创建成功!";} else {str = "文件夹创建失败!";}} else {str = "文件夹已存在!";}return str;}//2️⃣将视频转为帧图片public static String FrameExtractor(String address){String str;// 视频文件路径String videoFilePath = address;// 创建FFmpegFrameGrabber对象FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(videoFilePath);try {// 打开视频文件grabber.start();// 逐帧抓取视频Frame frame;int frameNumber = 1;//保存路径String createaddress = address.substring(0,address.indexOf("."));while ((frame = grabber.grabImage()) != null) {BufferedImage bufferedImage = frameToBufferedImage(frame);// 生成保存帧图像的文件路径String outputFilePath = String.format("%s/frame_%05d.jpg", createaddress, frameNumber);// 保存帧图像到文件try {ImageIO.write(bufferedImage, "jpg", new File(outputFilePath));} catch (IOException e) {e.printStackTrace();str = "保存失败";}frameNumber++;}// 关闭视频文件grabber.stop();str = "保存成功";} catch (org.bytedeco.javacv.FrameGrabber.Exception e) {e.printStackTrace();str = "保存失败";}return str;}//将Frame转换为BufferedImageprivate static BufferedImage frameToBufferedImage(Frame frame) {Java2DFrameConverter converter = new Java2DFrameConverter();return converter.getBufferedImage(frame);}
}

3️⃣运行结果

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

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

相关文章

企业在什么情况下需要一款固定资产管理系统?

在现代商业环境中&#xff0c;企业的固定资产是其运营和发展的重要基础。然而&#xff0c;许多企业在固定资产管理方面面临着挑战&#xff0c;如信息不准确、效率低下和资源浪费等问题。为了解决这些问题&#xff0c;越来越多的企业开始意识到引入一款固定资产管理系统的重要性…

网络异步编程

网络异步编程 一、tcp连接的状态 LISTEN&#xff1a;服务端状态&#xff0c;等待客户端发起连接请求SYN_SENT&#xff1a;客户端已发送同步连接请求&#xff0c;等待服务端相应SYN_RECEIVED&#xff1a;服务器收到客户端的SYN请请求&#xff0c;并发送自己的SYN响应&#xff…

Java基础面试题-7day

I/O流基础知识总结 2 字符流 reader 字符输入流 writer 字符输出流 使用字符流的原因&#xff1a;但我们要读取的文件&#xff0c;字符串含有字符时&#xff0c;如果在不知道该字符对应生成的编码类型是什么就会读取到内存显示的是乱码 所有为了解决&#xff0c;出现了直接操…

使用到UDP协议的情况下该如何防护

一、UDP协议概述 UDP&#xff08;User Datagram Protocol&#xff0c;用户数据报协议&#xff09;是TCP/IP协议栈中的一种无连接的传输协议&#xff0c;能够提供面向事务的简单不可靠数据传输服务。 1.UDP的应用场景 由于缺乏可靠性且属于非连接导向协议&#xff0c;基于UDP…

java仓库进销存商品库存管理系统springboot+vue

库存管理信息系统研究的内容涉及库存管理的全过程&#xff0c;包括入库、出库、退 货、订货、库存统计查询等等。 根据上述工作流程&#xff0c;库存管理系统将包含以下内容 1&#xff09;登录信息的输入&#xff0c;密码的修改。 2&#xff09;基本信息的输入&#xff0c;包括…

JavaScript中,try...catch 语句

在JavaScript中&#xff0c;try...catch 语句用于处理运行时错误。这种结构允许你尝试执行可能会失败的代码&#xff0c;如果失败&#xff0c;则执行 catch 块中的代码。 try 块包含你想要尝试执行的代码&#xff0c;而 catch 块包含当 try 块中的代码抛出错误时执行的代码。 …

部门管理的主要内容:从目标设定到团队发展的全面指南

部门管理是指对一个组织机构中的各个部门进行协调、规划和管理的过程。部门管理的主要内容包括以下几个方面&#xff1a;部门目标和职责的规划、部门人员的管理、部门绩效的评估和监控、部门之间的协调和沟通、部门文化和价值观的塑造。下面为大家具体介绍这些内容 1、部门目标…

vue2混入声明组件、交互流程

vue2中可以使用混入&#xff0c;在当前页面中将混入中声明的组件进行注入 写法 父组件声明混入文件&#xff1a; import mixComponent from "/mixins/mixComponent" export default {mixins:[mixComponent] }mixComponent文件定义方式&#xff0c;类似于一个vue文…

自学网安-IIS服务器

部署环境&#xff1a;win2003 配置环境&#xff1a;winxp ip&#xff1a;10.1.1.2 win2003 ip&#xff1a;10.1.1.1 开始安装 双击“应用程序服务器” 双击“Internet 信息服务&#xff08;IIS&#xff09;” 勾选万维网服务&#xff0c;确定然后下一步 查看端口号;netstat …

ConcurrentHashMap的使用以及源码分析

一、ConcurrentHashMap&#xff1f; 1.1 存储结构 ConcurrentHashMap是线程安全的HashMap ConcurrentHashMap在JDK1.8中是以CASsynchronized实现的线程安全 CAS&#xff1a;在没有hash冲突时&#xff08;Node要放在数组上时&#xff09; synchronized&#xff1a;在出现ha…

Java 日期时间相互转换 格式化输出

Java 日期时间相互转换 格式化输出 package com.zhong.time;import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date;public class SimpleDateFormatTest {public static void main(String[] args) throws ParseException {Date date n…

impala与kudu进行集成

文章目录 概要Kudu与Impala整合配置Impala内部表Impala外部表Impala sql操作kuduImpala jdbc操作表如果使用了Hadoop 使用了Kerberos认证&#xff0c;可使用如下方式进行连接。 概要 Impala是一个开源的高效率的SQL查询引擎&#xff0c;用于查询存储在Hadoop分布式文件系统&am…

设计模式1-访问者模式

访问者模式是一种行为设计模式&#xff0c;它允许你定义在对象结构中的元素上进行操作的新操作&#xff0c;而无需修改这些元素的类。这种模式的主要思想是将算法与元素的结构分离开&#xff0c;使得可以在不修改元素结构的情况下定义新的操作。 所谓算法与元素结构分离&#x…

极速上手:使用Jmeter轻松实现N种参数化

参数化的方式&#xff1a; 一、使用用户自定义变量 一种方式&#xff1a;直接在测试计划中添加用户自定义变量 另外一种方式&#xff1a;配置元件——用户自定义变量 示例&#xff1a;用户自定义变量&#xff0c;登录手机号码 在接口请求的时候&#xff0c;进行引用 请求之后&…

32ADC模数转换器&AD单通道&多通道

目录 一.简介 二.逐次逼近法​编辑 三.结构框图 四.小tips (1)转换模式 &#xff08;2&#xff09;触发控制 &#xff08;3&#xff09;数据对齐 &#xff08;4&#xff09;转换时间 &#xff08;5&#xff09;校准 &#xff08;6&#xff09;硬件电路 五.相关函数 …

vue使用es的reduce方法编译报错Error: Can‘t resolve ‘core-js/modules/es.array.reduce.js‘

哈喽 大家好啊 最近在vue使用es的reduce方法编译报错Error: Cant resolve core-js/modules/es.array.reduce.js 报错如图所示&#xff1a; 解决方案&#xff1a; npm install --save core-js 然后重新编译下将正常了 参考原文: 使用import异步加载语法报错_module not foun…

Android Split APK介绍

文章目录 Split APKSplit APK 详细介绍概念Android App Bundle&#xff08;AAB&#xff09;Split APK 的优势动态分发减小安装包大小模块化和渠道分发 Split APK 的类型基于屏幕密度### 基于 CPU 架构基于语言 实现 Split APK Split APK Split APK 是 Android 中一种应用程序安…

SpringBoot实战第二天

今日战报 继续完善用户相关接口开发&#xff1a; 1.完成获取用户信息功能 2.完成更新用户信息功能 3.完成更新用户头像功能 4.完成更新用户密码功能 获取用户信息 接口文档 如接口文档所示&#xff0c;我们需要做的就是从header中的Authorization中读取token&#xff0c;解码…

问题:测风站应设置在平直的巷道中,其前后()范围内不得有障碍物和拐弯等局部阻力。 #微信#媒体

问题&#xff1a;测风站应设置在平直的巷道中&#xff0c;其前后&#xff08;&#xff09;范围内不得有障碍物和拐弯等局部阻力。 参考答案如图所示

stable-diffusion | v1-5-pruned.ckpt和v1-5-pruned-emaonly.ckpt的区别

https://github.com/runwayml/stable-diffusion?tabreadme-ov-file#reference-sampling-script 对于 1.5 模型&#xff0c;其中可能包括四部分&#xff1a;标准模型、文本编码器、VAE模型、EMA模型。 标准模型&#xff1a;生成图片的核心模块&#xff0c;潜空间中的前向扩散和…