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?

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

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);
¿Fue útil?

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í:

Xuggler de captura de pantalla de demostración Código

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top