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

总结

可以按照需求调整入参。

相关文章
|
1月前
Mybatis+mysql动态分页查询数据案例——分页工具类(Page.java)
Mybatis+mysql动态分页查询数据案例——分页工具类(Page.java)
22 1
|
3月前
|
NoSQL Java 关系型数据库
基于Java swing和mysql实现的学生选课管理系统(源码+数据库+运行指导视频)
基于Java swing和mysql实现的学生选课管理系统(源码+数据库+运行指导视频)
|
3月前
|
NoSQL Java 关系型数据库
基于java swing和mysql实现的汽车租赁管理系统(源码+数据库+文档+运行指导视频)
基于java swing和mysql实现的汽车租赁管理系统(源码+数据库+文档+运行指导视频)
|
3月前
|
NoSQL Java 关系型数据库
基于Java swing和mysql实现酒店管理系统(源码+数据库+运行指导视频+系统用户使用手册+系统PPT+数据库设计说明书+系统概要说明书+需求说明书+详细说明书)
基于Java swing和mysql实现酒店管理系统(源码+数据库+运行指导视频+系统用户使用手册+系统PPT+数据库设计说明书+系统概要说明书+需求说明书+详细说明书)
|
1月前
|
人工智能 监控 算法
java智慧城管源码 AI视频智能分析 可直接上项目
Java智慧城管源码实现AI视频智能分析,适用于直接部署项目。系统运用互联网、大数据、云计算和AI提升城市管理水平,采用“一级监督、二级指挥、四级联动”模式。功能涵盖AI智能检测(如占道广告、垃圾处理等)、执法办案、视频分析、统计分析及队伍管理等多个模块,利用深度学习优化城市管理自动化和智能化,提供决策支持。
223 4
java智慧城管源码 AI视频智能分析 可直接上项目
|
1月前
Mybatis+mysql动态分页查询数据案例——工具类(MybatisUtil.java)
Mybatis+mysql动态分页查询数据案例——工具类(MybatisUtil.java)
15 1
|
7天前
|
安全 Java
深入理解 Java 多线程和并发工具类
【4月更文挑战第19天】本文探讨了Java多线程和并发工具类在实现高性能应用程序中的关键作用。通过继承`Thread`或实现`Runnable`创建线程,利用`Executors`管理线程池,以及使用`Semaphore`、`CountDownLatch`和`CyclicBarrier`进行线程同步。保证线程安全、实现线程协作和性能调优(如设置线程池大小、避免不必要同步)是重要环节。理解并恰当运用这些工具能提升程序效率和可靠性。
|
27天前
|
JSON Java 网络安全
Java使用hutool工具类发送网络请求
Java使用hutool工具类发送网络请求
42 0
|
1月前
|
数据采集 JavaScript 前端开发
使用HtmlUnit库的Java下载器:下载TikTok视频
使用Java和HtmlUnit构建TikTok视频下载器,模拟浏览器行为,绕过访问限制。通过爬虫代理配置代理服务器,隐藏真实IP,多线程技术提升下载效率。示例代码展示如何设置HtmlUnit,创建代理,启用JavaScript,下载并处理视频链接。学习了页面模拟、JavaScript交互、代理使用及多线程技术,为实际爬虫项目提供参考。
使用HtmlUnit库的Java下载器:下载TikTok视频
|
2月前
|
Java Linux 数据安全/隐私保护
Java【代码 16】将word、excel文件转换为pdf格式和将pdf文档转换为image格式工具类分享(Gitee源码)aspose转换中文乱码问题处理
【2月更文挑战第3天】Java 将word、excel文件转换为pdf格式和将pdf文档转换为image格式工具类分享(Gitee源码)aspose转换中文乱码问题处理
105 0