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

2023-01-09 20:16:49

目录

前言

环境依赖

代码

总结


前言

本文提供提取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"));
  }

代码说明 

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

总结

可以按照需求调整入参。

分享

        书上说,天下没有不散之宴席。不要怕,书上还说了,人生何处不相逢。——《雪中悍刀行》

  • 作者:剑客阿良_ALiang
  • 原文链接:https://huyi-aliang.blog.csdn.net/article/details/121266451
    更新时间:2023-01-09 20:16:49