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