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 windows

FFMPEG para linux (o apt-get install ffmpeg, o yum install ffmpeg)

FFMPEG para OSx

bueno espero que esto ilumine a alguien! yo pase varias horas investigando.

 

Saludos.-

Categorized in: