前言

只是最近碰到有这方面的项目需求,所以简单 Mark 下本文。下面的示例是参考过他人分享的文章,之后本人再自行实践、调整和测试过的,希望对有这方面需求的人有所帮助。

示例

添加依赖

org.bytedeco

javacv-platform

1.4.4

上述这段 maven 依赖包含了完整的 javacv 功能 (非常多,依赖Jar就占大概有500MB),由于这里只使用到了其中 ffmpeg 这块的特性,因此也可以像下面这样排除掉无关的部分

org.bytedeco

javacv

1.4.4

org.bytedeco

javacpp

org.bytedeco.javacpp-presets

flycapture

org.bytedeco.javacpp-presets

libdc1394

org.bytedeco.javacpp-presets

libfreenect

org.bytedeco.javacpp-presets

libfreenect2

org.bytedeco.javacpp-presets

librealsense

org.bytedeco.javacpp-presets

videoinput

org.bytedeco.javacpp-presets

opencv

org.bytedeco.javacpp-presets

tesseract

org.bytedeco.javacpp-presets

leptonica

org.bytedeco.javacpp-presets

flandmark

org.bytedeco.javacpp-presets

artoolkitplus

org.bytedeco

javacv-platform

1.4.4

org.bytedeco

javacv

org.bytedeco.javacpp-presets

flycapture-platform

org.bytedeco.javacpp-presets

libdc1394-platform

org.bytedeco.javacpp-presets

libfreenect-platform

org.bytedeco.javacpp-presets

libfreenect2-platform

org.bytedeco.javacpp-presets

librealsense-platform

org.bytedeco.javacpp-presets

videoinput-platform

org.bytedeco.javacpp-presets

opencv-platform

org.bytedeco.javacpp-presets

tesseract-platform

org.bytedeco.javacpp-presets

leptonica-platform

org.bytedeco.javacpp-presets

flandmark-platform

org.bytedeco.javacpp-presets

artoolkitplus-platform

核心代码

获取视频时长

/**

* 获取视频时长,单位为秒

*

* @param video 源视频文件

* @return 时长(s)

*/

public static long getVideoDuration(File video) {

long duration = 0L;

FFmpegFrameGrabber ff = new FFmpegFrameGrabber(video);

try {

ff.start();

duration = ff.getLengthInTime() / (1000 * 1000);

ff.stop();

} catch (FrameGrabber.Exception e) {

e.printStackTrace();

}

return duration;

}

截取视频指定帧为图片

/**

* 截取视频获得指定帧的图片

*

* @param video 源视频文件

* @param picPath 截图存放路径

*/

public static void getVideoPic(File video, String picPath) {

FFmpegFrameGrabber ff = new FFmpegFrameGrabber(video);

try {

ff.start();

// 截取中间帧图片(具体依实际情况而定)

int i = 0;

int length = ff.getLengthInFrames();

int middleFrame = length / 2;

Frame frame = null;

while (i < length) {

frame = ff.grabFrame();

if ((i > middleFrame) && (frame.image != null)) {

break;

}

i++;

}

// 截取的帧图片

Java2DFrameConverter converter = new Java2DFrameConverter();

BufferedImage srcImage = converter.getBufferedImage(frame);

int srcImageWidth = srcImage.getWidth();

int srcImageHeight = srcImage.getHeight();

// 对截图进行等比例缩放(缩略图)

int width = 480;

int height = (int) (((double) width / srcImageWidth) * srcImageHeight);

BufferedImage thumbnailImage = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR);

thumbnailImage.getGraphics().drawImage(srcImage.getScaledInstance(width, height, Image.SCALE_SMOOTH), 0, 0, null);

File picFile = new File(picPath);

ImageIO.write(thumbnailImage, "jpg", picFile);

ff.stop();

} catch (IOException e) {

e.printStackTrace();

}

}

测试用例

public static void main(String[] args) {

String videoPath = ResourceUtils.CLASSPATH_URL_PREFIX + "video.mp4";

File video = null;

try {

video = ResourceUtils.getFile(videoPath);

} catch (FileNotFoundException e) {

e.printStackTrace();

}

String picPath = "video.jpg";

getVideoPic(video, picPath);

long duration = getVideoDuration(video);

System.out.println("videoDuration = " + duration);

}

示例源码

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持聚米学院。

