2010-02-02 12 views
5

Tengo un programa de interfaz gráfica de usuario Java swing que se muestra en cualquier lugar entre 1 y 25 fotogramas por segundo. Es solo una ventana y solo un panel al que hago todo el renderizado, p. no hay otros componentes Swing.¿Puedo hacer un video de una aplicación Java Swing en ejecución sobre la marcha?

Necesito poder producir videos de ejecuciones de prueba de mi programa mientras se ejecuta. El problema es que las herramientas de transmisión de pantalla normales (por ejemplo, las aplicaciones de terceros que inicio antes de ejecutar mi código) a menudo pierden algunos de mis marcos y necesito un video preciso.

Sé cómo usar la clase Robot para capturar capturas de pantalla de mi ventana Java, pero posiblemente no pueda guardarlas en el disco mientras ejecuto, esto ralentizará demasiado todo. ¿Hay alguna manera de usar la clase Robot (o tal vez algún otro código) para crear un video de mi ventana sobre la marcha, mientras ejecuto mi programa?

Gracias!

Respuesta

4

Puede usar el envoltorio ffmpeg en Java - Xuggler y la clase Java Robot incorporada. Aquí hay un código de muestra con Xuggler.

final Robot robot = new Robot(); 
final Toolkit toolkit = Toolkit.getDefaultToolkit(); 
final Rectangle screenBounds = new Rectangle(toolkit.getScreenSize()); 

// First, let's make a IMediaWriter to write the file. 
final IMediaWriter writer = ToolFactory.makeWriter("output.mp4"); 

// We tell it we're going to add one video stream, with id 0, 
// at position 0, and that it will have a fixed frame rate of 
// FRAME_RATE. 
writer.addVideoStream(0, 0, 
FRAME_RATE, 
screenBounds.width, screenBounds.height); 

// Now, we're going to loop 
long startTime = System.nanoTime(); 
for (int index = 0; index < SECONDS_TO_RUN_FOR*FRAME_RATE.getDouble(); index++) 
{ 
    // take the screen shot 
    BufferedImage screen = robot.createScreenCapture(screenBounds); 

    // convert to the right image type 
    BufferedImage bgrScreen = convertToType(screen, 
    BufferedImage.TYPE_3BYTE_BGR); 

    // encode the image to stream #0 
    writer.encodeVideo(0,bgrScreen, 
    System.nanoTime()-startTime, TimeUnit.NANOSECONDS); 
    System.out.println("encoded image: " +index); 

    // sleep for framerate milliseconds 
    Thread.sleep((long) (1000/FRAME_RATE.getDouble())); 
} 
// Finally we tell the writer to close and write the trailer if 
// needed 
writer.close(); 

Otra opción es Screentoaster sitio - pero estoy seguro de lo que tenga en cuenta la velocidad de fotogramas que proporcionan.

0

Si ejecuta su programa en Linux, puede aprovechar recordmydesktop. Es uno de los mejores programas de grabación que he usado con controles sobre la velocidad de fotogramas y otras cosas.

+0

Lo sentimos, se ejecuta en Windows - tampoco me gusta :) – Warlax

0

¿No puedes adaptar tu programa para volcar el contenido de tu ventana después de cada actualización junto con una marca de tiempo precisa? Luego publique estos en una película si lo necesita.

Eso le dará control total.

+0

Thorbjørn, gracias por la respuesta rápida. Ya estaba haciendo eso, pero guardar un archivo para cada fotograma es bastante lento. – Warlax

+0

Parece que JMF admite la codificación de varios formatos de video. Podría ser el camino a seguir para garantizar que tu video sea preciso. http://java.sun.com/javase/technologies/desktop/media/jmf/2.1.1/formats.html –

Cuestiones relacionadas