个人博客 地址:https://www.wenhaofan.com/article/20190407105818

引入依赖

org.bytedeco

javacv

1.4.3

org.bytedeco.javacpp-presets

ffmpeg-platform

4.0.2-1.4.3

代码案例package live.autu.ctcms.common.kit;

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.Java2DFrameConverter;

import org.bytedeco.javacv.OpenCVFrameConverter;

import com.jfinal.kit.PathKit;

import com.jfinal.kit.Ret;

public class VideoFrameUtil {

private static String rootPath = PathKit.getWebRootPath() + "/video/img";// 服务器路径

private static final String IMAGEMAT = "png"; // 图片格式

private static final String ROTATE = "rotate";

public static final int MOD = 1;// 第一帧

public static Ret getVideoFirstFrame(String videoPath, String imageName) {

return getVideoFrame(videoPath, imageName, MOD);

}

/**

* 获取视频缩略图

*

* @param lpath

* @param filePath:视频路径

* @param mod:视频长度/mod获取第几帧

* @throws Exception

*/

public static Ret getVideoFrame(String filePath, String targetImageName, int mod) {

// 根据视频路径生成缩略图存放路径

String targetFilePath = null;

try (FFmpegFrameGrabber ff = FFmpegFrameGrabber.createDefault(filePath);) {

ff.start();

String rotate = ff.getVideoMetadata(ROTATE);

int ffLength = ff.getLengthInFrames();

Frame f = null;

int i = 0;

int index = mod;

if (i >= ffLength) {

return Ret.fail();

}

for (int j = 0; j <= index; j++) {

f = ff.grabImage();

}

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 = doExecuteFrame(f, targetImageName);

ff.stop();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

return Ret.ok("targetFilePath",targetFilePath)

.set("relativeFilePath", "/video/img/"+targetImageName); // 返回的是视频第一帧

}

/**

* 旋转图片

*

* @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 filePath:视频路径

* @param index:第几帧

* @return:缩略图的存放路径

*/

private static String getImagePath(String fileName) {

return rootPath+"/" + fileName;

}

/**

* 截取缩略图

*

* @param f

* @param targerFilePath:封面图片

* @throws IOException

*/

public static String doExecuteFrame(Frame f, String lpath) throws IOException {

if(!new File(rootPath).exists()) {

new File(rootPath).mkdirs();

}

String targerFilePath = getImagePath(lpath);

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

return null;

}

Java2DFrameConverter converter = new Java2DFrameConverter();

BufferedImage bi = converter.getBufferedImage(f);

File output = new File(targerFilePath);

output.createNewFile();

ImageIO.write(bi, IMAGEMAT, output);

return targerFilePath;

}

/**

* 根据视频长度随机生成随机数集合

*

* @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截取视频片段_使用javacv 截取视频指定帧节相关推荐

  1. 如何截取视频片段并制作成短视频

    视频截取算是网上的热门搜索词,很多网友在视频中遇到精彩的片段十分喜欢,可是又不知道该怎么截取下来保存,只能上网搜索求助.其实学会截取视频片段对我们来说算是一个不错的技能,因为这样我们就可以自己截取喜欢 ...

  2. java如何开发视频软件_如何快速实现视频截图?很多人都在使用的一款软件

    如何快速实现视频截图?昨天5月21日,很多地方都下起了大暴雨,包括东莞.广州.深圳.北京.台湾等地.第二天很多网友纷纷在本地的公众号上看到不少关于昨天暴雨的各种视频截图,什么水浸街.屋子被淹.房子倒塌 ...

  3. java 视频切片_关于视频播放、视频切片、跨域访问视频

    关于视频播放.视频切片.跨域访问视频 前言 最近在着手部署上线做的一个视频网站,当我们部署到云服务器上后并开始测试视频观看并发量,发现了一个很严重的问题:带宽不足.9 或 10 个人同时观看视频的时候 ...

  4. python提取图片文字视频教学_用Python提取视频中的图片

    小编自己码的通用型函数,支持各种常用视频格式,可满足常用需求,亲测效果和速度都不错. 想获取本文数据和完整代码的下载链接,请关注微信公众号"R语言和Python学堂",并回复发文日 ...

  5. 嵌入式智能家居项目视频监控_智能化您的视频嵌入

    嵌入式智能家居项目视频监控 Video content is taking over the Internet. The trend began long ago and the most recen ...

  6. java mp4 视频时间戳_如何在MP4视频文件上批量修改时间戳记元数据

    基础上QuickTime File Format Specification我放在一起的时间戳的原油转移证明了概念的Python脚本,让我用现在: #!/usr/bin/env python impo ...

  7. python提取视频字幕_利用Python提取视频中的字幕(文字识别)

    我的CSDN博客id:qq_39783601,昵称是糖潮丽子~辣丽 从今天开始我会陆续将数据分析师相关的知识点分享在这里,包括Python.机器学习.数据库等等. 今天来分享一个Python小项目! ...

  8. python做视频剪辑_用python进行视频剪辑

    这篇文章主要介绍了如何用python进行视频剪辑,帮助大家更好的利用python处理视频,感兴趣的朋友可以了解下 一.目标 python,利用moviepy和pydub将一段视频进行区间切割 二.源码 ...

  9. python剪辑视频 裁剪_用python进行视频剪辑

    一.目标 python,利用moviepy和pydub将一段视频进行区间切割 二.源码 import os from moviepy.video.io.VideoFileClip import Vid ...

最新文章

  1. 2021院士候选人,近150人获提名!看看有没有自己的母校~
  2. opencv乱码java_opencv 放置文字 中文乱码处理 putText
  3. 不是碰不到更好的,是因为已经有了你!
  4. python 实现感知器(一)
  5. Mac 设置 NDK
  6. 洛谷P3509 [POI2010]ZAB-Frog
  7. 中文版通用工程师软件DPS 别克雪佛兰编程改装
  8. 颜色名称及色样表(HTML版)
  9. 引脚复用和引脚重映射
  10. 一款自适应的聊天网站-匿名在线聊天室PHP源码
  11. vue 替换路由地址参数(动态修改路由参数)
  12. 无法打开登录所请求的数据库 xxx。登录失败。用户 'AAA' 登录失败。
  13. vue 实现无限轮播_vue图片无限轮播
  14. 微信小游戏SDK,全方位解读
  15. 为什么需要 Mini-batch 梯度下降,及 TensorFlow 应用举例
  16. history查看历史命令,并显示运行时间
  17. 去掉所有的空格、回车换行符
  18. 全国人工智能师资培训班·上海站火热招生中
  19. Laravel 数据库
  20. Vue3分页器(Pagination)

热门文章

  1. Java程序员面试需要注意什么?
  2. NCQ与TCQ的区别及测试比较
  3. querylist V4 图片下载
  4. 2014第二十二届全国青少年信息学奥林匹克联赛初赛
  5. 将中国标准时间转化为yyyy-MM-dd 00:00:00格式
  6. 离网型风力发电机与并网型风力发电机之间的区别
  7. 火狐浏览器的全屏兼容问题 allowfullscreen=true
  8. synergy使用方法和安装包
  9. [转]SMART原则
  10. venv文件夹里没有bin