我正在用 Java 编写一个屏幕捕获模块,但在将屏幕截图写入磁盘时遇到严重的性能问题。我还可以做些什么?

StackOverflow https://stackoverflow.com/questions/1087891

我正在使用 Robot 类编写屏幕捕获模块。我每隔 x 毫秒截取应用程序的屏幕截图并将其写入磁盘。屏幕捕获完成后,我将使用 FFMPEG 将屏幕截图编译为视频。

然而,将图像写入磁盘的速度非常慢,并且使我的应用程序陷入停顿。我缺少什么?有没有更好的方法来编写一个简单的屏幕捕获模块?

编辑:我尝试了多种将图像写入磁盘的方法,但都很慢。由于其易用性,我一直坚持使用以下内容:

ImageIO.write(bufferedImage ,"jpg", file);
有帮助吗?

解决方案

或者编码图像到视频格式正确,当你捕捉图像,并避免编写大量的临时文件在所有。使用Xuggler全码可以在这里找到:

Xuggler屏幕捕获演示代码

其他提示

尝试把你写到一个新的线程,所以你不必等待较慢的磁盘IO。

ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(10);
executor.schedule(new Runnable(){
    @Override
     public void run() {
            writeImageHere(bufferedImage, file);
     }                  
}

只要留意并发问题。

在第二(存储器密集型)溶液是缓冲您的JPG文件,并保持他们都在存储器中,只有当在一定的时间量已经过去或者在程序退出写。

默认缓冲图像相当大。尝试将其设置为较小的格式,然后将其写下来。

我以前用过 .png,它足够小。

发布更多代码,看看您的代码中可能还有什么问题。

编辑

我用这个:

        BufferedImage bufferedImage  = new BufferedImage(
                                              widthFromRobot, 
                                              heightFromRobot,
                                              BufferedImage.    TYPE_3BYTE_BGR );

        bufferedImage.getGraphics().drawImage( fromRobotScreenCapture, 0,0, null );

       // get a file name 
       ImageIO.write( bufferedImage, "png", someFile  );

使用相同的图像创建一个新图像 宽度高度 但不同的 图像类型.

将图像写入该新图像中,并将该新图像保存到磁盘。

探索不同的图像类型值,看看哪个更适合您。当然,质量和速度之间可能需要权衡。(我认为你的问题在其他地方,但首先尝试这个)

检查出这个张贴的答复6。它意味着使用JAI将改进写入性能。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top