Ich bin ein Screen-Capture-Modul in Java zu schreiben, aber ich habe ernsthafte Performance-Probleme Screenshots auf der Festplatte zu schreiben. Was kann ich sonst noch tun?

StackOverflow https://stackoverflow.com/questions/1087891

Frage

Ich schreibe ein Screen-Capture-Modul der Robot-Klasse. Ich nehme Screenshots der Anwendung alle x Millisekunden und sie auf die Festplatte zu schreiben. Nach Screen-Capture fertig ist, werde ich die Screenshots, um Video mit ffmpeg kompilieren.

Allerdings Bilder auf der Festplatte zu schreiben ist extrem langsam und schleift meine Anwendung zum Stillstand. Was vermisse ich? Gibt es einen besseren Weg, um eine einfache Screen-Capture-Modul zu schreiben?

Edit: Ich habe versucht, verschiedene Möglichkeiten, die Bilder auf der Festplatte zu schreiben, und alle sind sehr langsam. Ich habe mit dem folgenden worden kleben, aufgrund seiner Benutzerfreundlichkeit:

ImageIO.write(bufferedImage ,"jpg", file);
War es hilfreich?

Lösung

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

Xuggler Screen Capture Demo-Code

Andere Tipps

Versuchen Sie Ihr Schreiben in einen 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);
     }                  
}

Just watch out für Concurrency Probleme.

Der zweite (speicherintensive) Lösung ist Ihre JPGs zu puffern und sie alle in Erinnerung behalten und nur schreiben, wenn eine gewisse Zeit hat Ihr Programm beendet erfolgreich war oder.

Das Standard-gepufferte Bild ist ziemlich groß. Versuchen Sie es als ein kleineres Format aufweist und dann aufschreiben.

Ich habe vor verwendet .png und es ist klein genug.

ein bisschen mehr Code veröffentlichen und werden sehen, was andere, was in Ihnen falsch sein kann.

Bearbeiten

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  );
Erstellen

ein neues Bild mit der gleichen Breite und Höhe aber ein anderer Bildtypen .

Schreiben Sie das Bild in diesem neuen Bild, und speichern Sie diese neue Bild auf der Festplatte.

Entdecken Sie die verschiedenen Bildtyp Werte und sehen, welche für Sie besser ist. Natürlich könnte es ein Kompromiss zwischen Qualität und Geschwindigkeit. (Ich glaube, aber Ihr Problem woanders ist, sondern versuchen, diese zuerst)

Sehen Sie sich die Antwort 6 dieses Entsendung . Es impliziert, dass JAI verwendet, wird die Schreibleistung verbessern.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top