1. package test;
  2.  
  3. import java.awt.Dimension;
  4. import java.awt.Graphics2D;
  5. import java.awt.Image;
  6. import java.awt.Rectangle;
  7. import java.awt.image.BufferedImage;
  8. import java.io.File;
  9. import java.io.IOException;
  10. import java.util.ArrayList;
  11. import java.util.Iterator;
  12. import java.util.List;
  13. import java.util.Set;
  14. import java.util.TreeSet;
  15.  
  16. import javax.imageio.ImageIO;
  17.  
  18. import org.bytedeco.javacv.FFmpegFrameGrabber;
  19. import org.bytedeco.javacv.Frame;
  20. import org.bytedeco.javacv.Java2DFrameConverter;
  21.  
  22. public class VideoTest {
  23.  
  24. public static String image_type="jpg";
  25. public static String file_type="mp4";
  26.  
  27. public static void main(String[] args) {
  28. String videofile="C:/xmqtest/test视频.mp4";//或网络视频地址
  29. String framefileDir="C:/xmqtest/";
  30. String targetFilePath=fetchFrame(videofile,framefileDir);
  31. }
  32.  
  33. /**
  34. * 获取指定视频的帧并保存为图片至指定目录
  35. * @param videofile 源视频文件路径
  36. * @param framefile 截取帧的图片存放路径
  37. * @throws Exception
  38. */
  39. public static String fetchFrame(String videofile, String framefileDir){
  40. try{
  41. int startIndex=videofile.lastIndexOf('/');
  42. String fileName;
  43. if(startIndex==-1){
  44. fileName=videofile.substring(videofile.lastIndexOf('\\')+1, videofile.lastIndexOf('.'));
  45. }else{
  46. fileName=videofile.substring(startIndex+1, videofile.lastIndexOf('.')+1);
  47. }
  48. String targetFileName=framefileDir+fileName+image_type;
  49. File targetFile=createFile(targetFileName);
  50. FFmpegFrameGrabber ff = new FFmpegFrameGrabber(videofile);
  51. ff.start();
  52. String rotate_old=ff.getVideoMetadata("rotate");//视频旋转角度,可能是null
  53. int length = ff.getLengthInFrames();
  54. int i = 0;
  55. Frame f = null;
  56. while (i < length) {
  57. // 过滤前5帧,避免出现全黑的图片,依自己情况而定
  58. f = ff.grabFrame();
  59. if ((i > 5) && (f.image != null)) {
  60. break;
  61. }
  62. i++;
  63. }
  64. // IplImage img = f.image;
  65. int owidth = f.imageWidth;
  66. int oheight = f.imageHeight;
  67. // 对截取的帧进行等比例缩放
  68. int width = 300;//生成图片宽度为300px
  69. int height = (int) (((double) width / owidth) * oheight);
  70. Java2DFrameConverter converter = new Java2DFrameConverter();
  71. BufferedImage fecthedImage = converter.getBufferedImage(f);
  72. BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR);
  73. bi.getGraphics().drawImage(fecthedImage.getScaledInstance(width, height, Image.SCALE_SMOOTH),
  74. 0, 0, null);
  75. ImageIO.write(bi, image_type, targetFile);
  76. ff.stop();
  77. //有需要旋转
  78. if(rotate_old!=null && !rotate_old.isEmpty()){
  79. int rotate=Integer.parseInt(rotate_old);
  80. rotatePhonePhoto(targetFileName,rotate);
  81. }
  82. return targetFileName;
  83. }catch(Exception e){
  84. e.printStackTrace();
  85. }
  86. return null;
  87. }/***
  88. * 创建文件,目录不存在则先创建目录在创建文件
  89. * @param destFileName
  90. * @return
  91. */
  92. public static File createFile(String destFileName) {
  93. try {
  94. File file = new File(destFileName);
  95. if (!file.getParentFile().exists()) {
  96. file.getParentFile().mkdirs();
  97. }
  98. file.createNewFile();
  99. return file;
  100. } catch (IOException e) {
  101. e.printStackTrace();
  102. return null;
  103. }
  104. }
  105.  
  106. /**
  107. * 删除单个文件
  108. */
  109. public static void deleteFile(String sPath) {
  110. File file = new File(sPath);
  111. if (file.isFile() && file.exists()) {
  112. file.delete();
  113. }
  114. }
  115.  
  116. /**
  117. * 旋转照片
  118. *
  119. * @return
  120. */
  121. public static String rotatePhonePhoto(String fullPath, int angel) {
  122. BufferedImage src;
  123. try {
  124. src = ImageIO.read(new File(fullPath));
  125. int src_width = src.getWidth(null);
  126. int src_height = src.getHeight(null);
  127.  
  128. int swidth = src_width;
  129. int sheight = src_height;
  130.  
  131. if (angel == 90 || angel == 270) {
  132. swidth = src_height;
  133. sheight = src_width;
  134. }
  135. Rectangle rect_des = new Rectangle(new Dimension(swidth, sheight));
  136. BufferedImage res = new BufferedImage(rect_des.width, rect_des.height, BufferedImage.TYPE_INT_RGB);
  137. Graphics2D g2 = res.createGraphics();
  138. g2.translate((rect_des.width - src_width) / 2, (rect_des.height - src_height) / 2);
  139. g2.rotate(Math.toRadians(angel), src_width / 2, src_height / 2);
  140. g2.drawImage(src, null, null);
  141. ImageIO.write(res,image_type, new File(fullPath));
  142. } catch (Exception e) {
  143. e.printStackTrace();
  144. }
  145. return fullPath;
  146.  
  147. }
  148. }

