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?
-
23-08-2019 - |
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);
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:
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.