目录
前言
本文提供提取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张。如不加,报错如下:
总结
可以按照需求调整入参。
分享
书上说,天下没有不散之宴席。不要怕,书上还说了,人生何处不相逢。——《雪中悍刀行》