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());
        }
相关推荐
烤麻辣烫几秒前
23种设计模式(新手)-3接口隔离原则
java·开发语言·学习·设计模式·intellij-idea
程序猿_极客9 分钟前
【2025最新】 Java 入门到实战:数组 + 抽象类 + 接口 + 异常(含案例 + 语法全解析+巩固练习题)
java·开发语言·后端·java基础·java入门到实战
v***431726 分钟前
spring.profiles.active和spring.profiles.include的使用及区别说明
java·后端·spring
艾莉丝努力练剑1 小时前
【C++:哈希表封装】用哈希表封装unordered_map和unordered_set
java·c++·stl·哈希算法·散列表·平衡二叉树·哈希
Moe4881 小时前
@SpringBootApplication 注解(Spring Boot 自动配置)详解
java·后端
后端小张1 小时前
【JAVA 进阶】SpringBoot 事务深度解析:从理论到实践的完整指南
java·开发语言·spring boot·后端·spring·spring cloud·事务
合作小小程序员小小店1 小时前
web网页开发,在线%宠物销售%系统,基于Idea,html,css,jQuery,java,ssh,mysql。
java·前端·数据库·mysql·jdk·intellij-idea·宠物
合作小小程序员小小店1 小时前
web网页开发,在线%档案管理%系统,基于Idea,html,css,jQuery,java,ssh,mysql。
java·前端·mysql·jdk·html·ssh·intellij-idea
故渊ZY1 小时前
深入解析JVM:核心架构与调优实战
java·jvm·架构
ChinaRainbowSea1 小时前
13. Spring AI 的观测性
java·人工智能·后端·spring·flask·ai编程