个人博客 地址:https://www.wenhaofan.com/article/20190407105818

引入依赖

  1. <dependency>
  2. <groupId>org.bytedeco</groupId>
  3. <artifactId>javacv</artifactId>
  4. <version>1.4.3</version>
  5. </dependency>
  6.  
  7. <dependency>
  8. <groupId>org.bytedeco.javacpp-presets</groupId>
  9. <artifactId>ffmpeg-platform</artifactId>
  10. <version>4.0.2-1.4.3</version>
  11. </dependency>

代码案例

  1. package live.autu.ctcms.common.kit;
  2.  
  3. import java.awt.image.BufferedImage;
  4. import java.io.File;
  5. import java.io.IOException;
  6. import java.util.ArrayList;
  7. import java.util.Collections;
  8. import java.util.List;
  9.  
  10. import javax.imageio.ImageIO;
  11.  
  12. import org.bytedeco.javacpp.opencv_core;
  13. import org.bytedeco.javacpp.opencv_core.IplImage;
  14. import org.bytedeco.javacv.FFmpegFrameGrabber;
  15. import org.bytedeco.javacv.Frame;
  16. import org.bytedeco.javacv.Java2DFrameConverter;
  17. import org.bytedeco.javacv.OpenCVFrameConverter;
  18.  
  19. import com.jfinal.kit.PathKit;
  20. import com.jfinal.kit.Ret;
  21.  
  22. public class VideoFrameUtil {
  23.  
  24. private static String rootPath = PathKit.getWebRootPath() + "/video/img";// 服务器路径
  25.  
  26. private static final String IMAGEMAT = "png"; // 图片格式
  27. private static final String ROTATE = "rotate";
  28. public static final int MOD = 1;// 第一帧
  29.  
  30. public static Ret getVideoFirstFrame(String videoPath, String imageName) {
  31. return getVideoFrame(videoPath, imageName, MOD);
  32. }
  33.  
  34. /**
  35. * 获取视频缩略图
  36. *
  37. * @param lpath
  38. * @param filePath:视频路径
  39. * @param mod:视频长度/mod获取第几帧
  40. * @throws Exception
  41. */
  42. public static Ret getVideoFrame(String filePath, String targetImageName, int mod) {
  43.  
  44. // 根据视频路径生成缩略图存放路径
  45. String targetFilePath = null;
  46.  
  47. try (FFmpegFrameGrabber ff = FFmpegFrameGrabber.createDefault(filePath);) {
  48.  
  49. ff.start();
  50.  
  51. String rotate = ff.getVideoMetadata(ROTATE);
  52. int ffLength = ff.getLengthInFrames();
  53. Frame f = null;
  54. int i = 0;
  55. int index = mod;
  56.  
  57. if (i >= ffLength) {
  58. return Ret.fail();
  59. }
  60.  
  61. for (int j = 0; j <= index; j++) {
  62. f = ff.grabImage();
  63. }
  64.  
  65. if (null != rotate && rotate.length() > 1) {
  66. OpenCVFrameConverter.ToIplImage converter = new OpenCVFrameConverter.ToIplImage();
  67. IplImage src = converter.convert(f);
  68. f = converter.convert(rotate(src, Integer.valueOf(rotate))); // 旋转图片
  69. }
  70.  
  71. targetFilePath = doExecuteFrame(f, targetImageName);
  72. ff.stop();
  73. } catch (IOException e) {
  74. // TODO Auto-generated catch block
  75. e.printStackTrace();
  76. }
  77.  
  78. return Ret.ok("targetFilePath",targetFilePath)
  79. .set("relativeFilePath", "/video/img/"+targetImageName); // 返回的是视频第一帧
  80. }
  81.  
  82. /**
  83. * 旋转图片
  84. *
  85. * @param src
  86. * @param angle
  87. * @return
  88. */
  89. public static IplImage rotate(IplImage src, int angle) {
  90. IplImage img = IplImage.create(src.height(), src.width(), src.depth(), src.nChannels());
  91. opencv_core.cvTranspose(src, img);
  92. opencv_core.cvFlip(img, img, angle);
  93. return img;
  94. }
  95.  
  96. /**
  97. * 根据视频路径生成缩略图存放路径
  98. *
  99. * @param filePath:视频路径
  100. * @param index:第几帧
  101. * @return:缩略图的存放路径
  102. */
  103. private static String getImagePath(String fileName) {
  104. return rootPath+"/" + fileName;
  105. }
  106.  
  107. /**
  108. * 截取缩略图
  109. *
  110. * @param f
  111. * @param targerFilePath:封面图片
  112. * @throws IOException
  113. */
  114. public static String doExecuteFrame(Frame f, String lpath) throws IOException {
  115.  
  116. if(!new File(rootPath).exists()) {
  117. new File(rootPath).mkdirs();
  118. }
  119.  
  120. String targerFilePath = getImagePath(lpath);
  121. if (null == f || null == f.image) {
  122. return null;
  123. }
  124. Java2DFrameConverter converter = new Java2DFrameConverter();
  125. BufferedImage bi = converter.getBufferedImage(f);
  126. File output = new File(targerFilePath);
  127.  
  128. output.createNewFile();
  129. ImageIO.write(bi, IMAGEMAT, output);
  130.  
  131. return targerFilePath;
  132. }
  133.  
  134. /**
  135. * 根据视频长度随机生成随机数集合
  136. *
  137. * @param baseNum:基础数字,此处为视频长度
  138. * @param length:随机数集合长度
  139. * @return:随机数集合
  140. */
  141. public static List<Integer> random(int baseNum, int length) {
  142. List<Integer> list = new ArrayList<Integer>(length);
  143. while (list.size() < length) {
  144. Integer next = (int) (Math.random() * baseNum);
  145. if (list.contains(next)) {
  146. continue;
  147. }
  148. list.add(next);
  149. }
  150. Collections.sort(list);
  151. return list;
  152. }
  153.  
  154. }

