2

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

但是,将图像写入磁盘非常慢,并且会使我的应用程序停止运行。我错过了什么?有没有更好的方法来编写一个简单的屏幕捕获模块?

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

ImageIO.write(bufferedImage ,"jpg", file);
4

4 回答 4

4

或者在您捕获图像时立即将图像编码为视频格式,并且完全避免写入大型临时文件。使用 Xuggler 的完整代码可以在这里找到:

Xuggler 屏幕捕获演示代码

于 2009-11-06T05:55:59.610 回答
3

尝试将您的写入放入一个新线程,这样您就不必等待缓慢的磁盘 IO。

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

只需注意并发问题。

第二种(内存密集型)解决方案是缓冲您的 jpg 文件并将它们全部保存在内存中,并且仅在经过一定时间或程序退出时才写入。

于 2009-07-06T16:43:21.230 回答
0

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

我以前用过.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  );

创建具有相同宽度高度图像类型不同的新图像。

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

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

于 2009-07-06T16:47:17.307 回答
0

查看此帖子的回复 6 。这意味着使用 JAI 将提高写入性能。

于 2009-07-06T19:58:59.417 回答