You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

提取MP4帧至BufferedImage列表后元素全部重复的问题

问题原因

你遇到的问题核心在于Java2DFrameConverter的convert(Frame)方法默认复用同一个BufferedImage实例。每次调用convert时,它并不会生成新的BufferedImage对象,只是把新帧的像素数据覆盖到已存在的对象中。你往列表里添加的都是这个对象的引用,循环结束后所有列表元素指向的都是最后一次更新的图像数据,因此看起来完全一致。

解决方案

每次转换得到BufferedImage后,创建一个独立的副本再添加到列表,确保每个元素都是不同的对象。可以通过创建新的BufferedImage并绘制原图像的方式实现深拷贝。

修改后的代码
private List<BufferedImage> getVideoFrames() {
    List<BufferedImage> frames = new ArrayList<>();
    try (Java2DFrameConverter frameConverter = new Java2DFrameConverter()) {
        int pendingFrame = 0;
        int parsedFrame = 0;
        int skipFrames = (int) frameGrabber.getFrameRate() / 15;

        while (parsedFrame < OUTPUT_IMAGE_FRAME_QUANTITY) {
            Frame frame = frameGrabber.grabFrame(false, true, true, false, false);
            if (pendingFrame % skipFrames == 0) {
                BufferedImage originalFrame = frameConverter.convert(frame);
                // 创建独立的图像副本,避免引用复用
                BufferedImage frameCopy = new BufferedImage(
                        originalFrame.getWidth(),
                        originalFrame.getHeight(),
                        originalFrame.getType()
                );
                Graphics2D g2d = frameCopy.createGraphics();
                g2d.drawImage(originalFrame, 0, 0, null);
                g2d.dispose(); // 释放图形资源
                frames.add(frameCopy);
                parsedFrame++;
            }
            pendingFrame++;
        }

        frameGrabber.stop();
    } catch (FFmpegFrameGrabber.Exception e) {
        logger.error(e.getMessage());
    }

    return frames;
}

内容的提问来源于stack exchange,提问作者wazzupek01

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 21:39:58