2010-02-02 7 views
5

Ho un programma GUI Java swing che esegue il rendering da 1 a 25 fotogrammi al secondo. È solo una finestra e solo un pannello a cui eseguo tutto il rendering, ad es. nessun altro componente Swing.Posso realizzare al volo un video di un'applicazione Java Swing in esecuzione?

Devo essere in grado di produrre video di test run del mio programma mentre viene eseguito. Il problema è che i normali strumenti di screen casting (ad esempio app di terze parti che avvio prima di eseguire il mio codice) spesso mancano alcuni dei miei frame e ho bisogno di un video accurato.

So come usare la classe Robot per catturare schermate della mia finestra Java, ma non posso salvarli su disco mentre corro, rallenterà troppo tutto. C'è un modo per me di usare la classe Robot (o forse qualche altra parte di codice) per creare un video della mia finestra al volo, mentre eseguo il mio programma?

Grazie!

risposta

4

È possibile utilizzare wrapper ffmpeg in Java - Xuggler e classe Java Robot integrata. Ecco un codice di esempio 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(); 

Un'altra opzione è Screentoaster sito - ma sono sicuro che cosa si noti il ​​frame rate che forniscono.

0

Se si esegue il programma in Linux, è possibile utilizzare recordmydesktop. È uno dei migliori programmi di registrazione che ho usato con i controlli sul framerate e quant'altro.

+0

Siamo spiacenti, in esecuzione in Windows - non mi piace molto :) – Warlax

0

Non è possibile adattare il programma per scaricare il contenuto della finestra dopo ogni aggiornamento insieme a un timestamp accurato? Quindi postali in un film se ne hai bisogno.

Questo vi darà il pieno controllo.

+0

Thorbjørn, grazie per la rapida risposta. Lo stavo già facendo, ma il salvataggio di un file per ogni frame è piuttosto lento. – Warlax

+0

Sembra che JMF supporti la codifica di diversi formati video. Potrebbe essere la strada da percorrere per garantire che il tuo video sia accurato. http://java.sun.com/javase/technologies/desktop/media/jmf/2.1.1/formats.html –