Java获取视频封面图,利用FFmpegFrameGrabber获取视频封面图

依赖

xml 复制代码
        <dependency>
            <groupId>org.bytedeco</groupId>
            <artifactId>javacv-platform</artifactId>
            <version>1.5.9</version>
        </dependency>

传入视频流获取图片byte

java 复制代码
    /**
     * 获取视频截图
     *
     * @param frameNumber 视频的指定帧数
     * @param vName       视频名称
     * @param videoBytes  视频字节
     * @return 图片byte数组
     */
    private byte[] getCoverImageBytes(Integer frameNumber, String vName, byte[] videoBytes) {
        Double videoSize = DoubleUtil.getDouble2(videoBytes.length / 1024.0 / 1024.0);
        long timeMillis = System.currentTimeMillis();
        logger.info("截取视频截图开始 视频名称:{} 视频大小:{}MB", vName, videoSize);
        try (ByteArrayInputStream is = new ByteArrayInputStream(videoBytes);
             FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(is);
             ByteArrayOutputStream os = new ByteArrayOutputStream();
             Java2DFrameConverter converter = new Java2DFrameConverter()) {
            grabber.start();
            //视频的最大帧数,减少10帧是因为最后几帧会出现获取不到图片的情况
            int ftp = grabber.getLengthInFrames() - 10;
            frameNumber = ftp < frameNumber ? ftp : frameNumber;
            //设置视频指定帧数
            grabber.setFrameNumber(frameNumber);
            //设置视频截取帧(默认取第一帧)
            Frame frame = grabber.grabImage();
            //绘制图片
            BufferedImage bi = converter.getBufferedImage(frame);
            ImageIO.write(bi, "jpg", os);
            grabber.stop();
            logger.info("截取视频截图结束,处理时间: {}秒", (System.currentTimeMillis() - timeMillis) / 1000);
            return os.toByteArray();
        } catch (FrameGrabber.Exception e) {
            logger.error("FrameGrabber.Exception :{}", e.getMessage());
        } catch (IOException e) {
            logger.error("IOException :{}", e.getMessage());
        }
        logger.info("获取视频封面图失败 vName:{}", vName);
        return null;
    }

传入视频流获取图片文件

java 复制代码
/**
     * 传入视频文件,生成对应的封面图文件
     *
     * @param frameNumber 帧数
     * @param file        视频文件
     */
    private void coverImage(Integer frameNumber, File file) {
        String vName = file.getName();
        Double videoSize = DoubleUtil.getDouble2(file.length() / 1024.0 / 1024.0);
        long timeMillis = System.currentTimeMillis();
        logger.info("截取视频截图开始 视频名称:{} 视频大小:{}MB", vName, videoSize);
        try (FileInputStream is = new FileInputStream(file);
             FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(is);
             Java2DFrameConverter converter = new Java2DFrameConverter()) {
            grabber.start();
            //视频的最大帧数,减少10帧是因为最后几帧会出现获取不到图片的情况
            int ftp = grabber.getLengthInFrames() - 10;
            frameNumber = ftp < frameNumber ? ftp : frameNumber;
            //设置视频指定帧数
            grabber.setFrameNumber(frameNumber);
            // 图片名称
            String targetFileName = vName.substring(0, vName.lastIndexOf(".")) + "_vc.jpg";
            logger.info("图片名称:{}", targetFileName);
            File imageFile = new File("D:\\my_work\\" + targetFileName);
            //设置视频截取帧(默认取第一帧)
            Frame frame = grabber.grabImage();
            //绘制图片
            BufferedImage bi = converter.getBufferedImage(frame);
            ImageIO.write(bi, "jpg", imageFile);
            grabber.stop();
            logger.info("截取视频截图结束,处理时间: {}秒", (System.currentTimeMillis() - timeMillis) / 1000);
        } catch (FrameGrabber.Exception e) {
            logger.error("FrameGrabber.Exception :{}", e.getMessage());
        } catch (IOException e) {
            logger.error("IOException :{}", e.getMessage());
        }
相关推荐
dylan_QAQ1 分钟前
Java转Go全过程06-工程管理
java·后端·go
a5876941 分钟前
消息队列(MQ)初级入门:详解RabbitMQ与Kafka
java·分布式·microsoft·面试·kafka·rabbitmq
千里码aicood1 小时前
【springboot+vue】党员党建活动管理平台(源码+文档+调试+基础修改+答疑)
java·数据库·spring boot
Chan161 小时前
【智能协同云图库】基于统一接口架构构建多维度分析功能、结合 ECharts 可视化与权限校验实现用户 / 管理员图库统计、通过 SQL 优化与流式处理提升数据
java·spring boot·后端·sql·spring·intellij-idea·echarts
先做个垃圾出来………1 小时前
差分数组(Difference Array)
java·数据结构·算法
BillKu1 小时前
Java核心概念详解:JVM、JRE、JDK、Java SE、Java EE (Jakarta EE)
java·jvm·jdk·java ee·jre·java se·jakarta ee
刘婉晴2 小时前
【Java】NIO 简单介绍
java·nio
渣哥2 小时前
聊聊我和 ArrayList、LinkedList、Vector 的“一地鸡毛”
java
浮游本尊2 小时前
Java学习第20天 - 性能优化与监控
java
纪莫3 小时前
技术面:Java并发(线程同步、死锁、多线程编排)
java·java面试⑧股