java截取视频最后一帧照片作为封面

引言

我们在日常工作中经常会遇到上传视频,而产品还会要求截取视频某一帧作为封面展示,对于这种情况新手还是比较头疼的,那我们直接世界上最简单的实现方案。

How to do

1.提前引入包

java 复制代码
        <!--视频多媒体工具包 包含 FFmpeg、OpenCV-->
        <dependency>
            <groupId>org.bytedeco</groupId>
            <artifactId>javacv-platform</artifactId>
            <version>1.5.3</version>
        </dependency>
        <!--hutool万能工具包-->
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.4.4</version>
        </dependency>

2.逻辑代码实现

java 复制代码
    public static void main(String[] args) throws IOException, InterruptedException {
        Image image = cutScreenshot("");
        String jpg = ImgUtil.toBase64(image, "jpg");
        System.out.println(jpg);
    }



  
     /**
     * 截屏视频最后一帧(有效图片)
     *
     * @param localPath 本地视频地址
     * @return
     */
    public static Image cutScreenshot(String localPath) throws FrameGrabber.Exception {
        FFmpegFrameGrabber grabber = FFmpegFrameGrabber.createDefault(localPath);

        grabber.start();
//            设置帧数
        grabber.setFrameNumber(grabber.getLengthInFrames() - 1);
//            获取当前有效图片(如果没有图片返回的是null,后期在做优化)
        Frame frame = grabber.grabImage();
        //视频旋转度
        String rotate = grabber.getVideoMetadata("rotate");
        Java2DFrameConverter converter = new Java2DFrameConverter();
        //绘制图片
        BufferedImage bufferedImage = converter.getBufferedImage(frame);
        if (rotate != null) {
            // 旋转图片
            bufferedImage = rotate(bufferedImage, Integer.parseInt(rotate));
        }
        log.info("视频的宽:{}", bufferedImage.getWidth());
        log.info("视频的高:{}", bufferedImage.getHeight());
        log.info("视频的旋转度:{}", rotate);
        log.info("视频的格式:{}", grabber.getFormat());
        log.info("此视频时长(s/秒):{}", grabber.getLengthInTime() / (1000 * 1000));
        return bufferedImage;
    }
相关推荐
摇滚侠1 小时前
npm 设置了阿里云镜像,然后全局安装了 pnpm,pnpm 还需要设置阿里云镜像吗
前端·阿里云·npm
程序员清洒8 小时前
Flutter for OpenHarmony:GridView — 网格布局实现
android·前端·学习·flutter·华为
VX:Fegn08958 小时前
计算机毕业设计|基于ssm + vue超市管理系统(源码+数据库+文档)
前端·数据库·vue.js·spring boot·后端·课程设计
0思必得08 小时前
[Web自动化] 反爬虫
前端·爬虫·python·selenium·自动化
LawrenceLan8 小时前
Flutter 零基础入门(二十六):StatefulWidget 与状态更新 setState
开发语言·前端·flutter·dart
秋秋小事8 小时前
TypeScript 模版字面量与类型操作
前端·typescript
2401_892000529 小时前
Flutter for OpenHarmony 猫咪管家App实战 - 添加提醒实现
前端·javascript·flutter
Yolanda949 小时前
【项目经验】vue h5移动端禁止缩放
前端·javascript·vue.js
广州华水科技10 小时前
单北斗GNSS形变监测一体机在基础设施安全中的应用与技术优势
前端
EndingCoder10 小时前
案例研究:从 JavaScript 迁移到 TypeScript
开发语言·前端·javascript·性能优化·typescript