java如何截取视频文件_Java获取视频时长及截取帧截图详解相关推荐

  1. java 获取视频信息_Java获取视频参数信息

    Java获取视频参数信息 资料收集 经过搜索常用的处理视频的方式有两种:xuggler 和 ffmpeg 因ffmpeg 需要使用JNI调用,这里采用xuggler方式 使用xuggler获取视频宽. ...

  2. java 视频 缩略图_java获取视频缩略图

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

  3. java 获取视频时间_java 获取视频时间

    //先将视频保存到项目生成临时文件,获取时长后删除临时文件 //使用fastdfs进行文件上传 @RequestMapping("/uploadVideoToFast") @Res ...

  4. php获取页面视频文件,php获取视频时长_php 读取视频文件播放时间长度

    摘要 腾兴网为您分享:php 读取视频文件播放时间长度,中信期货,中日翻译,一路捞,信和财富等软件知识,以及阳光炫舞,火绒安全软件,qq锁,微信摇一摇抽奖软件,稿定设计软件,开始菜单图标,钩肥大战,g ...

  5. java中flush函数作用_Java语言中flush()函数作用及使用方法详解

    最近在学习io流,发现每次都会出现flush()函数,查了一下其作用,起作用主要如下 //------–flush()的作用--------– 笼统且错误的回答: 缓冲区中的数据保存直到缓冲区满后才写 ...

  6. java测试类 main方法_Java使用agent实现main方法之前的实例详解

    Java使用agent实现main方法之前的实例详解 创建Agent项目 PreMainExecutor 类,在main方法之前执行此方法 public class PreMainExecutor { ...

  7. java图片填充父容器_java相关:spring的父子容器及配置详解

    java相关:spring的父子容器及配置详解 发布于 2020-5-26| 复制链接 本篇文章主要介绍了spring的父子容器及配置详解,详细的介绍了spring父子容器的概念.使用场景和用法,有兴 ...

  8. java base64字符 转图片_JAVA实现图片与base64字符串之间的转换详解

    import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import ...

  9. java二维数组添加元素_Java二维数组与动态数组ArrayList类详解

    java二维数组 java 语言中提供的数组是用来存储固定大小的同类型元素. 1.二维数组初始化和声明 数组变量的声明,和创建数组可以用一条语句完成,如下所示: int a[][] = new int ...

最新文章

  1. 在C语言中,存在的内存的连续性的声明
  2. 通过SecureCRT连接Vmware中的RHEL6.3的方法
  3. after oracle alter,关于数据库级ALTER的触发器
  4. 10 个优质的 Laravel 扩展推荐
  5. 封装一个ViewPager真正的实现图片无限循环滚动带导航点
  6. Mono 开发 (使用.NET技术的你,绝对不能忽略Mono)
  7. 初始化与赋值哪个效率高?
  8. 显示js对象所有属性和方法的函数
  9. libreoffice word转pdf时中文乱码问题解决
  10. Python 的输出矩阵的一些常用设置
  11. 学英语三个月超过你过去学三年
  12. 小程序确定取消弹窗_小程序弹窗取消和确定 微信小程序怎么做
  13. 基于Java的电子作业提交系统_基于jsp的网上作业提交系统-JavaEE实现网上作业提交系统 - java项目源码...
  14. 【正则】字符串按一定规则做替换
  15. Android复杂页面代码拆分方法
  16. Skywalking系列博客6-手把手教你编写 Skywalking 插件
  17. 计算机用户组连接打印机,工作组链接域内共享打印机的正确姿势
  18. 如何设计一款高性能分布式锁,实现数据的安全访问?
  19. Z-Stack3.0协议栈组网
  20. adjacent angle_帝学教育:新SAT数学词汇中英文对照(几何篇)

热门文章

  1. break和continue语句、循环嵌套
  2. 计算机课说话检查200字,上课说话200字检讨书
  3. linux下的buff/cache内存占用过高-手动清除释放内存
  4. 七种操作系统的发展史及特点
  5. (九)JMH的详细使用,以及压测dubbo
  6. aspnetdb.mdb数据库介绍
  7. 简单python脚本实例画图-Python使用matplotlib简单绘图示例
  8. 洞悉物联网发展1000问之从三网融合到广电物联网会带来新机遇?
  9. 电脑管家怎么关闭右键深度加速(小火箭)功能
  10. 森林防火视频监控及指挥系统解决方案