当前位置: 首页 > news >正文

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️⃣运行结果

相关文章:

  • java list集合相关介绍和方法使用操作
  • Quicker读取浏览器的书签(包括firefox火狐)
  • Camunda流程引擎数据库架构
  • Redis面试题43
  • vuecli3 执行 npm run build 打包命令报错:TypeError: file.split is not a function
  • EasyExcel分页上传数据
  • json、jsonlines格式化显示
  • Android:国际化弹出框
  • Linux下centos操作系统安装Mysql8.0过程及踩坑填补
  • 鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之Menu组件
  • 通过Spring @Validated 更优雅的实现参数校验
  • Vue3中路由配置Catch all routes (“*“) must .....问题
  • vscode的vetur文档格式化失效
  • 零基础学Python之面向对象
  • 计算机网络相关题目及答案(第五章)
  • 《Javascript高级程序设计 (第三版)》第五章 引用类型
  • 【刷算法】求1+2+3+...+n
  • 5、React组件事件详解
  • echarts的各种常用效果展示
  • iOS 颜色设置看我就够了
  • java8-模拟hadoop
  • javascript 哈希表
  • Java-详解HashMap
  • java小心机(3)| 浅析finalize()
  • Magento 1.x 中文订单打印乱码
  • rabbitmq延迟消息示例
  • Rancher-k8s加速安装文档
  • 笨办法学C 练习34:动态数组
  • 关于 Cirru Editor 存储格式
  • ------- 计算机网络基础
  • 数组大概知多少
  • 微信开放平台全网发布【失败】的几点排查方法
  • PostgreSQL 快速给指定表每个字段创建索引 - 1
  • 支付宝花15年解决的这个问题,顶得上做出十个支付宝 ...
  • # Java NIO(一)FileChannel
  • #【QT 5 调试软件后,发布相关:软件生成exe文件 + 文件打包】
  • #pragma pack(1)
  • #我与Java虚拟机的故事#连载15:完整阅读的第一本技术书籍
  • (145)光线追踪距离场柔和阴影
  • (3)选择元素——(14)接触DOM元素(Accessing DOM elements)
  • (Git) gitignore基础使用
  • (vue)el-checkbox 实现展示区分 label 和 value(展示值与选中获取值需不同)
  • (层次遍历)104. 二叉树的最大深度
  • (二)什么是Vite——Vite 和 Webpack 区别(冷启动)
  • (二十四)Flask之flask-session组件
  • (附源码)springboot高校宿舍交电费系统 毕业设计031552
  • (七)Knockout 创建自定义绑定
  • (求助)用傲游上csdn博客时标签栏和网址栏一直显示袁萌 的头像
  • (四)模仿学习-完成后台管理页面查询
  • (原創) 如何使用ISO C++讀寫BMP圖檔? (C/C++) (Image Processing)
  • .net mvc 获取url中controller和action
  • .net 逐行读取大文本文件_如何使用 Java 灵活读取 Excel 内容 ?
  • @DependsOn:解析 Spring 中的依赖关系之艺术
  • [AutoSAR系列] 1.3 AutoSar 架构
  • [C语言]编译和链接