package com.dy.pipIrrWebFile.util;
|
|
import lombok.extern.slf4j.Slf4j;
|
import org.apache.commons.io.FileUtils;
|
import org.jcodec.api.FrameGrab;
|
import org.jcodec.common.model.Picture;
|
import org.jcodec.scale.AWTUtil;
|
import org.springframework.web.multipart.MultipartFile;
|
|
import javax.imageio.ImageIO;
|
import java.awt.image.BufferedImage;
|
import java.io.*;
|
|
/**
|
* @Author: liurunyu
|
* @Date: 2025/1/13 11:22
|
* @Description
|
*/
|
|
/**
|
* 视频操作工具类
|
*/
|
@Slf4j
|
public class VideoUtils {
|
|
/*** 图片格式*/
|
private static final String FILE_EXT = "jpg";
|
|
/*** 帧数*/
|
private static final int THUMB_FRAME = 5;
|
|
/*** 图片格式*/
|
private String fileExt ;
|
|
/*** 帧数*/
|
private Integer thumbFrame ;
|
|
public VideoUtils(){
|
this.fileExt = FILE_EXT;
|
this.thumbFrame = THUMB_FRAME;
|
}
|
|
|
public VideoUtils(String fileExt, int thumbFrame){
|
this.fileExt = fileExt;
|
this.thumbFrame = thumbFrame;
|
if(this.fileExt == null || this.fileExt.trim().equals("")){
|
this.fileExt = FILE_EXT;
|
}
|
if(this.thumbFrame == null || this.thumbFrame.intValue() <= 0){
|
this.thumbFrame = THUMB_FRAME;
|
}
|
}
|
|
/**
|
* 获取指定视频的帧并保存为图片至指定目录
|
* @param videoFilePath 源视频文件路径
|
* @param frameFilePath 截取帧的图片存放路径
|
*/
|
public void fetchFrame(String videoFilePath, String frameFilePath) throws Exception {
|
File videoFile = new File(videoFilePath);
|
File frameFile = new File(frameFilePath);
|
getThumbnail(videoFile, frameFile);
|
}
|
|
|
/**
|
* 获取指定视频的帧并保存为图片至指定目录
|
* @param videoFilePath 源视频文件路径
|
*/
|
public BufferedImage fetchFrame(String videoFilePath) throws Exception {
|
File videoFile = new File(videoFilePath);
|
return getThumbnail(videoFile);
|
}
|
|
/**
|
* 获取指定视频的帧并保存为图片至指定目录
|
*
|
* @param videoFile 源视频文件
|
* @param targetFile 截取帧的图片
|
*/
|
public void fetchFrame(MultipartFile videoFile, File targetFile) throws Exception {
|
File file = new File(videoFile.getName());
|
FileUtils.copyInputStreamToFile(videoFile.getInputStream(), file);
|
getThumbnail(file, targetFile);
|
}
|
|
/**
|
* 获取指定视频的帧并保存为图片至指定目录
|
*
|
* @param videoFile 源视频文件
|
*/
|
public BufferedImage fetchFrame(MultipartFile videoFile) throws Exception {
|
File file = new File(videoFile.getName());
|
FileUtils.copyInputStreamToFile(videoFile.getInputStream(), file);
|
return getThumbnail(file);
|
}
|
|
/**
|
* 获取指定视频的帧并保存为图片至指定目录
|
*
|
* @param videoFile 源视频文件
|
|
public File fetchFrame2(MultipartFile videoFile) {
|
String originalFilename = videoFile.getOriginalFilename();
|
File file = new File(originalFilename);
|
File targetFile = null;
|
try {
|
FileUtils.copyInputStreamToFile(videoFile.getInputStream(), file);
|
|
int i = originalFilename.lastIndexOf(".");
|
String imageName;
|
|
if (i > 0) {
|
imageName = originalFilename.substring(0, i);
|
} else {
|
imageName = UUID.randomUUID().toString().replace("-", "");
|
}
|
imageName = imageName + ".jpg";
|
targetFile = new File(imageName);
|
getThumbnail(file, targetFile);
|
} catch (Exception e) {
|
log.error("获取视频指定帧异常:", e);
|
} finally {
|
if (file.exists()) {
|
file.delete();
|
}
|
}
|
log.debug("视频文件 - 帧截取 - 处理结束");
|
return targetFile;
|
}
|
*/
|
|
/**
|
* 获取第一帧缩略图
|
*
|
* @param videoFile 视频路径
|
* @param targetFile 缩略图目标路径
|
*/
|
public void getThumbnail(File videoFile, File targetFile) throws Exception {
|
// 根据扩展名创建一个新文件路径
|
Picture picture = FrameGrab.getFrameFromFile(videoFile, thumbFrame);
|
BufferedImage bufferedImage = AWTUtil.toBufferedImage(picture);
|
ImageIO.write(bufferedImage, fileExt, targetFile);
|
}
|
|
|
/**
|
* 获取第一帧缩略图
|
*
|
* @param videoFile 视频路径
|
*/
|
public BufferedImage getThumbnail(File videoFile) throws Exception {
|
// 根据扩展名创建一个新文件路径
|
Picture picture = FrameGrab.getFrameFromFile(videoFile, thumbFrame);
|
BufferedImage bufferedImage = AWTUtil.toBufferedImage(picture);
|
return bufferedImage;
|
}
|
|
|
public static void main(String[] args) {
|
VideoUtils util = new VideoUtils();
|
try {
|
long startTime = System.currentTimeMillis();
|
util.getThumbnail(new File("D:\\mp4\\test.mp4"), new File("D:\\mp4\\test.jpg"));
|
System.out.println("截取图片耗时:" + (System.currentTimeMillis() - startTime));
|
} catch (Exception e) {
|
e.printStackTrace();
|
}
|
}
|
|
}
|