在ArrayList中存储数千个BufferedImages,而不会耗尽所有内存-Java



我正在尝试制作一个屏幕录制应用程序。我有一段代码,它使用java.awt.Robot.createScreenCapture进行屏幕截图,然后将输出存储在arraylist中。arraylist需要存储7500个图像。我需要能够非常快速地访问任何一个BufferedImages。我曾尝试将BufferedImages转换为byte[],然后存储它们,但将它们转换回缓冲区需要太长时间(约1秒)。有没有一种方法可以做到这一点,而不必添加命令行参数?

错误:Exception in thread "AWT-EventQueue-0" java.lang.OutOfMemoryError: Java heap space

代码:

static ArrayList < BufferedImage > bilist = new ArrayList < BufferedImage > ();
public static Timer recordingTimer = new Timer (40, new ActionListener () {
    public void actionPerformed ( ActionEvent e ) {
        try {
            BufferedImage bimage = robot.createScreenCapture(wholescreen);
            bilist.add(bimage);
            if ( bilist.size() > 7500 ) bilist.remove(7500);
        } catch ( Exception ex ) {
            ex.printStackTrace();
        }
    }
});

真正的解决方案:使用硬件加速视频编码器(如果你能负担得起CPU,也可以使用软件编码器)压缩帧

老答案:

我已经解决了我的问题!我所做的是将5分钟的录制时间更改为15秒,然后将BufferedImages的类型更改为type_BYTE_INDEXED,然后将图像尺寸减半,然后降低帧速率。将来,我可能会让这个程序与勒布朗克的系统一起工作(请看上面的评论)。

最新更新