Estoy escribiendo un módulo de captura de pantalla en Java, pero estoy teniendo serios problemas de rendimiento de escritura capturas de pantalla en el disco. ¿Que más puedo hacer?
-
23-08-2019 - |
Pregunta
Estoy escribiendo un módulo de captura de pantalla utilizando la clase del robot. Estoy tomando capturas de pantalla de la aplicación cada x milisegundos y la escritura en el disco. Una vez finalizada la captura de pantalla, Estoy compilando las capturas de pantalla para video con FFMPEG.
Sin embargo, escribir imágenes en el disco es extremadamente lento y muele mi solicitud a un alto. ¿Qué me estoy perdiendo? ¿Hay una mejor manera de escribir un módulo de captura de pantalla sencilla?
Edit: He intentado varias formas de escribir las imágenes en el disco, y todos son muy lentos. He estado pegando con la siguiente, debido a su facilidad de uso:
ImageIO.write(bufferedImage ,"jpg", file);
Solución
O codificar la imagen en formato de vídeo correcto cuando se captura la imagen, y evitar escribir el archivo temporal en absoluto. código completo usando Xuggler se puede encontrar aquí:
Otros consejos
Trate de poner su escritura en un nuevo hilo por lo que no tiene que esperar a que el disco lenta IO.
ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(10);
executor.schedule(new Runnable(){
@Override
public void run() {
writeImageHere(bufferedImage, file);
}
}
Solo observar a problemas de concurrencia.
La segunda solución (memoria intensiva) es para amortiguar sus archivos JPG y mantenerlos a todos en la memoria y escribir sólo cuando una cierta cantidad de tiempo ha pasado o las salidas del programa.
La imagen predeterminada tamponada es bastante grande. Trate de tener como un formato más pequeño y luego escribirlo.
He usado .png antes y es lo suficientemente pequeño.
Publicación de un poco más de código y veremos qué otra cosa puede ser malo en la suya.
Editar
Yo uso este:
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 );
Crea una nueva imagen con el mismo anchura y altura pero un diferente tipos de imagen .
Escribir la imagen en esa imagen nueva, y excepto que la nueva imagen en el disco.
Explora los diferentes valores de tipo de imagen y ver cuál es mejor para usted. Por supuesto que podría haber un equilibrio entre calidad y velocidad. (Creo que sin embargo el problema está en otra parte, pero trato de esta primera)
Salida respuesta 6 de este publicar . Esto implica que el uso de JAI mejorará el rendimiento de escritura.