我正在用 Java 编写一个屏幕捕获模块,但在将屏幕截图写入磁盘时遇到严重的性能问题。我还可以做些什么?
-
23-08-2019 - |
题
我正在使用 Robot 类编写屏幕捕获模块。我每隔 x 毫秒截取应用程序的屏幕截图并将其写入磁盘。屏幕捕获完成后,我将使用 FFMPEG 将屏幕截图编译为视频。
然而,将图像写入磁盘的速度非常慢,并且使我的应用程序陷入停顿。我缺少什么?有没有更好的方法来编写一个简单的屏幕捕获模块?
编辑:我尝试了多种将图像写入磁盘的方法,但都很慢。由于其易用性,我一直坚持使用以下内容:
ImageIO.write(bufferedImage ,"jpg", file);
解决方案
或者编码图像到视频格式正确,当你捕捉图像,并避免编写大量的临时文件在所有。使用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将改进写入性能。
不隶属于 StackOverflow