热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

java取视频第一帧,java获取视频的第一帧

------------maven配置文件---------------org.bytedecojavacv0.8***获取指定视频的帧并保存为图片至指定目录*paramvideo

//------------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

// 过滤前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 &#61;ff.grabImage();

IplImage src &#61; null;

if(null !&#61;rotate &&rotate.length() > 1) {

OpenCVFrameConverter.ToIplImage converter &#61;new OpenCVFrameConverter.ToIplImage();

src &#61;converter.convert(f);

f &#61;converter.convert(rotate(src, Integer.valueOf(rotate)));

}

doExecuteFrame(f,targerFilePath,targetFileName);

i&#43;&#43;;

}

ff.stop();

}

/*

* 旋转角度的

*/

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

IplImage img &#61; 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 &#61;&#61;f ||null &#61;&#61;f.image) {

return;

}

Java2DFrameConverter converter &#61;new Java2DFrameConverter();

String imageMat &#61;"jpg";

String FileName &#61;targerFilePath &#43; File.separator &#43;targetFileName &#43;"." &#43;imageMat;

BufferedImage bi &#61;converter.getBufferedImage(f);

System.out.println("width:" &#43; bi.getWidth());

System.out.println("height:" &#43; bi.getHeight());

File output &#61;new File(FileName);

try {

ImageIO.write(bi,imageMat,output);

}catch (IOException e) {

e.printStackTrace();

}

}

}

org.bytedeco

javacv-platform

1.3.1

来源&#xff1a;

java获取视频播第一帧

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

第五十二篇、 OC获取视频的第一帧图片thumbnailImage

获取视频的第一帧图片 有时候我们拍摄完视频后,希望获取一张图片当作这个视频的介绍,这个图片thumbnailImage可以从视频的第一帧获取到. 我们的思路是先获取视频的URL,然后初始化一个MPMo ...

PHP获取视频的第一帧与时长

//获得视频文件的缩略图 function getVideoCover($file,$time,$name) { if(empty($time))$time &#61; &#39;1&#39;;//默认截取第一秒第一帧 $s ...

在Android中如何获取视频的第一帧图片并显示在一个ImageView中

String path  &#61; Environment.getExternalStorageDirectory().getPath(); MediaMetadataRetriever media &#61; n ...

C#:获取视频某一帧的缩略图

读取方式:使用ffmpeg读取,所以需要先下载ffmpeg.网上资源有很多. 原理是通过ffmpeg执行一条命令获取视频某一帧的缩略图. 首先,需要获取视频的帧高度和帧宽度,这样获取的缩略图才不会变形 ...

java获取当月的第一天和最后一天,获取本周的第一天和最后一天

/** * 获取指定日期所在周的第一天和最后一天,用下划线连接 * &#64;param dataStr * &#64;return * &#64;throws ParseException */ public static ...

关于ffmpeg /iis 8.5 服务器下&#xff0c;视频截取第一帧参数配置

ffmpeg 视频截取第一帧参数配置: 网站找了很多资料,但是都不能满足要求,然后自己写下解决过程. 首先看自己PHP 版本,安全选项里面 php5.4  跟php5.6 是不一样的.去除里面的sys ...

java获取当前月第一天和最后一天&#xff0c;上个月第一天和最后一天

package com.test.packager; import java.text.ParseException; import java.text.SimpleDateFormat; impor ...

java获取视频缩略图

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

随机推荐

C#命名规则和编码规范

用Pascal规则来命名属性.方法.事件和类名. public class HelloWorld { public void SayHello(string name) { } } Pascal规则是 ...

CodeIgniter 下引入ORM Doctrine

做了两年的CI开发,一直使用activeRecord来操作数据库.简单,轻巧加方便.最近一个项目交给手下去做,也是采用从数据库设计入手的开发流程,现在已经上线运行.经历了理清需求,设计数据库,在CI中 ...

Qt中sleep()的实现(耳目一新的两种方法)

在Qt中并没有Sleep函数可以调用,在程序编写时往往需要休眠几秒,这里举出两个方法,不知道是否啥不良隐患没~~ 方法一: class SleeperThread : public QThread{p ...

Oracle表连接总结

1 简述 1) 两个表的连接,是通过将一个表中的一列或者多列同另一个表中的列链接而建立起来的.用来连接两张表的表达式组成了连接条件.当连接成功后,第二张表中的数据就同第一张表连接起来了,并形成了复合结 ...

tsst

import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Sc ...

SQL表连接查询(inner join(join)、full join、left join、right join、cross join)

下面列出了您可以使用的 JOIN 类型,以及它们之间的差异. JOIN: 如果表中有至少一个匹配,则返回行(join&#61;inner join) LEFT JOIN: 即使右表中没有匹配,也从左表返回所有 ...

TurnipBit—MicroPython开发板&#xff1a;妥妥拽拽零基础也能玩编程

可视化编程网站入口:www.turnipbit.com 说到编程.谈到硬件,你也许会想到屌丝逆袭女神的"传奇"故事,也许会浮现出带着眼镜.头发稀少.无精打采的程序猿形象." ...

Redis服务信息

想要获得下面的redis服务器信息,只需要在命令行中输入:info server 部分记录了 Redis 服务器的信息,它包含以下域: redis_version : Redis 服务器版本 redi ...

MVC 视图助手书写规范及注意点

&#64;Html.TextBoxFor() 讲解(其他类似的 &#64;Html.LabelFor 等)同理 &#64;Html.TextBoxFor(model &#61;> model.SearchParams.Name ...

[Vuex] Create a Vuex Store using TypeScript

A Vuex store centralizes the state of your app, making it easy to reason about your state flow. In t ...



推荐阅读
author-avatar
春暖花开时的夜晚
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有