Prechádzať zdrojové kódy

新增视频上传时封面截取

s1eepycat 3 rokov pred
rodič
commit
b6b7e294e2

+ 10 - 0
src/main/java/com/zhiqiyun/open/core/models/UploadResult.java

@@ -19,6 +19,8 @@ public class UploadResult implements Serializable {
 
 	private String mimeType;
 
+	private String cover;
+
 	private long size;
 
 	private String originalFileName;
@@ -94,4 +96,12 @@ public class UploadResult implements Serializable {
 	public void setDomain(String domain) {
 		this.domain = domain;
 	}
+
+	public String getCover() {
+		return cover;
+	}
+
+	public void setCover(String cover) {
+		this.cover = cover;
+	}
 }

+ 28 - 8
src/main/java/com/zhiqiyun/open/core/service/impl/UploadFileInfoServiceImpl.java

@@ -8,11 +8,13 @@ import com.zhiqiyun.open.core.service.SequenceService;
 import com.zhiqiyun.open.core.service.UploadFileInfoService;
 import com.zhiqiyun.open.exception.UploadException;
 import com.zhiqiyun.open.utils.DateUtil;
+import com.zhiqiyun.open.utils.ImageUtils2;
 import lombok.extern.slf4j.Slf4j;
 import net.coobird.thumbnailator.Thumbnails;
 import net.sf.jmimemagic.Magic;
 import net.sf.jmimemagic.MagicMatch;
 import org.apache.commons.codec.digest.DigestUtils;
+import org.bytedeco.javacpp.Loader;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
@@ -20,12 +22,10 @@ import org.springframework.stereotype.Service;
 
 import javax.imageio.ImageIO;
 import java.awt.image.BufferedImage;
-import java.io.ByteArrayInputStream;
-import java.io.File;
-import java.io.IOException;
-import java.io.RandomAccessFile;
+import java.io.*;
 import java.util.Arrays;
 import java.util.List;
+import java.util.Optional;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
@@ -58,7 +58,7 @@ public class UploadFileInfoServiceImpl extends ServiceImpl<UploadFileInfoMapper,
                 throw new UploadException("上传文件大小不能超过" + (maxSize / 1024) + "M");
             }
 
-            String pattern = ".[a-zA-Z]{3,4}$";
+            String pattern = ".[a-zA-Z0-9]{3,4}$";
 
             String extension;
             String mimeType=null;
@@ -66,7 +66,9 @@ public class UploadFileInfoServiceImpl extends ServiceImpl<UploadFileInfoMapper,
             Matcher m = r.matcher(originalFilename);
             if (m.find()){
                 extension = m.group(0).substring(1);
-            }else {
+            }else if(originalFilename.equals("mp4")) {
+                extension= originalFilename;
+            }else{
                 MagicMatch magicMatch = Magic.getMagicMatch(fileBuff);
 
                 extension = magicMatch.getExtension();
@@ -86,6 +88,8 @@ public class UploadFileInfoServiceImpl extends ServiceImpl<UploadFileInfoMapper,
             }
 
             String filePath = String.format("%s/%s", savePath, DateUtil.format("yyyy/MM/dd"));
+            String pathDate = filePath;
+            String date = DateUtil.format("yyyy/MM/dd");
             File fileDir = new File(filePath);
             if (!fileDir.exists()) {
                 boolean mkdirResult = fileDir.mkdirs();
@@ -111,8 +115,18 @@ public class UploadFileInfoServiceImpl extends ServiceImpl<UploadFileInfoMapper,
                     log.warn("upload is not image file", e);
                     throw new UploadException("只能上传图片文件");
                 }
