java视频生成缩略图_Java——使用javacv生成视频缩略图
转载大佬文章,以备后期再次需要,亲测使用有效
添加依赖
在pom.xml中添加依赖配置
org.bytedeco
javacv-platform
1.3.1
1、获取视频中间的帧作为缩略图,并返回缩略图实际存放地址
package com.lyz.medis.image;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
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;
/**
* 获取视频缩略图
* @author liuyazhuang
*
*/
public class VideoImage {
private static final String IMAGEMAT = "png";
private static final String ROTATE = "rotate";
/**
* 默认截取视频的中间帧为封面
*/
public static final int MOD = 2;
public static void main(String[] args) throws Exception {
System.out.println(randomGrabberFFmpegImage("C:/lyz/1522372294724_79583.mov", 2));
}
/**
* 获取视频缩略图
* @param filePath:视频路径
* @param mod:视频长度/mod获取第几帧
* @throws Exception
*/
public static String randomGrabberFFmpegImage(String filePath, int mod) throws Exception {
String targetFilePath = "";
FFmpegFrameGrabber ff = FFmpegFrameGrabber.createDefault(filePath);
ff.start();
String rotate = ff.getVideoMetadata(ROTATE);
int ffLength = ff.getLengthInFrames();
Frame f;
int i = 0;
int index = ffLength / mod;
while (i < ffLength) {
f = ff.grabImage();
if(i == index){
if (null != rotate && rotate.length() > 1) {
OpenCVFrameConverter.ToIplImage converter = new OpenCVFrameConverter.ToIplImage();
IplImage src = converter.convert(f);
f = converter.convert(rotate(src, Integer.valueOf(rotate)));
}
targetFilePath = getImagePath(filePath, i);
doExecuteFrame(f, targetFilePath);
break;
}
i++;
}
ff.stop();
return targetFilePath;
}
/**
* 根据视频路径生成缩略图存放路径
* @param filePath:视频路径
* @param index:第几帧
* @return:缩略图的存放路径
*/
private static String getImagePath(String filePath, int index){
if(filePath.contains(".") && filePath.lastIndexOf(".") < filePath.length() - 1){
filePath = filePath.substring(0, filePath.lastIndexOf(".")).concat("_").concat(String.valueOf(index)).concat(".").concat(IMAGEMAT);
}
return filePath;
}
/**
* 旋转图片
* @param src
* @param angle
* @return
*/
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;
}
/**
* 截取缩略图
* @param f
* @param targerFilePath:封面图片
*/
public static void doExecuteFrame(Frame f, String targerFilePath) {
if (null == f || null == f.image) {
return;
}
Java2DFrameConverter converter = new Java2DFrameConverter();
BufferedImage bi = converter.getBufferedImage(f);
File output = new File(targerFilePath);
try {
ImageIO.write(bi, IMAGEMAT, output);
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 根据视频长度随机生成随机数集合
* @param baseNum:基础数字,此处为视频长度
* @param length:随机数集合长度
* @return:随机数集合
*/
public static List random(int baseNum, int length) {
List list = new ArrayList(length);
while (list.size() < length) {
Integer next = (int) (Math.random() * baseNum);
if (list.contains(next)) {
continue;
}
list.add(next);
}
Collections.sort(list);
return list;
}
}
2、随机生成多张缩略图,不返回缩略图实际存放地址
package com.lyz.medis.image;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
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;
/**
* 获取图片缩略图
* @author liuyazhuang
*
*/
public abstract class VideoImageFrame {
public static void main(String[] args) throws Exception {
randomGrabberFFmpegImage("e:/lyz/ffmpeg.mp4", "./target", "screenshot", 5);
}
/**
* 生成图片缩略图
* @param filePath:视频完整路径
* @param targerFilePath:缩略图存放目录
* @param targetFileName:缩略图文件名称
* @param randomSize:生成随机数的数量
* @throws Exception
*/
public static void randomGrabberFFmpegImage(String filePath, String targerFilePath, String targetFileName, int randomSize) throws Exception {
FFmpegFrameGrabber ff = FFmpegFrameGrabber.createDefault(filePath);
ff.start();
String rotate = ff.getVideoMetadata("rotate");
int ffLength = ff.getLengthInFrames();
List randomGrab = random(ffLength, randomSize);
int maxRandomGrab = randomGrab.get(randomGrab.size() - 1);
Frame f;
int i = 0;
while (i < ffLength) {
f = ff.grabImage();
if (randomGrab.contains(i)) {
if (null != rotate && rotate.length() > 1) {
OpenCVFrameConverter.ToIplImage converter = new OpenCVFrameConverter.ToIplImage();
IplImage src = converter.convert(f);
f = converter.convert(rotate(src, Integer.valueOf(rotate)));
}
doExecuteFrame(f, targerFilePath, targetFileName, i);
}
if (i >= maxRandomGrab) {
break;
}
i++;
}
ff.stop();
}
/**
* 旋转图片
* @param src:图片
* @param angle:旋转角度
* @return
*/
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;
}
/**
* 生成缩略图
* @param f Frame对象
* @param targerFilePath
* @param targetFileName
* @param index
*/
public static void doExecuteFrame(Frame f, String targerFilePath, String targetFileName, int index) {
if (null == f || null == f.image) {
return;
}
Java2DFrameConverter converter = new Java2DFrameConverter();
String imageMat = "png";
String FileName = targerFilePath + File.separator + targetFileName + "_" + index + "." + imageMat;
BufferedImage bi = converter.getBufferedImage(f);
File output = new File(FileName);
try {
ImageIO.write(bi, imageMat, output);
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 随机生成随机数集合
* @param baseNum:随机种子
* @param length:随机数集合长度
* @return:随机数集合
*/
public static List random(int baseNum, int length) {
List list = new ArrayList<>(length);
while (list.size() < length) {
Integer next = (int) (Math.random() * baseNum);
if (list.contains(next)) {
continue;
}
list.add(next);
}
Collections.sort(list);
return list;
}
}
java视频生成缩略图_Java——使用javacv生成视频缩略图相关推荐
- java 视频预览_java在上传视频时生成预览图
在圣品上传时往往需要生成一张预览图(缩略图),如果在非特殊情况下让用户单独上传,会造成工作压力,此时可以用视频中某一帧作为封面图,实现方式如下: public class ImageUtil { /* ...
- java url 缩略图_java根据url生成网页截图,缩略图 | 学步园
public class ShotsPic extends JPanel { private static final long serialVersionUID = 1L; // 行分隔符 fina ...
- java占位符填充_Java使用freemark生成word
1.制作模板 先用office word做一个模板word文档,${usrName}.${nowDate}占位符 可以使用 office 或者 wps 先创建一个模板表格 (替换$部分可以在 模板格式 ...
- java编译生成哪些文件_java编译后生成什么文件?生成的文件包括什么?
在大家编译完java程序的时候,都是会生成一个文件的,作为java新手不清楚java编译后生成什么文件?那么今天我们就给大家讲解一下这方面的内容,大家可以参考下文哦! java文件编译过后会生成一个c ...
- java 不生成文件下载_java – 浏览器不生成文件下载对话框
我目前的情况是JavaScript客户端有一堆数据,我POST到服务器处理/转换成不同的格式(例如CSV),现在我想将转换后的数据从服务器发送到客户端. 我设置了响应的内容类型,但浏览器不生成文件对话 ...
- java 随机手机验证码_Java实现随机生成手机短信验证码的简单代码
这篇文章主要介绍了Java随机生成手机短信验证码的方法,涉及Java数学运算计算随机数及字符串操作的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下 本文实例讲述了Java随机生成手机短信验证码的 ...
- java 区位码转中文_Java根据汉字生成区位码公共类
package com.sunfairs.util; import java.io.UnsupportedEncodingException; import java.util.Random; pub ...
- java 操作pdf 模板_java使用模板生成PDF
(1)先用word做出模板界面 (2)文件另存为pdf格式文件 (3)通过Adobe Acrobat pro软件打开刚刚用word转换成的pdf文件 (4)点击右边的"准备表单"按 ...
- java 将html生成图片_java通过html生成pdf,支持css和图片以及横向打印
项目当中通常会有生成pdf的需求,pdf的排版尤为重要!通过html生成,最为方便. 1. 依赖 工具使用freemarker模板进行数据渲染 org.freemarker freemarker 2. ...
- java 创建word文件_java基于feemarker 生成word文档(超级简单)
问题由来: 开发个新需求,需要按规定导出word文档,文档截图如下 因为之前没做过这个,一脸懵B啊,导出excel和txt倒是经常接触到,对于这个word这种格式不严谨的文件怎么处理呢? 技术选型:可 ...
最新文章
- 《自然》 脑机接口新突破 人脑信号转文本准确率达97%
- 李飞飞重返斯坦福后的大动作:开启「以人为中心的AI计划」
- 【深度学习】深度神经网络框架的INPUT PROCESS
- Vue2.0 Transition常见用法全解惑
- 移动平均滤波_Kalman滤波理论与MATLAB实现引言
- 2022,普平数据中心招聘来啦!
- 《数据库系统实训》实验报告——视图
- MySQL 高级 - 语法 - if判断
- java getabsolutepath,详谈java中File类getPath()、getAbsolutePath()、getCanonical的区别
- python将html存为pdf_用Python将HTML转为PDF。
- Android 4 学习(19):Services
- 03-mysql的相关命令-启动与关闭服务-配置环境变量
- labelme安装_语义图像分割-DIGITS2-labelme数据集自动扩展
- 有PHP4的分支吗?
- Centos删除virbr0网卡
- matlab中变压器的仿真,基于MATLAB的稳压变压器建模与仿真
- Axure制作倒计时
- 联想电脑G40无法使用 非要睡眠后才能启用wifi
- 计算机加入域的一种方法
- 软件工程师——计算机组成原理