java如何截取视频文件_Java获取视频时长及截取帧截图详解
前言
只是最近碰到有这方面的项目需求,所以简单 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获取视频时长及截取帧截图详解相关推荐
- java 获取视频信息_Java获取视频参数信息
Java获取视频参数信息 资料收集 经过搜索常用的处理视频的方式有两种:xuggler 和 ffmpeg 因ffmpeg 需要使用JNI调用,这里采用xuggler方式 使用xuggler获取视频宽. ...
- java 视频 缩略图_java获取视频缩略图
近期由于在做一个关于视频播放的项目,需要使用程序自动获取视频文件的缩略图,特写此文供其他人参考,有不清楚之楚可以给我留言. 1.使用工具:ffmpeg, 官网下载地址:http://ffmpeg.or ...
- java 获取视频时间_java 获取视频时间
//先将视频保存到项目生成临时文件,获取时长后删除临时文件 //使用fastdfs进行文件上传 @RequestMapping("/uploadVideoToFast") @Res ...
- php获取页面视频文件,php获取视频时长_php 读取视频文件播放时间长度
摘要 腾兴网为您分享:php 读取视频文件播放时间长度,中信期货,中日翻译,一路捞,信和财富等软件知识,以及阳光炫舞,火绒安全软件,qq锁,微信摇一摇抽奖软件,稿定设计软件,开始菜单图标,钩肥大战,g ...
- java中flush函数作用_Java语言中flush()函数作用及使用方法详解
最近在学习io流,发现每次都会出现flush()函数,查了一下其作用,起作用主要如下 //------–flush()的作用--------– 笼统且错误的回答: 缓冲区中的数据保存直到缓冲区满后才写 ...
- java测试类 main方法_Java使用agent实现main方法之前的实例详解
Java使用agent实现main方法之前的实例详解 创建Agent项目 PreMainExecutor 类,在main方法之前执行此方法 public class PreMainExecutor { ...
- java图片填充父容器_java相关:spring的父子容器及配置详解
java相关:spring的父子容器及配置详解 发布于 2020-5-26| 复制链接 本篇文章主要介绍了spring的父子容器及配置详解,详细的介绍了spring父子容器的概念.使用场景和用法,有兴 ...
- java base64字符 转图片_JAVA实现图片与base64字符串之间的转换详解
import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import ...
- java二维数组添加元素_Java二维数组与动态数组ArrayList类详解
java二维数组 java 语言中提供的数组是用来存储固定大小的同类型元素. 1.二维数组初始化和声明 数组变量的声明,和创建数组可以用一条语句完成,如下所示: int a[][] = new int ...
最新文章
- 在C语言中,存在的内存的连续性的声明
- 通过SecureCRT连接Vmware中的RHEL6.3的方法
- after oracle alter,关于数据库级ALTER的触发器
- 10 个优质的 Laravel 扩展推荐
- 封装一个ViewPager真正的实现图片无限循环滚动带导航点
- Mono 开发 (使用.NET技术的你,绝对不能忽略Mono)
- 初始化与赋值哪个效率高?
- 显示js对象所有属性和方法的函数
- libreoffice word转pdf时中文乱码问题解决
- Python 的输出矩阵的一些常用设置
- 学英语三个月超过你过去学三年
- 小程序确定取消弹窗_小程序弹窗取消和确定 微信小程序怎么做
- 基于Java的电子作业提交系统_基于jsp的网上作业提交系统-JavaEE实现网上作业提交系统 - java项目源码...
- 【正则】字符串按一定规则做替换
- Android复杂页面代码拆分方法
- Skywalking系列博客6-手把手教你编写 Skywalking 插件
- 计算机用户组连接打印机,工作组链接域内共享打印机的正确姿势
- 如何设计一款高性能分布式锁,实现数据的安全访问?
- Z-Stack3.0协议栈组网
- adjacent angle_帝学教育:新SAT数学词汇中英文对照(几何篇)