前言
本文提供提取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张。如不加,报错如下:
总结
可以按照需求调整入参。