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(); } } }