当前位置: 首页 > article >正文

视频生成缩略图


文章目录

    • 视频生成缩略图
      • 使用ffmpeg


视频生成缩略图

最近有个需求,视频上传之后在列表和详情页需要展示缩略图

使用ffmpeg

首先引入jar包

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

代码如下

public String getThumbnails(String videoFilePath){
        String path = "/Users/zhanghe/Desktop/pic/";
        String fileName =  videoFilePath.substring(videoFilePath.lastIndexOf("/") + 1, videoFilePath.lastIndexOf("."))+"_thumb.jpg";

        String filePath = StringUtils.join(path, fileName);
        File targetFile = new File(filePath);
        try {
            FFmpegFrameGrabber ff = new FFmpegFrameGrabber(videoFilePath);
            ff.start();
            // 视频总帧数
            int videoLength = ff.getLengthInFrames();

            org.bytedeco.javacv.Frame f  = null;
            int i = 0;
            while (i < videoLength) {
                // 过滤前20帧,因为前20帧可能是全黑的
                // 这里看需求,也可以直接根据帧数取图片
                f = ff.grabFrame();
                if (i > 20 && f.image != null) {
                    break;
                }
                i++;
            }
            int owidth = f.imageWidth;
            int oheight = f.imageHeight;
            // 对截取的帧进行等比例缩放
            int width = 800;
            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);
            ff.stop();

            System.out.println(targetFile.getPath());
          return targetFile.getPath();
            
        } catch (IOException e) {
            e.printStackTrace();
        }
        return "";
    }

参考文献

  • 视频生成缩略图

http://www.kler.cn/a/443161.html

相关文章:

  • Qt重写webrtc的demo peerconnection
  • Nacos server 2.4.0 版本已知问题和 Bug 汇总
  • fast-crud select下拉框 实现多选功能及下拉框数据动态获取(通过接口获取)
  • 【Docker】docker compose 安装 Redis Stack
  • MySQL 如何赶上 PostgreSQL 的势头?
  • 2024年华为OD机试真题-判断一组不等式是否满足约束并输出最大差-Python-OD统一考试(E卷)
  • 什么是大型语言模型
  • 王佩丰24节Excel学习笔记——第十二讲:match + index
  • 从零开始:PHP基础教程系列-第10篇:错误处理与调试技巧
  • 20241218_segmentation
  • MySQL-9.1.0 GTID模式
  • ROS2_进阶笔记
  • 3.9、mixins配置(混入)
  • Netcat:网络中的瑞士军刀
  • Mapbox-GL 的源码解读的一般步骤
  • 网络与安全
  • Unity 模板测试透视效果(URP)
  • 设计模式期末复习
  • Android lib 循环依赖会造成什么问题
  • JS中的闭包详解
  • 搭建分布式ZooKeeper集群
  • 音频开发中常见的知识体系
  • clickhouse-数据库引擎
  • Web APIs - 第5章笔记
  • 海量数据-Vastbase G100数据库安装
  • PHP源码加密之php-beast