javacv将视频转图片
ffmpeg原生命令
bash
ffmpeg -re -i temp.mp4 -r 1 -f image2 image-%3d.jpeg
Java实现
FFmpegFrameRecorder 方式
java
public void convert2Image() {
avutil.av_log_set_level(avutil.AV_LOG_INFO);
FFmpegLogCallback.set();
int i = 0;
// 输入文件地址 可以用文件、输入流、rtsp等协议拉取流
try (FFmpegFrameGrabber grabber = new FFmpegFrameGrabber("D:\\Temp\\video\\tmp.mp4")) {
grabber.start();
// 获取视频帧率
double frameRate = grabber.getFrameRate();
System.out.println("frameRate = " + frameRate);
// 转化的视频文件地址
try (FFmpegFrameRecorder recorder = new FFmpegFrameRecorder("D:\\Temp\\video\\image\\image-%3d.jpeg",
grabber.getImageWidth(), grabber.getImageHeight())) {
recorder.setFormat("image2");
recorder.setFrameRate(grabber.getFrameRate());
recorder.start();
Frame frame;
while ((frame = grabber.grabImage()) != null) {
// 每十帧转换一次
if (i % 10 == 0) {
recorder.recordImage(frame.imageWidth, frame.imageHeight, frame.imageDepth, frame.imageChannels, frame.imageStride,
avutil.AV_PIX_FMT_NONE, frame.image);
}
i++;
}
}
} catch (Exception e) {
log.error(e.getMessage());
throw new RuntimeException(e);
}
}
流方式
java
public void convert2ImageGrabber() {
avutil.av_log_set_level(avutil.AV_LOG_INFO);
FFmpegLogCallback.set();
int i = 0;
try (FFmpegFrameGrabber grabber = new FFmpegFrameGrabber("D:\\Temp\\video\\tmp.mp4")) {
grabber.start();
// 获取视频帧率
double frameRate = grabber.getFrameRate();
System.out.println("frameRate = " + frameRate);
Frame frame;
while ((frame = grabber.grabImage()) != null) {
try (Java2DFrameConverter converter = new Java2DFrameConverter()) {
BufferedImage bufferedImage = converter.convert(frame);
String formatFile = String.format("D:\\Temp\\video\\convert\\image-%d.jpeg", i);
File file = new File(formatFile);
ImageIO.write(bufferedImage, "jpg", file);
}
i++;
}
System.out.println(i);
} catch (Exception e) {
log.error(e.getMessage());
throw new RuntimeException(e);
}
}
图片推送到远程
java
public void imageGrabberTest() {
avutil.av_log_set_level(avutil.AV_LOG_INFO);
FFmpegLogCallback.set();
int i = 0;
try (FFmpegFrameGrabber grabber = new FFmpegFrameGrabber("D:\\Temp\\video\\tmp.mp4")) {
grabber.start();
// 获取视频帧率
double frameRate = grabber.getFrameRate();
System.out.println("frameRate = " + frameRate);
// 远程地址
try (FFmpegFrameRecorder recorder = new FFmpegFrameRecorder("http://localhost:12321/video/upload/image-%d.jpeg",
grabber.getImageWidth(), grabber.getImageHeight())) {
recorder.setFormat("image2");
recorder.setFrameRate(grabber.getFrameRate());
//请求方法
recorder.setOption("method","POST");
recorder.start();
Frame frame;
while ((frame = grabber.grabImage()) != null) {
// 每十帧转换一次
if (i % 10 == 0) {
recorder.recordImage(frame.imageWidth, frame.imageHeight, frame.imageDepth, frame.imageChannels, frame.imageStride,
avutil.AV_PIX_FMT_NONE, frame.image);
}
i++;
}
}
} catch (Exception e) {
System.err.println(e.getMessage());
throw new RuntimeException(e);
}
}