从网上得知了 使用 javacv可以进行视频截图。
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>javacv-platform</artifactId>
<version>1.4.1</version>
</dependency>
/*
* @Description: 根据视频的某一帧截图
* @fileInputPath 原视频路径
* @frame 要截取的那一帧
* @fileOutPath 截图存放路径
* @return void
* @date 2019/2/14 11:12 AM
*/
public static void screenshots(String fileInputPath,int frame,String fileOutPath){
try {
FFmpegFrameGrabber ff = FFmpegFrameGrabber.createDefault(fileInputPath);
ff.start();
int ffLength = ff.getLengthInFrames();
Frame f;
int i = 0;
while (i<ffLength){
//一帧一帧的迭代到我需要到那一帧
f = ff.grabImage();
if (i==frame){
doExecuteFrame(f, fileOutPath);
break;
}
++i;
}
ff.stop();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void doExecuteFrame(Frame f, String targerFilePath) {
String imagemat = "jpg";
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();
}
}
但是出现一个问题,当我所截图的视频太大时,需要遍历的次数也十分多,非常浪费效率。
修改为。
/*
* @Description: 根据视频的某一帧截图
* @fileInputPath 原视频路径
* @frame 要截取的那一帧
* @fileOutPath 截图存放路径
* @return void
* @date 2019/2/14 11:12 AM
*/
public static void screenshots(String fileInputPath,int frame,String fileOutPath){
try {
FFmpegFrameGrabber ff = FFmpegFrameGrabber.createDefault(fileInputPath);
ff.start();
Frame f;
//跳转到需要截图到那一帧
ff.setFrameNumber(frame);
f = ff.grabImage();
doExecuteFrame(f, fileOutPath);
ff.stop();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void doExecuteFrame(Frame f, String targerFilePath) {
String imagemat = "jpg";
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();
}
}