-            }else {
-                filePath = String.format("%s/%s.%s", filePath, originalFilename, extension);
+            }else if(extension.equals("mp4")){
+                filePath = String.format("%s/%s.%s", filePath, DigestUtils.md5Hex(fileBuff), extension);
+                File file = new File(filePath);
+                try {
+                    RandomAccessFile file_test = new RandomAccessFile(file,"rw");
+                    file_test.write(fileBuff);
+                } catch (IOException e) {
+                    log.warn("upload is failed", e);
+                    throw new UploadException("文件上传失败");
+                }
+            } else{
+                filePath = String.format("%s/%s", filePath, originalFilename);
                 File file = new File(filePath);
                 try {
                     RandomAccessFile file_test = new RandomAccessFile(file,"rw");
@@ -132,6 +146,12 @@ public class UploadFileInfoServiceImpl extends ServiceImpl<UploadFileInfoMapper,
             result.setSize(fileBuff.length);
             result.setExtension(extension);
             result.setId(this.sequenceService.nextId());
+//
+//            ffmpegExtractImage(url,url+".png");
+            if(extension.equals("mp4")){
+                String cover = ImageUtils2.videoImage(filePath, pathDate);
+                result.setCover(fileHost +"/"+ date+"/"+cover);
+            }
 
             UploadFileInfo fileInfo = new UploadFileInfo();
             BeanUtils.copyProperties(result, fileInfo);

+ 1 - 0
src/main/java/com/zhiqiyun/open/router/apis/UploadApi.java

@@ -34,6 +34,7 @@ public class UploadApi {
 			originalFilename = String.format("%s.%s", DigestUtils.md5Hex(fileBuff), "png");
 		}
 
+		log.info("-----------------originalFilename:"+originalFilename);
 		UploadResult uploadResult = this.uploadFileInfoService.handle(originalFilename, fileBuff);
 
 		if (uploadResult.isSuccess()) {

+ 99 - 0
src/main/java/com/zhiqiyun/open/utils/ImageUtils2.java

@@ -0,0 +1,99 @@
+package com.zhiqiyun.open.utils;
+
+import org.bytedeco.javacv.FFmpegFrameGrabber;
+import org.bytedeco.javacv.Frame;
+import org.bytedeco.javacv.Java2DFrameConverter;
+import org.bytedeco.javacv.OpenCVFrameConverter;
+import org.bytedeco.opencv.opencv_core.IplImage;
+
+import javax.imageio.ImageIO;
+import java.awt.image.BufferedImage;
+import java.io.File;
+import java.io.IOException;
+import java.util.UUID;
+
+public class ImageUtils2 {
+    /**
+     * 截取视频第六帧的图片
+     *
+     * @param filePath 视频路径
+     * @param dir      文件存放的根目录
+     * @return 图片的相对路径 例:pic/1.png
+     */
+    public static String videoImage(String filePath, String dir) throws Exception {
+        String pngPath = "";
+//        FFmpegFrameGrabber ff = FFmpegFrameGrabber.createDefault(filePath);
+        FFmpegFrameGrabber ff = FFmpegFrameGrabber.createDefault(new File(filePath));
+
+        ff.start();
+        int ffLength = ff.getLengthInFrames();
+        Frame f;
+        int i = 0;
+        while (i < ffLength) {
+            f = ff.grabFrame();
+            //截取第6帧
+            if ((f.image != null)) {
+                //生成图片的相对路径 例如:pic/uuid.png
+                pngPath = getPngPath();
+                //执行截图并放入指定位置
+                System.out.println("存储图片 : " + (dir +"/"+ pngPath));
+                doExecuteFrame(f, dir  +"/"+ pngPath);
+                break;
+            }
+            i++;
+        }
+        ff.stop();
+
+        return pngPath;
+    }
+
+    /**
+     * 生成图片的相对路径
+     *
+     * @return 图片的相对路径 例:pic/1.png
+     */
+    private static String getPngPath() {
+        return getUUID() + ".png";
+    }
+
+
+    /**
+     * 生成唯一的uuid
+     *
+     * @return uuid
+     */
+    private static String getUUID() {
+        return UUID.randomUUID().toString().replace("-", "");
+    }
+
+
+    /**
+     * 截取缩略图
+     *
+     * @param f                       Frame
+     * @param targerFilePath:封面图片存放路径
+     */
+    private static void doExecuteFrame(Frame f, String targerFilePath) {
+        String imagemat = "png";
+        if (null == f || null == f.image) {
+            return;
+        }
+        Java2DFrameConverter converter = new Java2DFrameConverter();
+        BufferedImage bi = converter.getBufferedImage(f);
+        File output = new File(targerFilePath);
+        try {
+            ImageIO.write(bi, imagemat, output);
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+
+    public static void main(String[] args) {
+        try {
+            ImageUtils2.videoImage("E:\\迅雷下载\\594c73869e9349b68ecd333c28934e8c.mp4", "E:\\video\\");
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+    }
+}