java 代码上传视频截取某一帧缩略图

原文链接

我们不是专业做图片链接处理的,只需要一个截取功能,没必要搞得那么花哨,用这个可以满足

package com.leshu.framework.util;

import org.bytedeco.javacpp.opencv_core;
import org.bytedeco.javacv.FFmpegFrameGrabber;
import org.bytedeco.javacv.Frame;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;

public class CreateImage {
    /**
     * 获取指定视频的帧并保存为图片至指定目录
     * [url=home.php?mod=space&uid=952169]@Param[/url] videofile  源视频文件路径
     *
     * @param framefile 截取帧的图片存放路径
     * @throws Exception
     */
    public static void fetchFrame(String videofile, String framefile)
            throws Exception {
        long start = System.currentTimeMillis();
        File targetFile = new File(framefile);
        FFmpegFrameGrabber ff = new FFmpegFrameGrabber(videofile);
        ff.start();
        int lenght = ff.getLengthInFrames();
        //获取视频时常
        int middleFrame = lenght / 2;
        int i = 0;
        Frame f = null;
        while (i < lenght) {
            // 获取中间帧数得图片,避免出现全黑的图片,依自己情况而定
            f = ff.grabFrame();
            if ((i > middleFrame) && (f.image != null)) {
                break;
            }
            i++;
        }
        opencv_core.IplImage img = f.image;
        int owidth = img.width();
        int oheight = img.height();
        // 对截取的帧进行等比例缩放
        int width = 800;
        int height = (int) (((double) width / owidth) * oheight);
        BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR);
        bi.getGraphics().drawImage(f.image.getBufferedImage().getScaledInstance(width, height, Image.SCALE_SMOOTH),
                0, 0, null);
        ImageIO.write(bi, "jpg", targetFile);
        //ff.flush();
        ff.stop();
        System.out.println(System.currentTimeMillis() - start);
    }


    public static void main(String[] args) {
        try {
            CreateImage.fetchFrame("C:\\Users\\leshu\\Downloads\\1627019737729.mp4", "C:\\Users\\leshu\\Downloads\\test.jpg");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

      <!--缩略图依赖-->
        <dependency>
            <groupId>org.bytedeco</groupId>
            <artifactId>javacv</artifactId>
            <version>0.8</version>
        </dependency>

另外网上找到得一个也很有意思 ,感觉出处都是一样的。
2021/7/28 最后我用了这个
上面的那个在linux下疯狂报错,应该是依赖没有的问题,到最后也没排查出来,直接换这个一步到位,浪费时间

posted @ 2021-07-27 14:04  ThomasChang0109  阅读(604)  评论(0)    收藏  举报