zhubaomin
2025-04-17 b63eef2cfb054b1ead234ab93e05a2aa28775d91
pipIrr-platform/pipIrr-web/pipIrr-web-file/src/main/java/com/dy/pipIrrWebFile/util/VideoUtils.java
New file
@@ -0,0 +1,172 @@
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();
        }
    }
}