Hace muchos años me tope con el reto de hacer un capturador de pantalla con java, es decir tomar los famosos “panallazos” con intervalos de tiempo, sin intervalos y finalmente con intervalos bajos de tiempo para luego “unir” toda la secuencia en un vídeo.
Encontré un pro y un contra con esto, aquí les va para su consideración:
- PRO: Es ridículamente fácil de hacer 🙂
- CONTRA: Es bastante lento en performance 🙁 [no lo recomiendo si lo que quieren hacer es un live stream]
bien el concepto es bastante simple, y partimos con la idea de una clase en java exclusivamente para capturar la pantalla:
Esto es fácil si nos ayudamos con el API que ofrece java.awt.Robot
import java.awt.AWTException; import java.awt.Robot; import java.awt.Rectangle; import java.awt.Toolkit; import java.awt.image.BufferedImage; import java.io.*; import javax.imageio.ImageIO; class PantallazoFactory { public static void capturarPantalla(String Nombre) throws AWTException, IOException { BufferedImage captura = new Robot().createScreenCapture( new Rectangle(Toolkit.getDefaultToolkit().getScreenSize()) ); // Guardar Como JPEG File file = new File(Nombre + ".jpg"); ImageIO.write(captura, "jpg", file); } }
Teniendo esto como punto de partida podemos crear un thread que tome un pantallazo cada cierto intervalo de tiempo durante un tiempo determinado.
boolean capturando = true; int cuenta = 0; //A mi me gusta por compacto, iniciar los threads de manera anonima :) Thread t = new Thread() { public void run() { while(capturando){ PantallazoFactory.capturarPantalla(String.valueOf(cuenta)); Thread.Sleep(100); //el intervalo que quieran en milisegundos } } }; t.start();
y ahí tienen, el toque final de mi aplicación era crear un vídeo a partir de las capturas, esto lo logre con una herramienta externa llamada ffmpeg si usan linux se puede instalar desde una terminal, y si usan windows hay que referenciar un ejecutable, pero es tan fácil como el siguiente comando:
ffmpeg -i %03d.jpg -sameq -r 25 pelicula.mp4
la parte que dice %03d.jpg indica que el nombre del archivo es un dígito de hasta 3 números con la posibilidad de ceros al inicio, y así toma la secuencia según la numeración de los archivos. Para ejecutar esto en java es tan fácil como esto:
Process p = Runtime.getRuntime().exec("ffmpeg -i %03d.jpg -sameq -r 25 pelicula.mp4'");
Claro que ustedes podrían verse en la necesidad de incluir el path completo a “pelicula.mp4” (o como quieran que se llame el vídeo) y el path completo a ffmpeg (.exe para usuarios de widnogs). Pero eso ya queda a discreción de cada quien.
Si quieren conseguir FFMPEG sin salir de mi blog aqui los links de descarga 🙂
FFMPEG para linux (o apt-get install ffmpeg, o yum install ffmpeg)
bueno espero que esto ilumine a alguien! yo pase varias horas investigando.
Saludos.-
hola muy buen post disculpa podrías pasar los archivos se agredeceria arto 🙂