java 获取视频第一帧 | Java工具类

简介: java 获取视频第一帧 | Java工具类

前言

本文提供提取mp4视频文件的第一帧java工具类。其中包括从url下载视频的策略。

环境依赖

Maven环境依赖

        <dependency>
            <groupId>org.bytedeco</groupId>
            <artifactId>javacv-platform</artifactId>
            <version>1.5.5</version>
        </dependency>
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.5.2</version>
        </dependency>



ffmpeg环境依赖

可以参照我之前写的去安装部署一下:windows ffmpeg安装部署_阿良的博客-CSDN博客

代码

不废话,上工具类。

package ai.guiji.csdn.tools;
import cn.hutool.core.util.IdUtil;
import cn.hutool.http.HttpUtil;
import org.bytedeco.javacpp.Loader;
import java.io.IOException;
import java.util.Optional;
/** @Author huyi @Date 2021/11/11 11:08 @Description: 提取视频第一帧 */
public class ExtractVideoFirstFrameUtil {
  /**
   * 提取主方法
   *
   * @param path MP4视频路径
   * @param tmpDir 临时目录
   * @return 视频第一帧
   * @throws Exception 异常
   */
  public static String extract(String path, String tmpDir) throws Exception {
    String mp4Path;
    if (path.startsWith("http")) {
      mp4Path = tmpDir + "/" + IdUtil.simpleUUID() + ".mp4";
      HttpUtil.downloadFile(path, mp4Path);
    } else {
      mp4Path = path;
    }
    return ffmpegExtractImage(mp4Path, tmpDir + "/" + IdUtil.simpleUUID() + ".jpg")
        .orElseThrow(() -> new Exception("提取失败"));
  }
  /**
   * 提取视频第一帧图片
   *
   * @param mp4Path 视频地址
   * @param picPath 图片地址
   * @return 提取的图片地址
   */
  public static Optional<String> ffmpegExtractImage(String mp4Path, String picPath) {
    String ffmpeg = Loader.load(org.bytedeco.ffmpeg.ffmpeg.class);
    ProcessBuilder extractBuilder =
        new ProcessBuilder(
            ffmpeg, "-i", mp4Path, "-f", "image2", "-ss", "1","-frames:v", "1", picPath);
    try {
      extractBuilder.inheritIO().start().waitFor();
    } catch (InterruptedException | IOException e) {
      e.printStackTrace();
      return Optional.empty();
    }
    // 返回图片文件路径
    return Optional.of(picPath);
  }
}



验证一下

  public static void main(String[] args) throws Exception {
    //    System.out.println(extract("C:\\Users\\huyi\\Desktop\\test1.mp4",
    // "C:\\Users\\huyi\\Desktop"));
    System.out.println(
        extract("https://xx.xx.xx.xx/test2.mp4", "C:\\Users\\huyi\\Desktop"));
  }

image.png


代码说明

1、ffmpeg的命令里面我加了一个参数 "-frames:v 1",不加虽然报错但是图片还是正常输出。说明一下该参数表示输出的图片只有1张。如不加,报错如下:

image.png

总结

可以按照需求调整入参。

相关文章
|
10月前
|
Oracle Java 关系型数据库
java 入门学习视频_2025 最新 java 入门零基础学习视频教程
《Java 21 入门实操指南(2025年版)》提供了Java最新特性的开发指导。首先介绍了JDK 21和IntelliJ IDEA 2025.1的环境配置,包括环境变量设置和预览功能启用。重点讲解了Java 21三大核心特性:虚拟线程简化高并发编程,Record模式优化数据解构,字符串模板提升字符串拼接可读性。最后通过图书管理系统案例,展示如何运用Record定义实体类、使用Stream API进行数据操作,以及结合字符串模板实现控制台交互。该指南完整呈现了从环境搭建到实际项目开发的Java 21全流程实
645 1
|
人工智能 JSON Java
列表结构与树结构转换分析与工具类封装(java版)
本文介绍了将线性列表转换为树形结构的实现方法及工具类封装。核心思路是先获取所有根节点,将其余节点作为子节点,通过递归构建每个根节点的子节点。关键在于节点需包含 `id`、`parentId` 和 `children` 三个属性。文中提供了两种封装方式:一是基于基类 `BaseTree` 的通用工具类,二是使用函数式接口实现更灵活的方式。推荐使用后者,因其避免了继承限制,更具扩展性。代码示例中使用了 Jackson 库进行 JSON 格式化输出,便于结果展示。最后总结指出,理解原理是进一步优化和封装的基础。
416 0
|
前端开发 JavaScript Java
基于Java+Springboot+Vue开发的反诈视频宣传系统
基于Java+Springboot+Vue开发的反诈视频宣传系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的反诈视频宣传管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。
339 4
基于Java+Springboot+Vue开发的反诈视频宣传系统
|
Java 数据安全/隐私保护
Java ffmpeg 实现视频加文字/图片水印功能
【10月更文挑战第22天】在 Java 中使用 FFmpeg 实现视频加文字或图片水印功能,需先安装 FFmpeg 并添加依赖(如 JavaCV)。通过构建 FFmpeg 命令行参数,使用 `drawtext` 滤镜添加文字水印,或使用 `overlay` 滤镜添加图片水印。示例代码展示了如何使用 JavaCV 实现文字水印。
1604 1
|
缓存 前端开发 Java
【前端学java】java基础巩固复习巩固语法练习-工具类的封装(14)
【8月更文挑战第10天】java基础巩固,工具类的封装
146 1
【前端学java】java基础巩固复习巩固语法练习-工具类的封装(14)
|
算法 搜索推荐 Java
java 后端 使用 Graphics2D 制作海报,画echarts图,带工具类,各种细节:如头像切割成圆形,文字换行算法(完美实验success),解决画上文字、图片后不清晰问题
这篇文章介绍了如何使用Java后端技术,结合Graphics2D和Echarts等工具,生成包含个性化信息和图表的海报,并提供了详细的代码实现和GitHub项目链接。
1100 0
java 后端 使用 Graphics2D 制作海报,画echarts图,带工具类,各种细节:如头像切割成圆形,文字换行算法(完美实验success),解决画上文字、图片后不清晰问题
|
Java
Java 些许公共工具类
Java 些许公共工具类
127 1
Java应用结构规范问题之在UnitConvertUtils工具类将千米转换为米的问题如何解决
Java应用结构规范问题之在UnitConvertUtils工具类将千米转换为米的问题如何解决
303 8
|
设计模式 存储 安全
Java面试题:设计一个线程安全的单例类并解释其内存占用情况?使用Java多线程工具类实现一个高效的线程池,并解释其背后的原理。结合观察者模式与Java并发框架,设计一个可扩展的事件处理系统
Java面试题:设计一个线程安全的单例类并解释其内存占用情况?使用Java多线程工具类实现一个高效的线程池,并解释其背后的原理。结合观察者模式与Java并发框架,设计一个可扩展的事件处理系统
396 1
|
安全 Java 开发者
Java中的并发工具类与线程安全实现
Java中的并发工具类与线程安全实现