Como obter mais de 30FPS usando Java em um programa de captura de canvas?

Atualmente estou usando as classs de robô em Java para gravar a canvas. No entanto, não atinge o mínimo de 30 frameworks por segundo. Eu não estou recriando objects, e estou sendo tão eficiente quanto eu posso, mas eu apenas a média em torno de 15 frameworks por segundo. O robô simplesmente não está cortando.

O que posso usar para capturar a canvas? Eu tentei Xuggle, mas eu não consigo conseguir isso para capturar rápido o suficiente também.

Para sistemas operacionais que seguem o padrão X11 (Linux, FreeBSD, Solaris, etc.), podemos fazer isso via JavaCV e FFmpeg :

 import com.googlecode.javacv.*; public class ScreenGrabber { public static void main(String[] args) throws Exception { int x = 0, y = 0, w = 1024, h = 768; // specify the region of screen to grab FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(":0.0+" + x + "," + y); grabber.setFormat("x11grab"); grabber.setImageWidth(w); grabber.setImageHeight(h); grabber.start(); CanvasFrame frame = new CanvasFrame("Screen Capture"); while (frame.isVisible()) { frame.showImage(grabber.grab()); } frame.dispose(); grabber.stop(); } } 

Não sei sobre o Windows ou o Mac OS X, mas suspeito que precisaríamos acessar APIs nativas diretamente. No entanto, o JavaCPP poderia ajudar com isso.

Baseando-se na resposta do @ Samuel, de acordo com a documentação oficial do ffmpeg você deve ser capaz de manter uma plataforma cruzada se você fizer o parâmetro file passado para o FFmpegFrameGrabber (que é realmente um parâmetro de input que é passado como a opção -i para ffmpeg ) aderir aos diferentes formatos que cada device espera .

ie:

para Windows: dshow espera -i video="screen-capture-recorder"

para OSX: avfoundation espera -i ":"

e para o Linux: x11grab espera -i :+, .

Portanto, apenas passar esses valores (argumentos para -i ) para o construtor e definir o formato (via setFormat ) deve fazer o seguinte:

Exemplos:

para Windows:

 new FFmpegFrameGrabber("video=\"screen-capture-recorder\"") .setFormat("dshow"); 

para OSX:

 new FFmpegFrameGrabber("\":\"") .setFormat("avfoundation"); 

para Linux:

 new FFmpegFrameGrabber(":+,") .setFormat("x11grab"); 

PS: Não testei isso totalmente, então não tenho certeza se as citações são realmente necessárias.