//------------maven配置文件---------------

org.bytedeco

javacv

0.8

/**

* 获取指定视频的帧并保存为图片至指定目录

* @param videofile 源视频文件路径

* @param framefile 截取帧的图片存放路径

* @throws Exception

*/

public static void fetchFrame(String videofile, String framefile)

throws Exception {

long start = System.currentTimeMillis();

File targetFile = new File(framefile);

FFmpegFrameGrabber ff = new FFmpegFrameGrabber(videofile);

ff.start();

int lenght = ff.getLengthInFrames();

int i = 0;

Frame f = null;

while (i < lenght) {

// 过滤前5帧,避免出现全黑的图片,依自己情况而定

f = ff.grabFrame();

if ((i > 5) && (f.image != null)) {

break;

}

i++;

}

IplImage img = f.image;

int owidth = img.width();

int oheight = img.height();

// 对截取的帧进行等比例缩放

int width = 800;

int height = (int) (((double) width / owidth) * oheight);

BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR);

bi.getGraphics().drawImage(f.image.getBufferedImage().getScaledInstance(width, height, Image.SCALE_SMOOTH),

0, 0, null);

ImageIO.write(bi, "jpg", targetFile);

// ff.flush();

ff.stop();

System.out.println(System.currentTimeMillis() - start);

}

public static void main(String[] args) {

try {

ImageUtil.fetchFrame("https://jsjoke.net/upload-1529285839603-touristappid.o6zAJswEDExvrLeuQTdnRSIz87Vo.f0fd65c07d78b8fc831c97888e4d7a55.mp4", "D:/test4.jpg");

} catch (Exception e) {

e.printStackTrace();

}

}

--------------------------------------- 解决图片旋转问题---------------------------------------

通过一段时间的搜索了解到,如果拍摄的视频中带有旋转(rotate)信息,那么截取出来的图片就会被旋转。通过查询API发现FFmpegFrameGrabber的getVideoMetadata("rotate")方法可以获取到视频的旋转信息。根据获取到的rotate信息对ff.grabImage()得到的Frame进行旋转,但是Frame并没有提供旋转接口。但有一个IpImage对象提供了旋转方法

public static void main(String[] args) {

try {

ImageUtil.fetchFrame("https://jsjoke.net/upload-1529285839603-touristappid.o6zAJswEDExvrLeuQTdnRSIz87Vo.f0fd65c07d78b8fc831c97888e4d7a55.mp4", "D:/test4.jpg");

} catch (Exception e) {

e.printStackTrace();

}

}

public static IplImage rotate(IplImage src, int rotate) {

IplImage img = IplImage.create(src.height(), src.width(), src.depth(), src.nChannels());

opencv_core.cvTranspose(src, img);

opencv_core.cvFlip(img, img, angle);

return img;

}

import java.awt.image.BufferedImage;

import java.io.File;

import java.io.IOException;

import javax.imageio.ImageIO;

import org.bytedeco.javacpp.opencv_core;

import org.bytedeco.javacpp.opencv_core.IplImage;

import org.bytedeco.javacv.FFmpegFrameGrabber;

import org.bytedeco.javacv.Frame;

import org.bytedeco.javacv.FrameGrabber.Exception;

import org.bytedeco.javacv.Java2DFrameConverter;

import org.bytedeco.javacv.OpenCVFrameConverter;

public abstract class FrameGrabberKit {

public static void main(String[] args) throws Exception {

randomGrabberFFmpegImage("C:/Users\\Administrator\\Desktop\\VID_20171229_162251.mp4", "G:\\test", "111");

}

public static void randomGrabberFFmpegImage(String filePath, String targerFilePath, String targetFileName)

throws Exception {

FFmpegFrameGrabber ff = FFmpegFrameGrabber.createDefault(filePath);

ff.start();

String rotate =ff.getVideoMetadata("rotate");

Frame f;

int i = 0;

while (i <1) {

f =ff.grabImage();

IplImage src = null;

if(null !=rotate &&rotate.length() > 1) {

OpenCVFrameConverter.ToIplImage converter =new OpenCVFrameConverter.ToIplImage();

src =converter.convert(f);

f =converter.convert(rotate(src, Integer.valueOf(rotate)));

}

doExecuteFrame(f,targerFilePath,targetFileName);

i++;

}

ff.stop();

}

/*

* 旋转角度的

*/

public static IplImage rotate(IplImage src, int angle) {

IplImage img = IplImage.create(src.height(), src.width(), src.depth(), src.nChannels());

opencv_core.cvTranspose(src, img);

opencv_core.cvFlip(img, img, angle);

return img;

}

public static void doExecuteFrame(Frame f, String targerFilePath, String targetFileName) {

if (null ==f ||null ==f.image) {

return;

}

Java2DFrameConverter converter =new Java2DFrameConverter();

String imageMat ="jpg";

String FileName =targerFilePath + File.separator +targetFileName +"." +imageMat;

BufferedImage bi =converter.getBufferedImage(f);

System.out.println("width:" + bi.getWidth());

System.out.println("height:" + bi.getHeight());

File output =new File(FileName);

try {

ImageIO.write(bi,imageMat,output);

}catch (IOException e) {

e.printStackTrace();

}

}

}

