当前位置: 首页 > 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.lryc.cn/news/588709.html

相关文章:

  • 视频HDR技术全解析:从原理到应用的深度探索
  • 音视频学习(三十九):IDR帧和I帧
  • React.FC与React.Component
  • PyCharm 高效入门指南:从安装到效率倍增
  • docker拉取nacos镜像失败
  • lanch4j将jar转成exe
  • 开通保存图片权限
  • iOS高级开发工程师面试——Swift
  • 语言模型玩转3D生成:LLaMA-Mesh开源项目
  • 无人机故障响应模块运行与技术难点
  • 全面安装指南:在Linux、Windows和macOS上部署Apache Cassandra
  • 网络劫持对用户隐私安全的影响:一场无形的数据窃取危机
  • 算法在前端框架中的集成
  • 021_自然语言处理应用
  • 量子比特的稳定性革命:破解量子计算“脆弱密码”的最新突破
  • 读取ubuntu的磁盘分区表与超级块
  • 【高等数学】第三章 微分中值定理与导数的应用——第一节 不定积分的概念与性质
  • 面向医疗AI场景的H20显卡算力组网方案
  • Vue 中 effectScope() 的全面解析与实战应用
  • WPF,Winform,HTML5网页,哪个UI开发速度最快?
  • 板凳-------Mysql cookbook学习 (十一--------11)
  • 使用 Java 获取 PDF 页面信息(页数、尺寸、旋转角度、方向、标签与边框)
  • PySpark Standalone 集群
  • PySpark 常用算子详解
  • Java使用itextpdf7生成pdf文档
  • 【开源】一款基于 .NET 和 Vue3 开源(Apache)的MES管理系统,您的新一代工厂管理助手!
  • 【雅思播客016】New Year Resolution 新年决心
  • Luban配置教程
  • CSS :root伪类详解:实现动态主题切换的关键所在
  • 从浏览器到服务器:TCP 段的网络传输之旅