导入maven依赖
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>javacv-platform</artifactId>
<version>1.5.1</version>
<type>pom</type>
</dependency>
代码部分
import org.bytedeco.javacv.FFmpegFrameGrabber;
import org.bytedeco.javacv.Frame;
import org.bytedeco.javacv.Java2DFrameConverter;
import org.bytedeco.javacv.OpenCVFrameGrabber;
import org.bytedeco.opencv.global.opencv_core;
import org.bytedeco.opencv.opencv_core.IplImage;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.nio.Buffer;
import java.util.UUID;
/**
*
* @param videoFileName rtsp流地址 或本地video
*/
public static void grabberVideoFramer(String videoFileName) {
//Frame对象
Frame frame = null;
//标识
int flag = 0;
/*
获取视频文件
*/
//FFmpegFrameGrabber fFmpegFrameGrabber = new FFmpegFrameGrabber(videoPath + "/" + videoFileName);
FFmpegFrameGrabber fFmpegFrameGrabber = new FFmpegFrameGrabber(videoFileName);
try {
fFmpegFrameGrabber.start();
/*
.getFrameRate()方法:获取视频文件信息,总帧数
*/
int ftp = fFmpegFrameGrabber.getLengthInFrames();
System.out.println("=======》读取视频帧数:"+ftp);
System.out.println("=======》读取视频帧率:"+fFmpegFrameGrabber.getFrameRate());
System.out.println("时长 " + ftp / fFmpegFrameGrabber.getFrameRate() / 60);
BufferedImage bImage = null;
/*
while (flag <= ftp) {
//每次取一帧
frame = fFmpegFrameGrabber.grabFrame();
//避免前5帧为黑
if ((flag>5)&& frame.image!= null) {
break;
}
flag++;
}*/
//文件绝对路径+名字
String fileName = 存储图片绝对路径
//文件储存对象
File outPut = new File(fileName);
//获取帧
frame = fFmpegFrameGrabber.grabImage();
if (frame!=null){
BufferedImage bufferedImage = FrameToBufferedImage(frame);
int bufferedImageWidth = bufferedImage.getWidth();
int bufferedImageHeight = bufferedImage.getHeight();
//对截图进行等比例缩放
int width=480;
int height=(int) (((double)width/bufferedImageWidth)*bufferedImageHeight);
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR);
image.getGraphics().drawImage(bufferedImage.getScaledInstance(width,height, Image.SCALE_SMOOTH),0,0,null);
ImageIO.write(image, "png", outPut);
}
fFmpegFrameGrabber.stop();
} catch (IOException e) {
e.printStackTrace();
}
}
TODO 将frame转换为bufferedImage对象
public static BufferedImage FrameToBufferedImage(Frame frame) {
//创建BufferedImage对象
Java2DFrameConverter converter = new Java2DFrameConverter();
BufferedImage bufferedImage = converter.getBufferedImage(frame);
return bufferedImage;
}
将视频每帧转成图片
public static void grabberVideoFramer(String videoFileName) {
//Frame对象
Frame frame = null;
//标识
int flag = 0;
*//*
获取视频文件
*//*
FFmpegFrameGrabber fFmpegFrameGrabber = new FFmpegFrameGrabber(videoFileName);
try {
fFmpegFrameGrabber.start();
/*
.getFrameRate()方法:获取视频文件信息,总帧数
*/
int ftp = fFmpegFrameGrabber.getLengthInFrames();
System.out.println("时长 " + ftp / fFmpegFrameGrabber.getFrameRate() / 60);
BufferedImage bImage = null;
while (flag <= ftp) {
//文件绝对路径+名字
String fileName = videoFramesPath + String.valueOf(flag) + ".jpg";
//文件储存对象
File outPut = new File(fileName);
//获取帧
frame = fFmpegFrameGrabber.grabImage();
if (frame != null) {
ImageIO.write(FrameToBufferedImage(frame), "jpg", outPut);
}
flag++;
}
fFmpegFrameGrabber.stop();
} catch (IOException E) {
}
}
参考:https://doc.xuehai.net/b9170c98c0b48bbaabe16154fed9dda2ddc25c0e8.html