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.hqwc.cn/news/452021.html

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

相关文章

100183. 最大好子数组和

题目&#xff1a; 给你一个长度为 n 的数组 nums 和一个 正 整数 k 。 如果 nums 的一个子数组中&#xff0c;第一个元素和最后一个元素 差的绝对值恰好 为 k &#xff0c;我们称这个子数组为 好 的。换句话说&#xff0c;如果子数组 nums[i..j] 满足 |nums[i] - nums[j]| k…

oc渲染器初始参数怎么设置?oc渲染器初始参数怎么弄

OC渲染器以其用户友好的界面、卓越的渲染品质而受到众多初学者的欢迎&#xff0c;而且它使得创建逼真的视觉效果变得轻而易举。对于产品展示、建筑设计以及室内布局渲染来说&#xff0c;OC渲染器都能表现出优异的性能。下面&#xff0c;我们将介绍新手如何进行OC渲染器的基本初…

Coil:Android上基于Kotlin协程的超级图片加载库

Coil&#xff1a;Android上基于Kotlin协程的超级图片加载库 1. coil简介 在当今移动应用程序的世界中&#xff0c;图片加载是一个不可或缺的功能。为了让应用程序能够高效地加载和显示图片&#xff0c;开发人员需要依赖于强大的图片加载库。而今天&#xff0c;我将向大家介绍…

程序员到底如何成为编程高手或以此创业?

每个IT企业&#xff0c;尤其是初创企业&#xff0c;非常苦恼&#xff1a;找不到好的程序员。现在大学、软件学院及各种培训机构&#xff0c;每年培养几十万的程序员&#xff0c;毕业的每个人都有同样困恼&#xff1a;找不到好的工作。问题出在哪里呢&#xff1f; 其实&#xf…

Linux网络通信——TCP/OSI七层模型/TCP/IP(五层或四层模型)/HTTP报文传输原理

文章目录 消息的传输什么是OSI七层模型OSI七层模型的内容物理层&#xff08;Physical Layer&#xff09;&#xff1a;数据链路层&#xff08;Data Link Layer&#xff09;&#xff1a;网络层&#xff08;Network Layer&#xff09;&#xff1a;传输层&#xff08;Transport Lay…

北朝隋唐文物广西展风采,博物馆环境监测终端全天候守护

​在灿烂的文化星空中&#xff0c;每一件文物都是历史的见证人&#xff0c;它们的保存直接影响到人类后代对过去的了解。近日&#xff0c;“太原博物馆北朝隋朝文物展”在广西民族博物馆拉开序幕&#xff0c;一场视觉历史盛会就此展开。 文物作为不可再生的历史遗产&#xff0c…

【数据结构】并查集(路径压缩)

文章目录 并查集1.朴素版本2.路径压缩3.按秩合并4.启发式合并5.练习题 并查集 1.朴素版本 1. 并查集解决的是连通块的问题&#xff0c;常见操作有&#xff0c;判断两个元素是否在同一个连通块当中&#xff0c;两个非同一连通块的元素合并到一个连通块当中。 并查集和堆的结构…

元数据驱动的思想

元数据驱动的思想 元数据驱动的思想应该不会陌生&#xff0c;但元数据驱动的实践应该会非常陌生。 因为元数据驱动架构是为了解决高频个性化的复杂业务而诞生的&#xff0c;而这种业务场景只存在2B领域。 有关元数据驱动的架构思想&#xff0c;在这里暂先简单抛几个点。&#…

云计算、Docker、K8S问题

1 云计算 云计算作为一种新兴技术&#xff0c;已经在现代社会中得到了广泛应用。它以其高效、灵活和可扩展特性&#xff0c;成为了许多企业和组织在数据处理和存储方面的首选方案。 1.1 什么是云计算&#xff1f;它有哪些特点&#xff1f; 云计算是一种通过网络提供计算资源…

【前端收藏】前端小作文-前端八股文知识总结(超万字超详细)持续更新

有了这个八股文不仅对你基础知识的巩固&#xff0c;不管你是几年老前端程序员&#xff0c;还是要去面试的&#xff0c;文章覆盖了前端常用及不常用的方方面面&#xff0c;都是前端日后能用上的&#xff0c;对你的前端知识有总结意义&#xff0c;看完后&#xff0c;懂的不懂的都…

OJ_成绩排序

题干 c实现 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<vector> #include<algorithm> using namespace std;struct student {int id;int score; };bool compare(student a, student b) {if (a.score > b.score) {return false;}else i…

0130-2-秋招面试—HTML篇

2023 HTML面试题 1.src和href的区别 scr用于替换当前元素&#xff0c;href用于在当前文档和外部资源之间建立联系。 <script src"main.js"></script><link href"style.css" rel"stylesheet" />2.对HTML语义化的理解 根据内…