用javacv+ffmpeg从视频流抽取关键帧并编码成base64

文章介绍了如何在Java应用中利用javacv库从RTSP摄像头流中抓取关键帧,将其转换为Base64格式,以供Controller层处理和返回给前端。重点展示了Controller层的接口实现和Servic接口中的详细操作过程。
摘要由CSDN通过智能技术生成

目录

1、导入javacv依赖

2、Controller层

3、servic接口实现


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格式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值