我正在使用 Robot 类编写屏幕捕获模块。我每隔 x 毫秒截取一次应用程序的屏幕截图并将它们写入磁盘。屏幕截图完成后,我正在使用 FFMPEG 将屏幕截图编译为视频。
但是,将图像写入磁盘非常慢,并且会使我的应用程序停止运行。我错过了什么?有没有更好的方法来编写一个简单的屏幕捕获模块?
编辑:我尝试了几种将图像写入磁盘的方法,而且都很慢。由于它易于使用,我一直坚持使用以下内容:
ImageIO.write(bufferedImage ,"jpg", file);
我正在使用 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 将提高写入性能。