关于javacv,grabber抽帧的frame对象复用问题

文章讲述了作者在开发过程中遇到的问题,即FFmpegFrameGrabber在连续抓取帧时,由于内存复用导致帧信息被覆盖,进而影响视频生成。作者还提到使用Java2DFrameConverter进行转换时也遇到相同问题,因为两者都基于帧的表层信息复用。
摘要由CSDN通过智能技术生成

最近做了一个功能,是对视频流持续抽帧保存起来,在其他业务中触发,然后将保存的帧生成视频储存, 于是做了一个抽帧线程,  一个recorder线程,  平时抽帧线程持续抽帧更新队列,   触发时,recorder线程处理视频生成   但是在测试中,生成视频出现问题,最后排查出这个问题,在这里记录一下
首先

FFmpegFrameGrabber的源码中可以看到  内部存在全局的frame,  每次grabFrame抽帧后,数据会处理到这个frame并返回

但是 当grabber再次执行 grabframe时,grabber的逻辑是,手动初始化frame,但是frame本身无变化
即:再次返回的frame地址不变,而上一次的frame已经被覆盖,如果使用队列等添加frame,则内部都是一个frame,属性为最后一次帧信息

关于这里,一开始我是使用 Java2DFrameConverter 对象,将frame转换为 bufferedImage对象储存到队列,结果发现情况没有变化,回查发现转化的bufferedIamge也是重复的, 查询Java2DFrameConverter 的源码,确认内部的也是复用,转换frame到image时,由于frame表层信息与之前一致,没有生成新的image,而是直接复用返回了


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值