使用javacv 截取视频指定帧节的更多相关文章

  1. 【Java SE】使用Javacv截取视频图片

    [Java Web开发学习]使用Javacv截取视频图片 转载:https://www.cnblogs.com/yangchongxing/p/9482935.html github地址:https: ...

  2. vue 截取视频第一帧

    最近自己写项目,在项目中涉及功能点又截取视频帧的点:需求澄清:移动端封面展示,平台上传图片(多张上传)取第一张上传图片为封面图:如上传视频则截取视频第一帧作为封面图: 实现思路:h5  video标签 ...

  3. php ffmpeg截取视频第一帧保存为图片的方法

    php ffmpeg截取视频第一帧保存为图片的方法 <pre> $xiangmupath = $this->getxiangmupath(); $filename = 'chengs ...

  4. Java截取视频首帧并旋转正向

    package test; import java.awt.Dimension; import java.awt.Graphics2D; import java.awt.Image; import j ...

  5. javacv获取视频第一帧

    第一种是用ffmpeg工具,不过还得安装客户端软件,于是放弃了,还有一种是javacv开源工具,所以选择第二种: 第一种:ffmpeg工具 需要安装ffmpeg软件,支持windows和linux,视 ...

  6. php如何截取出视频中的指定帧作为图片

    php如何截取出视频中的指定帧作为图片 一.总结 一句话总结:截取视频指定帧为图片,php ffmpeg扩展已经完美实现,并且php ffmpeg是开源的 二.php如何截取出视频中的指定帧作为图片 ...

  7. FFmpeg 入门(1):截取视频帧

    本文转自:FFmpeg 入门(1):截取视频帧 | www.samirchen.com 背景 在 Mac OS 上如果要运行教程中的相关代码需要先安装 FFmpeg,建议使用 brew 来安装: // ...

  8. javacv——读取摄像头的图像、截取视频的画面

    javacv开发包是用于支持java多媒体开发的一套开发包,可以适用于本地多媒体(音视频)调用以及音视频,图片等文件后期操作(图片修改,音视频解码剪辑等等功能). 这些需要引入的包.音视频处理使用ff ...

  9. python-----opencv截取按帧截取视频

    最近有需求把一个视频从指定帧截取一部分,demo代码如下: import cv2 video_path = r'F:\temp\temp_0806\1\video\test.dat' videoCap ...

随机推荐

  1. 使用gRPC-Web从浏览器调用.NET gRPC服务

    我很高兴宣布通过.NET对gRPC-Web进行实验性支持.gRPC-Web允许从基于浏览器的应用程序(例如JavaScript SPA或Blazor WebAssembly应用程序)调用gRPC. . ...

  2. 一个sio.c的实现及遇到的多任务执行问题

    https://sourceforge.net/p/cadcdev/lwip/ci/491e00038f26dc5d775f120aa49519a066819ebf/tree/kos/sio.c /* ...

  3. Java基于过滤器进行重定向不成功问题的兩種解決辦法,以及基於JSF的ajax重定向解決辦法

    我创建了一个过滤器,只要用户没有登陆就不能连接到主界面,但是在doFilter方法中用重定向在前端跳转页面不成功. 原因:由于我的登陆界面是基于ajax请求的,而ajax默认不支持重定向,他只能局部更 ...

  4. Python字符串字母大小写变换

    说明: 字符串就是一系列字符,在Python中用引号括起来的都是字符串,引号可以是单引号,也可以是双引号,比如:“This is a book.”  ‘This is an apple.’ 接下来简单 ...

  5. java设计模式 - 单例模式(干货)

    深度讲解23种设计模式,力争每种设计模式都刨析到底.废话不多说,开始第一种设计模式 - 单例. 作者已知的单例模式有8种写法,而每一种写法,都有自身的优缺点. 1,使用频率最高的写法,废话不多说,直接 ...

  6. HTTPS原理及流程

    HTTPS为什么更安全:数据对称加密传出,对称密钥使用非对称加密协商. HTTPS就一定安全吗:不一定,如果用户在浏览器端执意访问证书可疑或过期的站点,就存在安全隐患. --- HTTPS实现原理:h ...

  7. 「Flink」RocksDB介绍以及Flink对RocksDB的支持

    RocksDB介绍 RocksDB简介 RocksDB是基于C++语言编写的嵌入式KV存储引擎,它不是一个分布式的DB,而是一个高效.高性能.单点的数据库引擎.它是由Facebook基于Google开 ...

  8. SpringCloud之eureka注册中心入门

    eureka注册中心 一.基本概念 SpringCloud封装 了Netflix公司的eureka作为自己微服务的注册中心.这个注册中心和dubbo中的zookeeper很相似,简单来说,只要你可以将 ...

  9. 【redis】pipeline - 管道模型

    redis-pipeline 2020-02-10: 因为我把github相关的wiki删了,所以导致破图...待解决.(讲真github-wiki跟project是2个url,真的不好用) 因为用的 ...

  10. [.NET][C#] C#中的时间戳

    Unix时间戳(Unix timestamp),或称Unix时间(Unix time).POSIX时间(POSIX time),是一种时间表示方式,定义为从格林威治时间1970年1月1日0时0分0秒( ...