最近做了一个功能,是对视频流持续抽帧保存起来,在其他业务中触发,然后将保存的帧生成视频储存, 于是做了一个抽帧线程, 一个recorder线程, 平时抽帧线程持续抽帧更新队列, 触发时,recorder线程处理视频生成 但是在测试中,生成视频出现问题,最后排查出这个问题,在这里记录一下
首先
FFmpegFrameGrabber的源码中可以看到 内部存在全局的frame, 每次grabFrame抽帧后,数据会处理到这个frame并返回 但是 当grabber再次执行 grabframe时,grabber的逻辑是,手动初始化frame,但是frame本身无变化 即:再次返回的frame地址不变,而上一次的frame已经被覆盖,如果使用队列等添加frame,则内部都是一个frame,属性为最后一次帧信息 关于这里,一开始我是使用 Java2DFrameConverter 对象,将frame转换为 bufferedImage对象储存到队列,结果发现情况没有变化,回查发现转化的bufferedIamge也是重复的, 查询Java2DFrameConverter 的源码,确认内部的也是复用,转换frame到image时,由于frame表层信息与之前一致,没有生成新的image,而是直接复用返回了