Java截取视频首帧并旋转正向
- package test;
- import java.awt.Dimension;
- import java.awt.Graphics2D;
- import java.awt.Image;
- import java.awt.Rectangle;
- import java.awt.image.BufferedImage;
- import java.io.File;
- import java.io.IOException;
- import java.util.ArrayList;
- import java.util.Iterator;
- import java.util.List;
- import java.util.Set;
- import java.util.TreeSet;
- import javax.imageio.ImageIO;
- import org.bytedeco.javacv.FFmpegFrameGrabber;
- import org.bytedeco.javacv.Frame;
- import org.bytedeco.javacv.Java2DFrameConverter;
- public class VideoTest {
- public static String image_type="jpg";
- public static String file_type="mp4";
- public static void main(String[] args) {
- String videofile="C:/xmqtest/test视频.mp4";//或网络视频地址
- String framefileDir="C:/xmqtest/";
- String targetFilePath=fetchFrame(videofile,framefileDir);
- }
- /**
- * 获取指定视频的帧并保存为图片至指定目录
- * @param videofile 源视频文件路径
- * @param framefile 截取帧的图片存放路径
- * @throws Exception
- */
- public static String fetchFrame(String videofile, String framefileDir){
- try{
- int startIndex=videofile.lastIndexOf('/');
- String fileName;
- if(startIndex==-1){
- fileName=videofile.substring(videofile.lastIndexOf('\\')+1, videofile.lastIndexOf('.'));
- }else{
- fileName=videofile.substring(startIndex+1, videofile.lastIndexOf('.')+1);
- }
- String targetFileName=framefileDir+fileName+image_type;
- File targetFile=createFile(targetFileName);
- FFmpegFrameGrabber ff = new FFmpegFrameGrabber(videofile);
- ff.start();
- String rotate_old=ff.getVideoMetadata("rotate");//视频旋转角度,可能是null
- int length = ff.getLengthInFrames();
- int i = 0;
- Frame f = null;
- while (i < length) {
- // 过滤前5帧,避免出现全黑的图片,依自己情况而定
- f = ff.grabFrame();
- if ((i > 5) && (f.image != null)) {
- break;
- }
- i++;
- }
- // IplImage img = f.image;
- int owidth = f.imageWidth;
- int oheight = f.imageHeight;
- // 对截取的帧进行等比例缩放
- int width = 300;//生成图片宽度为300px
- 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, image_type, targetFile);
- ff.stop();
- //有需要旋转
- if(rotate_old!=null && !rotate_old.isEmpty()){
- int rotate=Integer.parseInt(rotate_old);
- rotatePhonePhoto(targetFileName,rotate);
- }
- return targetFileName;
- }catch(Exception e){
- e.printStackTrace();
- }
- return null;
- }/***
- * 创建文件,目录不存在则先创建目录在创建文件
- * @param destFileName
- * @return
- */
- public static File createFile(String destFileName) {
- try {
- File file = new File(destFileName);
- if (!file.getParentFile().exists()) {
- file.getParentFile().mkdirs();
- }
- file.createNewFile();
- return file;
- } catch (IOException e) {
- e.printStackTrace();
- return null;
- }
- }
- /**
- * 删除单个文件
- */
- public static void deleteFile(String sPath) {
- File file = new File(sPath);
- if (file.isFile() && file.exists()) {
- file.delete();
- }
- }
- /**
- * 旋转照片
- *
- * @return
- */
- public static String rotatePhonePhoto(String fullPath, int angel) {
- BufferedImage src;
- try {
- src = ImageIO.read(new File(fullPath));
- int src_width = src.getWidth(null);
- int src_height = src.getHeight(null);
- int swidth = src_width;
- int sheight = src_height;
- if (angel == 90 || angel == 270) {
- swidth = src_height;
- sheight = src_width;
- }
- Rectangle rect_des = new Rectangle(new Dimension(swidth, sheight));
- BufferedImage res = new BufferedImage(rect_des.width, rect_des.height, BufferedImage.TYPE_INT_RGB);
- Graphics2D g2 = res.createGraphics();
- g2.translate((rect_des.width - src_width) / 2, (rect_des.height - src_height) / 2);
- g2.rotate(Math.toRadians(angel), src_width / 2, src_height / 2);
- g2.drawImage(src, null, null);
- ImageIO.write(res,image_type, new File(fullPath));
- } catch (Exception e) {
- e.printStackTrace();
- }
- return fullPath;
- }
- }
说明点:
1、加入依赖,经测试两个依赖在windows环境,linux环境下正常使用。如果本地windows环境正常但是在linux下失败,请使用以下依赖。
- <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>- 2、针对iphone手机视频等需要进行首帧图片旋转,否则出现首帧图片横着的情况。如代码部分:
- String rotate_old=ff.getVideoMetadata("rotate");//视频旋转角度,可能是null
Java截取视频首帧并旋转正向的更多相关文章
- vue 截取视频第一帧
最近自己写项目,在项目中涉及功能点又截取视频帧的点:需求澄清:移动端封面展示,平台上传图片(多张上传)取第一张上传图片为封面图:如上传视频则截取视频第一帧作为封面图: 实现思路:h5 video标签 ...
- php ffmpeg截取视频第一帧保存为图片的方法
php ffmpeg截取视频第一帧保存为图片的方法 <pre> $xiangmupath = $this->getxiangmupath(); $filename = 'chengs ...
- 使用javacv 截取视频指定帧节
个人博客 地址:https://www.wenhaofan.com/article/20190407105818 引入依赖 <dependency> <groupId>org. ...
- Java截取视频文件缩略图
/** * 截取视频第0帧的图片 */public static void videoImage(String filePath, String fileName,int widthdist, int ...
- java获取视频的第一帧
//------------maven配置文件--------------- <dependency> <groupId>org.bytedeco</groupId> ...
- 【Java SE】使用Javacv截取视频图片
[Java Web开发学习]使用Javacv截取视频图片 转载:https://www.cnblogs.com/yangchongxing/p/9482935.html github地址:https: ...
- 用java实现给图片增加图片水印或者文字水印(也支持视频图像帧添加水印)
javaCV图像处理系列: javaCV图像处理之1:实时视频添加文字水印并截取视频图像保存成图片,实现文字水印的字体.位置.大小.粗度.翻转.平滑等操作 javaCV图像处理之2:实时视频添加图片水 ...
- java获取视频播第一帧
FFMPEG 功能很强大,做视频必备的软件.大家可通过 http://ffmpeg.org/ 了解.Windows版本的软件,可通过 http://ffmpeg.zeranoe.com/builds/ ...
- python opencv 按一定间隔截取视频帧
前言关于opencvOpenCV 是 Intel 开源计算机视觉库 (Computer Version) .它由一系列 C 函数和少量 C++ 类构成,实现了图像处理和计算机视觉方面的很多通用算法. ...
随机推荐
- CVS update常用技巧
常用的命令有 cvs update 全部更新 cvs update path/to/file 来更新某一个文件 cvs update -dP 意为删除空目录创建新目录 cvs -f -n update ...
- Android开发——Android的消息机制详解
)子线程默认是没有Looper的,Handler创建前,必须手动创建,否则会报错.通过Looper.prepare()即可为当前线程创建一个Looper,并通过Looper.loop()来开启消息循环 ...
- 00036_private
1.私有private 描述人.Person: 属性:年龄: 行为:说话:说出自己的年龄. class Person { int age; String name; public void show( ...
- hdu3594 Cactus
仙人掌入门简单题. 先看一篇文档. #include <iostream> #include <cstring> #include <cstdio> using n ...
- [android开发篇]安装android sdk的时候请注意
第二就是: 如果要国内镜像的话: 3.大连东软信息学院镜像服务器地址: http://mirrors.neusoft.edu.cn 端口:80 随便选择一个就行啦.这里我选择的是第三个站点,即大连东 ...
- [android开发篇][android studio 和elipse都需要的流程 android sdk的安装
第三步.下载并安装AndroidSDK 前面两步,我们已经配置了JDK变量环境,并安装好了Eclipse,通过这两步之后Java的开发环境就准备好了,如果我们只是开发普通的JAVA应用程序的话,那么到 ...
- [android开发篇] [应用组件]Intent 和 Intent 过滤器
https://developer.android.com/guide/components/intents-filters.html Intent 是一个消息传递对象,您可以使用它从其他应用组件请求 ...
- HDU-4847 Wow! Such Doge!,模拟!
Wow! Such Doge! 题意:给定的字符串中doge出现了多少次,直接模拟即可,不用KMP. char s[N]; int main() { // int n; int ans=0; whil ...
- caffe+vs2013+window10+GPU(CPU)配置
参考:http://www.echojb.com/cuda/2017/03/15/350138.html https://www.zhihu.com/question/56111727 第一步:首先确 ...
- 【bzoj1174】[Balkan2007]Toponyms Trie树
题目描述 给你一个字符集合,你从其中找出一些字符串出来. 希望你找出来的这些字符串的最长公共前缀*字符串的总个数最大化. 输入 第一行给出数字N.N在[2,1000000] 下面N行描述这些字符串,长 ...