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