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

java截取视频帧

一、通过JavaCV

引入依赖

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

工具类

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;public class JavaCvUtil {/*** @param videoFilePath 视频文件路径* @param outFramePath 输出帧的路径* @param frameNum  帧序号,从1开始* @return  返回真图片对应的File对象*/public static File getFrameFile(String videoFilePath, String outFramePath, int frameNum) {try (FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(videoFilePath)) {grabber.start();// 获取帧Frame frame = null;while (frameNum > 0) {frame = grabber.grabImage();frameNum--;}// 转换为BufferedImageJava2DFrameConverter converter = new Java2DFrameConverter();BufferedImage image = converter.getBufferedImage(frame);// 保存为图片ImageIO.write(image, "jpg", new File(outFramePath));System.out.println("帧已保存到: " + outFramePath);return new File(outFramePath);} catch (Exception e) {e.printStackTrace();}return null;}
}

二、通过ffmpeg命令

首先要下载ffmpeg,配置环境变量,可参考:FFmpeg 超级详细安装与配置教程(Windows 系统)_windows安装ffmpeg-CSDN博客

工具类

import java.io.File;
import java.io.IOException;public class FfmpegUtil {/*** @param videoFilePath 视频文件路径* @param outFramePath 输出帧的路径* @param frameNum  帧序号,从1开始* @return  返回真图片对应的File对象*/public static File getFrameFile(String videoFilePath, String outFramePath, int frameNum) {try {ProcessBuilder pb = new ProcessBuilder("ffmpeg","-i", videoFilePath,"-vframes", "1",//  由于ffmpeg的参数select的参数n是0开始,所以这里减1"-vf","select=eq(n\\,%d)".formatted(frameNum - 1),"-q:v", "2",outFramePath);Process process = pb.start();int exitCode = process.waitFor();if (exitCode == 0) {System.out.println("帧已保存到: " + outFramePath);} else {System.out.println("截取帧失败");}return new File(outFramePath);} catch (IOException | InterruptedException e) {e.printStackTrace();}return null;}
}

http://www.dtcms.com/a/280355.html

相关文章:

  • c#进阶之数据结构(字符串篇)----String
  • C++中list各种基本接口的模拟实现
  • 【Java代码审计(2)】MyBatis XML 注入审计
  • 153.在 Vue 3 中使用 OpenLayers + Cesium 实现 2D/3D 地图切换效果
  • java中的接口
  • JavaScript 动态访问嵌套对象属性问题记录
  • HarmonyOS-ArkUI: Web组件加载流程1
  • 暴力破解:攻破系统的终极密钥
  • Rust指针选择
  • 安装带GPU的docker环境
  • 20250715使用荣品RD-RK3588开发板在Android13下接入USB3.0接口的红外相机
  • 【I3D 2024】Deblur-GS: 3D Gaussian Splatting from Camera Motion Blurred Images
  • 记录一条面试sql题目
  • JS中async/await功能介绍和使用演示
  • 普通字符类型和new String有什么区别
  • 使用JS编写动态表格
  • 【env环境】rtthread5.1.0使用fal组件
  • AI的外挂知识库,RAG检索增强生成技术
  • 【PTA数据结构 | C语言版】将表达式树转换成中缀表达式
  • 数仓面试题
  • 2025最新国产用例管理工具评测:Gitee Test、禅道、蓝凌测试、TestOps 哪家更懂研发协同?
  • docker停止所有容器和删除所有镜像
  • 从一道题目(阿里2014 Crackme_2)开启unidbg还原算法入门(转载)
  • 强化学习书籍
  • vscode 打开c++文件注释乱码
  • 分布式存储之Ceph使用指南--部署篇(未完待续)
  • Claude 背后金主亚马逊亲自下场,重磅发布 AI 编程工具 Kiro 现已开启免费试用
  • 【交叉编译报错】fatal: not a git repository (or any of the parent directories): .git
  • 分布式全局唯一ID生成:雪花算法 vs Redis Increment,怎么选?
  • 内存的基础相关知识,什么是内存,内存管理