前言 【java——获取视频某一帧的图片】最近接触了二维码识别的东西,用手机制作自动化脚本进行视频二维码的识别,参考了以下的模块。进行视频截图的获取,而这个展示的图片就需要在保存视频的同时从视频中截取某一帧的图片并保存,并且进行时间的获取。
*使用maven下包
org.bytedeco
javacv
1.4.3
org.bytedeco.javacpp-presets
ffmpeg-platform
4.0.2-1.4.3
*工具类
package com.at21.inspection.in.utils;
import org.bytedeco.javacv.FFmpegFrameGrabber;
import org.bytedeco.javacv.Frame;
import org.bytedeco.javacv.Java2DFrameConverter;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.UUID;
public class VideoProcessing {
//视频文件路径:
public static String videoPath = "D:/test/video";
//存放截取视频某一帧的图片
public static String videoFramesPath = "D:/test/img/";
/**
* 将视频文件帧处理并以“jpg”格式进行存储。
* 依赖FrameToBufferedImage方法:将frame转换为bufferedImage对象
*
* @param videoFileName
*/
public static String grabberVideoFramer(String videoFileName){
//最后获取到的视频的图片的路径
String videPicture="";
//Frame对象
Frame frame = null;
//标识
int flag = 0;
try {
/*
获取视频文件,路径最好使用绝对路径,
File f =new File("");
f.getAbsolutePath()
*/
FFmpegFrameGrabber fFmpegFrameGrabber = new FFmpegFrameGrabber(videoPath + "/" + videoFileName);
fFmpegFrameGrabber.setFormat("mp4");
//这里要加一句不然会报错
fFmpegFrameGrabber.start();
//获取视频总帧数
int ftp = fFmpegFrameGrabber.getLengthInFrames();
System.out.println("时长 " + ftp / fFmpegFrameGrabber.getFrameRate() / 60);
while (flag <= ftp) {
frame = fFmpegFrameGrabber.grabImage();
if (frame != null) {
//文件绝对路径+名字
String fileName = videoFramesPath + UUID.randomUUID().toString()+"_" + String.valueOf(flag) + ".jpg";
//文件储存对象
File outPut = new File(fileName);
ImageIO.write(FrameToBufferedImage(frame), "jpg", outPut);
//视频第五帧图的路径
String savedUrl = PropertyPlaceholder.getProperty("img_path") + outPut.getName();
videPicture=savedUrl;
break;
}
flag++;
}
fFmpegFrameGrabber.stop();
fFmpegFrameGrabber.close();
} catch (Exception E) {
E.printStackTrace();
}
return videPicture;
} public static BufferedImage FrameToBufferedImage(Frame frame) {
//创建BufferedImage对象
Java2DFrameConverter converter = new Java2DFrameConverter();
BufferedImage bufferedImage = converter.getBufferedImage(frame);
return bufferedImage;
} /**
* 测试:
* 1、在D盘中新建一个test文件夹,test中再分成video和img,在video下存入一个视频,并命名为test
* D:/test/videoD:/test/img
* @param args
*/
public static void main(String[] args) {
String videoFileName = "test.mp4";
grabberVideoFramer(videoFileName);
}
}
参考链接
1、使用JavaCV实现获取视频每帧并保存
推荐阅读
- Integer常量池结合源码解析
- Java基础|Java 打印空心等腰三角形(方法2)
- gradle 每次运行都会下载依赖的解决办法
- 使用vector代替数组
- 如何获取ResultSet的行数和列数
- Java 时间戳格式化
- Java基础|Android开发——JVM、Dalvik以及ART的区别
- XML|XML报文转Map
- Java 8 时间,字符串和Long时间戳互转
- JAVA基础|JAVA基础(TreeMap键是Student值是String案例)