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