J'écris un module de capture d'écran en Java, mais je vais avoir de sérieux problèmes de performance d'écriture des captures d'écran sur le disque. Que puis-je faire d'autre?

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

Question

J'écris un module de capture d'écran en utilisant la classe Robot. Je vais prendre des captures d'écran de l'application toutes les x millisecondes et leur écriture sur le disque. Après la capture d'écran est terminée, je compilant les captures d'écran à la vidéo avec FFMPEG.

Cependant, l'écriture des images sur le disque est extrêmement lent et broie ma demande à l'arrêt. Qu'est-ce que je rate? Y at-il une meilleure façon d'écrire un simple module de capture d'écran?

Edit: J'ai essayé plusieurs façons d'écrire les images sur le disque, et tous sont très lents. J'ai été coller avec ce qui suit, en raison de sa facilité d'utilisation:

ImageIO.write(bufferedImage ,"jpg", file);
Était-ce utile?

La solution

Ou encoder l'image en format vidéo lorsque vous capturez l'image, et évitez d'écrire le grand fichier temporaire du tout. code complet en utilisant Xuggler se trouve ici:

Xuggler Screen Capture code Démo

Autres conseils

Essayez de mettre votre écriture dans un nouveau fil de sorte que vous ne devez pas attendre disque lent IO.

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

Il suffit de regarder pour les questions de concurrence.

La seconde (mémoire intensive) solution est de tamponner vos jpgs et les garder tous en mémoire et écrire seulement quand un certain laps de temps est écoulé ou que votre programme.

La valeur par défaut l'image en mémoire tampon est assez grand. Essayez d'avoir comme un format plus petit, puis écrire.

Je l'ai utilisé .png avant et il est assez petit.

Poster un peu plus de code et vous verrez ce autre chose peut-être tort dans le vôtre.

EDIT

J'utilise ceci:

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

Créer une nouvelle image avec la même largeur et hauteur , mais un autre types d'images .

Ecrire l'image dans cette nouvelle image et enregistrer cette nouvelle image sur le disque.

Découvrez les différentes valeurs de type d'image et de voir ce qui est mieux pour vous. Bien sûr, il pourrait y avoir un compromis entre la qualité et la vitesse. (Je pense cependant que votre problème est ailleurs, mais essayez cette première)

Voir la réponse 6 de cette affichage . Cela implique que l'utilisation améliorera les performances JAI d'écriture.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top