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());
        }
相关推荐
激流丶1 分钟前
【Kafka 实战】如何解决Kafka Topic数量过多带来的性能问题?
java·大数据·kafka·topic
Themberfue5 分钟前
Java多线程详解⑤(全程干货!!!)线程安全问题 || 锁 || synchronized
java·开发语言·线程·多线程·synchronized·
让学习成为一种生活方式22 分钟前
R包下载太慢安装中止的解决策略-R语言003
java·数据库·r语言
晨曦_子画27 分钟前
编程语言之战:AI 之后的 Kotlin 与 Java
android·java·开发语言·人工智能·kotlin
南宫生1 小时前
贪心算法习题其三【力扣】【算法学习day.20】
java·数据结构·学习·算法·leetcode·贪心算法
Heavydrink1 小时前
HTTP动词与状态码
java
ktkiko111 小时前
Java中的远程方法调用——RPC详解
java·开发语言·rpc
计算机-秋大田1 小时前
基于Spring Boot的船舶监造系统的设计与实现,LW+源码+讲解
java·论文阅读·spring boot·后端·vue
神里大人1 小时前
idea、pycharm等软件的文件名红色怎么变绿色
java·pycharm·intellij-idea
冷凝女子1 小时前
【QT】海康视频及openCv抓拍正脸接口
qt·opencv·音视频·海康