JAVA生成视频缩略图的两种方式

最近工作中遇到一个需求:在视频上传的时候截取视频图片。就调研了两种方法,亲测有效~~~

方式一:使用ffmpng工具

一、ffmpng工具的安装

1.官网http://www.ffmpeg.org/download.html下载windows版本

2.下载完成并解压后,设置环境变量

3.dos窗口输入 ffmpeg -version  命令,测试是否成功;

以上就是ffmpng工具的安装过程,下面就一起进入正题吧~

二、视频截图的实现

1.配置文件:新建一个bat文件,文件内容如下图

解释一下个别参数的意思吧

D:/ffmpeg/bin/ffmpeg.exe   工具所在的具体位置

-ss 后面的数值代表截取多上秒后的图片(注意:小于视频的时间长度)

2.java的实现

public class ImageTest {
    @Test
    public void save() throws Exception {
        //视频文件
        String videoRealPath = "E:\test\FFOutput\1.mp4";

        //截图的路径(输出路径)
        String imageRealPath ="E://a.jpg";

        try {

            //调用批处理文件
            Runtime.getRuntime().exec("cmd /c start D://ffmpeg//ffmpeg.bat " + videoRealPath + " " + imageRealPath);

        } catch (IOException e) {

            // TODO Auto-generated catch block
            e.printStackTrace();

        }
    }
}

3.实现的效果

由于该项目要使用docker构建,最终这个方法被舍弃~~,调研了另外一种使用java包的方式实现

方式二:使用javacv包

一、添加maven依赖

<dependency>
    <groupId>org.bytedeco</groupId>
    <artifactId>javacv-platform</artifactId>
    <version>1.3.1</version>
</dependency>

二、java实现

    /**
     * 截取视频第六帧的图片
     * @param filePath 视频路径
     * @param dir 文件存放的根目录
     * @return 图片的相对路径 例:pic/1.png
     * @throws FrameGrabber.Exception
     */
    public static String videoImage(String filePath,String dir) throws FrameGrabber.Exception {
        String pngPath = "";
        FFmpegFrameGrabber ff = FFmpegFrameGrabber.createDefault(filePath);

        ff.start();
        int ffLength = ff.getLengthInFrames();
        Frame f;
        int i = 0;
        while (i < ffLength) {
            f = ff.grabImage();
            //截取第6帧
            if((i>5) &&  (f.image != null)){
                //生成图片的相对路径 例如:pic/uuid.png
                pngPath = getPngPath();
                //执行截图并放入指定位置
                doExecuteFrame(f, dir+pngPath);
                break;
            }
            i++;
        }
        ff.stop();

        return pngPath;
    }

    /**
     * 生成图片的相对路径
     * @return 图片的相对路径 例:pic/1.png
     */
    private static String getPngPath(){
        return  "pic/"+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();
        }
    }
原文地址:https://www.cnblogs.com/yy136/p/9608985.html