org.bytedeco

javacv-platform

1.3.1

来源:

java 获取第一帧_java获取视频的第一帧相关推荐

  1. java 推流_JavaCV开发详解之2:截取推流服务器视频的某帧或本地视频的某帧

    引入依赖 org.bytedeco javacv 1.5.3 org.bytedeco javacv-platform 1.5.3 代码实现 package com.java.mmzsblog; im ...

  2. java 获取mp4 缩略图_java获取视频缩略图

    近期由于在做一个关于视频播放的项目,需要使用程序自动获取视频文件的缩略图,特写此文供其他人参考,有不清楚之楚可以给我留言. 1.使用工具:ffmpeg, 官网下载地址:http://ffmpeg.or ...

  3. java获取文件地址吗_java获取文件所在服务器位置路径

    1.通过 import javax.servlet.ServletContext 类获取web 服务器所在真实路径 public ActionForward execute( ActionMappin ...

  4. java ip地址接口_java获取ip地址与网络接口的方法示例

    java.net包 大家应该都知道,网络相关对象在java.net包中,Java net包下的类如下: 1.获取主机对象InetAddress //获取本地主机对象 InetAddress host ...

  5. java获取扩展名_Java获取文件扩展名称

    有时在处理文件时,需要根据文件类型对它们进行不同的处理. java.io.File没有任何获取文件扩展名的方法,这里提供了一个实用工具方法来获取文件扩展名. Java获取文件扩展名 在句点(.)之后, ...

  6. java 获取秒数_Java获取精确到秒的时间戳(转)

    1.时间戳简介: 时间戳的定义:通常是一个字符序列,唯一地标识某一刻的时间.数字时间戳技术是数字签名技术一种变种的应用.是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01 ...

  7. java gif合成_javacv之于视频/GIF解帧及重新拼接生成GIF实现

    预备接手表情包处理业务,前期处理并不复杂,流程包括 : GIF动图与视频的解帧 , 逐帧处理, 组合各帧得到新的GIF. 经过调研, 整合了ffmpeg的Java CV 可完美处理解帧 , anima ...

  8. java 获取本年第一天_java获取年份的第一天和最后一天

    下面是编程之家 jb51.cc 通过网络收集整理的代码片段. 编程之家小编现在分享给大家,也给大家做个参考. package com.dada.test; import java.text.Simpl ...

  9. java 一周的第一天_Java获取某年某周的第一天

    Java获取某年某周的第一天 1.设计源代码 FirstDayOfWeek.java: /** * @Title:FirstDayOfWeek.java * @Package:com.you.free ...

最新文章

  1. linux smb配置目录,linux基础---smb配置
  2. Random:产生随机数的类
  3. 实现盒子动画和键盘特效
  4. 使用tomcat时,不用给webapps文件放入文件,直接访问项目方法
  5. Linux系统编程之--守护进程的创建和详解【转】
  6. yolov3之pytorch源码解析_springmvc源码架构解析之view
  7. HW--漂亮度2(测试通过)
  8. 数据库范式5nf_第四范式(4NF)| 数据库管理系统
  9. PLSQL Developer 安装与配置
  10. RocketMq最佳实践
  11. 北京某数据中心全年用水量分析
  12. 第20节 简单密码破解—基于windows系统
  13. c语言实训总结报告综合,c语言综合性实验总结
  14. 谈谈对java线程的理解(五)--------ReentrantLock之阻塞队列
  15. 科学计算机语言,计算机语言教学科学思维
  16. “字体arial不支持样式regular“的解决方法
  17. linux系统 服务器 安装,服务器上怎么安装linux系统
  18. 【ML从入门到入土系列01】概述
  19. 编程中遇到syntax error怎么解决?
  20. 英雄联盟手游服务器维护中,《英雄联盟手游》serveriscurrentlyundermaintenance解决攻略...

热门文章

  1. 为什么Python发展这么快,有哪些优势?
  2. 反客为主 ——浅议呼叫中心在网络营销4C策略中的角色与价值
  3. Windows 服务器开机自启动
  4. 吴渴楨 160809206
  5. 几种常见的模式识别算法
  6. C#中构造函数的作用
  7. 32.突然弹出很多IE窗口怎么办:
  8. ASP.NET代码对页面输出进行清理
  9. 解决Windows平台通过cURL上传APP到蒲公英pgyer平台时无法使用中文升级描述的问题...
  10. 《易学Python》——第6章 类与面向对象编程 6.1 类是什么