FrameGrabberKit.java 2.75 KB
Newer Older
1 2 3 4 5 6 7 8
package cn.wisenergy.common.utils;


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

9
import org.bytedeco.javacpp.opencv_core;
10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
import org.bytedeco.javacv.FFmpegFrameGrabber;
import org.bytedeco.javacv.Frame;
import org.bytedeco.javacv.Java2DFrameConverter;


/**
 * 截取视频图片
 *
 * @ClassName: FrameGrabberKit
 */
public class FrameGrabberKit {

    /**
     * 获取视频图片
     *
     * @param videofile 源视频文件路径
     * @param framefile 截取帧的图片存放路径
     * @param imgfile   视频封面图保存路径
     * @return
     */
    public static String getVedioImg(String videofile, String framefile, String imgfile) {
        String ImgUrl = "";
        //截取封面图
        try {
            fetchFrame(videofile, framefile);
        } catch (Exception e) {
            e.printStackTrace();
        }
        // 完整的ImgUrl
        ImgUrl = imgfile;//视频封面图保存路径
        return ImgUrl;
    }

    /**
     * 获取指定视频的帧并保存为图片至指定目录
     *
     * @param videofile 源视频文件路径
47
     * @param framefile 截取帧的图片存放路径 例:F:\hfkjrecorder\target\4.jpg
48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85
     * @throws Exception
     */
    public static void fetchFrame(String videofile, String framefile) throws Exception {
        FFmpegFrameGrabber ff = new FFmpegFrameGrabber(videofile);
        ff.start();
        int lenght = ff.getLengthInFrames();
        int i = 0;
        int interceptionFrames = 30;//截取第几帧
        //默认截取第50帧,如果第50帧大于视频总帧数的8成直接取长度lenght * 0.3
        if (interceptionFrames >= lenght * 0.8) {
            interceptionFrames = (int) (lenght * 0.3);
        }
        Frame f = null;
        while (i < lenght) {
            // 过滤 前  interceptionFrames 帧,避免出现全黑的图片,依自己情况而定
            f = ff.grabFrame();
            if ((i > interceptionFrames) && (f.image != null)) {
                break;
            }
            i++;
        }

        int owidth = f.imageWidth;
        int oheight = f.imageHeight;
        // 对截取的帧进行等比例缩放
        int width = 800;
        int height = (int) (((double) width / owidth) * oheight);
        Java2DFrameConverter converter = new Java2DFrameConverter();
        BufferedImage fecthedImage = converter.getBufferedImage(f);
        BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR);
        bi.getGraphics().drawImage(fecthedImage.getScaledInstance(width, height, Image.SCALE_SMOOTH),
                0, 0, null);
        File targetFile = new File(framefile);
        ImageIO.write(bi, "jpg", targetFile);
        //ff.flush();
        ff.stop();
    }
}