java生成视频缩略图

现有一需求,生成视频缩略图,最终实现方式如下

一、引入maven依赖

	<dependency>
	    <groupId>org.bytedeco</groupId>
	    <artifactId>javacv</artifactId>
	    <version>1.4.1</version>
	</dependency>
	<dependency>
	    <groupId>org.bytedeco.javacpp-presets</groupId>
	    <artifactId>ffmpeg-platform</artifactId>
	    <version>4.0.2-1.4.3</version>
	</dependency>

二、调用方法

	/**
     * @param videofile 视频路径,精确到文件
     * @param framefile 保存的目标路径,精确到文件
     * @return
     * @throws Exception
     */
    public static boolean getFrameFile(String videofile, String framefile) {
        try {
            File targetFile = new File(framefile);
            FFmpegFrameGrabber ff = new FFmpegFrameGrabber(videofile);
            try {
                ff.start();
                int lenght = ff.getLengthInFrames();
                int i = 0;
                Frame f = null;
                while (i < lenght) {
                    // 过滤前5帧
                    f = ff.grabFrame();
                    if ((i > 48) && (f.image != null)) {
                        break;
                    }
                    i++;
                }
                int owidth = f.imageWidth;
                int oheight = f.imageHeight;
                // 对截取的帧进行等比例缩放
                int width = 300;
                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);
                ImageIO.write(bi, "jpg", targetFile);
                return true;
            } catch (Exception e) {
                e.printStackTrace();
                System.out.println("ImgBase64Util fetchFrame() error.");
            } finally {
                ff.stop();
                ff.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }

三、问题解决

在实际操作中,可能出现如下Could not initialize class org.bytedeco.javacpp.avutil错误
则是maven依赖未引用完全导致的,将第一步的maven依赖全部引入即可
java生成视频缩略图_第1张图片

你可能感兴趣的:(java,java)