2009-07-06 9 views
2

Ich schreibe ein Bildschirm-Capture-Modul mit der Robot-Klasse. Ich mache alle x Millisekunden Screenshots von der Anwendung und schreibe sie auf die Festplatte. Nachdem die Bildschirmaufnahme abgeschlossen ist, kompiliere ich die Screenshots zu Video mit FFMPEG.Ich schreibe ein Screen Capture-Modul in Java, aber ich habe ernsthafte Probleme mit der Leistung beim Schreiben von Screenshots auf die Festplatte. Was kann ich sonst noch tun?

Allerdings ist das Schreiben von Bildern auf die Festplatte extrem langsam und macht meine Anwendung zum Stillstand. Was vermisse ich? Gibt es eine bessere Möglichkeit, ein einfaches Bildschirm-Capture-Modul zu schreiben?

Bearbeiten: Ich habe mehrere Möglichkeiten zum Schreiben der Bilder auf die Festplatte versucht, und alle sind sehr langsam. Ich habe mit der folgenden worden kleben, aufgrund seiner Benutzerfreundlichkeit:

ImageIO.write(bufferedImage ,"jpg", file); 
+2

Wir können nicht einfach sagen, was macht es langsam, ohne irgendeinen Code zu sehen. Bitte posten Sie die Methode, die das Image auf Festplatte speichert. –

+0

Ist Ihre Anwendung Multithread? – diciu

Antwort

4

Oder kodieren Sie das Bild direkt in das Videoformat, wenn Sie das Bild erfassen, und vermeiden Sie es, die große temporäre Datei überhaupt zu schreiben. Vollständiger Code Xuggler verwendet, kann hier gefunden werden:

Xuggler Screen Capture Demo Code

3

Versuchen Sie schreiben in einem neuen Thread setzen, damit Sie nicht für langsame Festplatte IO warten müssen.

ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(10); 
executor.schedule(new Runnable(){ 
    @Override 
    public void run() { 
      writeImageHere(bufferedImage, file); 
    }     
} 

Achten Sie nur auf Nebenläufigkeitsprobleme.

Die zweite (speicherintensive) Lösung besteht darin, Ihre jpgs zu puffern und sie alle im Speicher zu behalten und nur zu schreiben, wenn eine bestimmte Zeit vergangen ist oder Ihr Programm beendet wird.

0

Das gepufferte Standardbild ist ziemlich groß. Versuchen Sie, es als ein kleineres Format zu haben und schreiben Sie es dann auf.

Ich habe .png vor und es ist klein genug.

Post ein bisschen mehr Code und wird sehen, was andere Sache in Ihrem möglicherweise falsch ist.

EDIT

Ich benutze diese:

 BufferedImage bufferedImage = new BufferedImage(
               widthFromRobot, 
               heightFromRobot, 
               BufferedImage. TYPE_3BYTE_BGR); 

     bufferedImage.getGraphics().drawImage(fromRobotScreenCapture, 0,0, null); 

     // get a file name 
     ImageIO.write(bufferedImage, "png", someFile ); 

mit derselben Breite und Höhe ein neues Bild erstellen, aber eine andere image types.

Schreiben Sie das Bild in das neue Bild und speichern Sie das neue Bild auf der Festplatte.

Erkunden Sie die verschiedenen Bildtyp-Werte und sehen Sie, welche für Sie besser ist. Natürlich könnte es einen Kompromiss zwischen Qualität und Geschwindigkeit geben. (Ich denke jedoch, Ihr Problem ist woanders, aber versuchen Sie dies zuerst)

0

Check out Antwort 6 dieser posting. Es bedeutet, dass die Verwendung von JAI die Schreibleistung verbessert.