转载大佬文章,以备后期再次需要,亲测使用有效

添加依赖

在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生成视频缩略图相关推荐

  1. java 视频预览_java在上传视频时生成预览图

    在圣品上传时往往需要生成一张预览图(缩略图),如果在非特殊情况下让用户单独上传,会造成工作压力,此时可以用视频中某一帧作为封面图,实现方式如下: public class ImageUtil { /* ...

  2. java url 缩略图_java根据url生成网页截图,缩略图 | 学步园

    public class ShotsPic extends JPanel { private static final long serialVersionUID = 1L; // 行分隔符 fina ...

  3. java占位符填充_Java使用freemark生成word

    1.制作模板 先用office word做一个模板word文档,${usrName}.${nowDate}占位符 可以使用 office 或者 wps 先创建一个模板表格 (替换$部分可以在 模板格式 ...

  4. java编译生成哪些文件_java编译后生成什么文件?生成的文件包括什么?

    在大家编译完java程序的时候,都是会生成一个文件的,作为java新手不清楚java编译后生成什么文件?那么今天我们就给大家讲解一下这方面的内容,大家可以参考下文哦! java文件编译过后会生成一个c ...

  5. java 不生成文件下载_java – 浏览器不生成文件下载对话框

    我目前的情况是JavaScript客户端有一堆数据,我POST到服务器处理/转换成不同的格式(例如CSV),现在我想将转换后的数据从服务器发送到客户端. 我设置了响应的内容类型,但浏览器不生成文件对话 ...

  6. java 随机手机验证码_Java实现随机生成手机短信验证码的简单代码

    这篇文章主要介绍了Java随机生成手机短信验证码的方法,涉及Java数学运算计算随机数及字符串操作的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下 本文实例讲述了Java随机生成手机短信验证码的 ...

  7. java 区位码转中文_Java根据汉字生成区位码公共类

    package com.sunfairs.util; import java.io.UnsupportedEncodingException; import java.util.Random; pub ...

  8. java 操作pdf 模板_java使用模板生成PDF

    (1)先用word做出模板界面 (2)文件另存为pdf格式文件 (3)通过Adobe Acrobat pro软件打开刚刚用word转换成的pdf文件 (4)点击右边的"准备表单"按 ...

  9. java 将html生成图片_java通过html生成pdf,支持css和图片以及横向打印

    项目当中通常会有生成pdf的需求,pdf的排版尤为重要!通过html生成,最为方便. 1. 依赖 工具使用freemarker模板进行数据渲染 org.freemarker freemarker 2. ...

  10. java 创建word文件_java基于feemarker 生成word文档(超级简单)

    问题由来: 开发个新需求,需要按规定导出word文档,文档截图如下 因为之前没做过这个,一脸懵B啊,导出excel和txt倒是经常接触到,对于这个word这种格式不严谨的文件怎么处理呢? 技术选型:可 ...

最新文章

  1. 《自然》 脑机接口新突破 人脑信号转文本准确率达97%
  2. 李飞飞重返斯坦福后的大动作:开启「以人为中心的AI计划」
  3. 【深度学习】深度神经网络框架的INPUT PROCESS
  4. Vue2.0 Transition常见用法全解惑
  5. 移动平均滤波_Kalman滤波理论与MATLAB实现引言
  6. 2022,普平数据中心招聘来啦!
  7. 《数据库系统实训》实验报告——视图
  8. MySQL 高级 - 语法 - if判断
  9. java getabsolutepath,详谈java中File类getPath()、getAbsolutePath()、getCanonical的区别
  10. python将html存为pdf_用Python将HTML转为PDF。
  11. Android 4 学习(19):Services
  12. 03-mysql的相关命令-启动与关闭服务-配置环境变量
  13. labelme安装_语义图像分割-DIGITS2-labelme数据集自动扩展
  14. 有PHP4的分支吗?
  15. Centos删除virbr0网卡
  16. matlab中变压器的仿真,基于MATLAB的稳压变压器建模与仿真
  17. Axure制作倒计时
  18. 联想电脑G40无法使用 非要睡眠后才能启用wifi
  19. 计算机加入域的一种方法
  20. 软件工程师——计算机组成原理

热门文章

  1. 求助:Python识别PDF段落和翻译的问题
  2. 倾斜摄影(ContextCapture)空三/三维建模-台式、便携、单机/集群硬件配置方案2020
  3. 企业微信网页应用开发 - 开发环境搭建
  4. Win10 远程桌面黑屏问题
  5. matlab eemd输出,如何用EEMD处理一份数据
  6. 毕业生就业管理系统 C++
  7. Windows 10系统下载----生成iso镜像文件
  8. 那个回乡创业的年轻人,终于断了再回京的念头
  9. 队列DID:以知识青年“上山下乡”为例
  10. 抖音去除水印还原真实视频解析