说明点:

1、加入依赖,经测试两个依赖在windows环境,linux环境下正常使用。如果本地windows环境正常但是在linux下失败,请使用以下依赖。

  1. <dependency>
    <groupId>org.bytedeco</groupId>
    <artifactId>javacv</artifactId>
    <version>1.4.3</version>
    </dependency>
  2.  
  3. <dependency>
    <groupId>org.bytedeco.javacpp-presets</groupId>
    <artifactId>ffmpeg-platform</artifactId>
    <version>4.0.2-1.4.3</version>
    </dependency>
  4.  
  5. 2、针对iphone手机视频等需要进行首帧图片旋转,否则出现首帧图片横着的情况。如代码部分:
  1. String rotate_old=ff.getVideoMetadata("rotate");//视频旋转角度,可能是null

Java截取视频首帧并旋转正向的更多相关文章

  1. vue 截取视频第一帧

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

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

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

  3. 使用javacv 截取视频指定帧节

    个人博客 地址:https://www.wenhaofan.com/article/20190407105818 引入依赖 <dependency> <groupId>org. ...

  4. Java截取视频文件缩略图

    /** * 截取视频第0帧的图片 */public static void videoImage(String filePath, String fileName,int widthdist, int ...

  5. java获取视频的第一帧

    //------------maven配置文件--------------- <dependency> <groupId>org.bytedeco</groupId> ...

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

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

  7. 用java实现给图片增加图片水印或者文字水印(也支持视频图像帧添加水印)

    javaCV图像处理系列: javaCV图像处理之1:实时视频添加文字水印并截取视频图像保存成图片,实现文字水印的字体.位置.大小.粗度.翻转.平滑等操作 javaCV图像处理之2:实时视频添加图片水 ...

  8. java获取视频播第一帧

    FFMPEG 功能很强大,做视频必备的软件.大家可通过 http://ffmpeg.org/ 了解.Windows版本的软件,可通过 http://ffmpeg.zeranoe.com/builds/ ...

  9. python opencv 按一定间隔截取视频帧

    前言关于opencvOpenCV 是 Intel 开源计算机视觉库 (Computer Version) .它由一系列 C 函数和少量 C++ 类构成,实现了图像处理和计算机视觉方面的很多通用算法. ...

随机推荐

  1. CVS update常用技巧

    常用的命令有 cvs update 全部更新 cvs update path/to/file 来更新某一个文件 cvs update -dP 意为删除空目录创建新目录 cvs -f -n update ...

  2. Android开发——Android的消息机制详解

    )子线程默认是没有Looper的,Handler创建前,必须手动创建,否则会报错.通过Looper.prepare()即可为当前线程创建一个Looper,并通过Looper.loop()来开启消息循环 ...

  3. 00036_private

    1.私有private 描述人.Person: 属性:年龄: 行为:说话:说出自己的年龄. class Person { int age; String name; public void show( ...

  4. hdu3594 Cactus

    仙人掌入门简单题. 先看一篇文档. #include <iostream> #include <cstring> #include <cstdio> using n ...

  5. [android开发篇]安装android sdk的时候请注意

    第二就是: 如果要国内镜像的话: 3.大连东软信息学院镜像服务器地址: http://mirrors.neusoft.edu.cn  端口:80 随便选择一个就行啦.这里我选择的是第三个站点,即大连东 ...

  6. [android开发篇][android studio 和elipse都需要的流程 android sdk的安装

    第三步.下载并安装AndroidSDK 前面两步,我们已经配置了JDK变量环境,并安装好了Eclipse,通过这两步之后Java的开发环境就准备好了,如果我们只是开发普通的JAVA应用程序的话,那么到 ...

  7. [android开发篇] [应用组件]Intent 和 Intent 过滤器

    https://developer.android.com/guide/components/intents-filters.html Intent 是一个消息传递对象,您可以使用它从其他应用组件请求 ...

  8. HDU-4847 Wow! Such Doge!,模拟!

    Wow! Such Doge! 题意:给定的字符串中doge出现了多少次,直接模拟即可,不用KMP. char s[N]; int main() { // int n; int ans=0; whil ...

  9. caffe+vs2013+window10+GPU(CPU)配置

    参考:http://www.echojb.com/cuda/2017/03/15/350138.html https://www.zhihu.com/question/56111727 第一步:首先确 ...

  10. 【bzoj1174】[Balkan2007]Toponyms Trie树

    题目描述 给你一个字符集合,你从其中找出一些字符串出来. 希望你找出来的这些字符串的最长公共前缀*字符串的总个数最大化. 输入 第一行给出数字N.N在[2,1000000] 下面N行描述这些字符串,长 ...