目录
1、导入javacv依赖
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>javacv</artifactId>
</dependency>
2、Controller层
@PostMapping("/getPicture")
public R<List<PictureVo>> getPictureBase64(@RequestBody DeviceVo cameraRtspUrl) {
List<PictureVo> base64Image = algorithmService.getPictureBase64(cameraRtspUrl.getUrl());
return R.ok(null,base64Image);
}
传入摄像头rtsp地址
3、servic接口实现
@Override
public List<PictureVo> getPictureBase64(String cameraUrl) {
List<PictureVo> pictureList = new ArrayList<>();
FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(cameraUrl);
try {
grabber.start();
// 指定抽取关键帧
Frame frame = null;
while ((frame = grabber.grab()) != null) {
if (frame.image != null && frame.image.length > 0 && frame.keyFrame) {
Java2DFrameConverter converter = new Java2DFrameConverter();
BufferedImage bufferedImage = converter.getBufferedImage(frame);
// 获取图片宽度和高度
int width = bufferedImage.getWidth();
int height = bufferedImage.getHeight();
// 将 BufferedImage 转换为字节数组
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
ImageIO.write(bufferedImage, "jpg", byteArrayOutputStream);
byte[] imageBytes = byteArrayOutputStream.toByteArray();
// 将字节数组转换为 base64
String base64Image = Base64.getEncoder().encodeToString(imageBytes);
PictureVo pictureVo = new PictureVo();
pictureVo.setImageWidth(width);
pictureVo.setImageHeight(height);
pictureVo.setResize(false);
pictureVo.setBase64(base64Image);
pictureList.add(pictureVo);
// 仅获取一个关键帧后就退出循环
break;
}
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
grabber.stop();
} catch (FrameGrabber.Exception e) {
e.printStackTrace();
}
}
return pictureList;
}
这样就能实现从视频流抽取一帧关键帧并编码成base64格式