Estou escrevendo um módulo de captura de tela em Java, mas eu estou tendo problemas de desempenho graves escrevendo screenshots para o disco. O que mais eu posso fazer?

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

Pergunta

Eu estou escrevendo um módulo de captura de tela usando a classe Robot. Eu estou tomando screenshots da aplicação a cada x milissegundos e gravá-los no disco. Após a captura do ecrã terminar, eu estou a compilar as imagens para vídeo com FFMPEG.

No entanto, gravação de imagens em disco é extremamente lento e mói a minha candidatura a um impasse. o que estou perdendo? Existe uma maneira melhor para escrever um módulo de captura de tela simples?

Edit: Eu tentei várias maneiras de escrever as imagens para o disco, e todos são muito lento. Eu fui furando com o seguinte, devido à sua facilidade de uso:

ImageIO.write(bufferedImage ,"jpg", file);
Foi útil?

Solução

ou codificar a imagem em formato de vídeo direito quando você capturar a imagem, e evitar escrever o grande arquivo temporário em tudo. código completo usando Xuggler pode ser encontrada aqui:

Xuggler Screen Capture demonstração do código

Outras dicas

Tente colocar a sua gravação em um novo segmento para que você não tem que esperar para o disco lento IO.

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

Apenas atente para problemas de concorrência.

A segunda solução (intensivo de memória) é para amortecer seus jpgs e mantê-los todos na memória e escrever apenas quando uma certa quantidade de tempo passou ou da saída do programa.

A imagem padrão tamponada é muito grande. Tente tê-lo como um formato menor e, em seguida, anotá-la.

Eu usei .png antes e é pequeno o suficiente.

Depois de um pouco mais de código e vai ver o que outra coisa pode estar errado na sua.

Editar

Eu uso este:

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

Criar uma nova imagem com o mesmo largura e altura , mas um diferente tipos de imagem .

Escrever a imagem em que a nova imagem e salvar a imagem nova para o disco.

Explorar os diferentes valores de tipo de imagem e ver o que é melhor para você. Claro que pode haver uma troca entre qualidade e velocidade. (Acho que no entanto o problema está em outro lugar, mas tente este primeiro)

Confira resposta 6 deste postagem . Isso implica que usando JAI irá melhorar o desempenho de gravação.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top