Java에서 화면 캡처 모듈을 작성하고 있지만 스크린 샷을 디스크에 작성하는 심각한 성능 문제가 있습니다. 또 무엇을 할 수 있습니까?

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

문제

로봇 클래스를 사용하여 화면 캡처 모듈을 작성하고 있습니다. x 밀리 초마다 응용 프로그램의 스크린 샷을 찍고 디스크에 작성합니다. 화면 캡처가 완료되면 FFMPEG를 사용하여 스크린 샷을 비디오로 컴파일하고 있습니다.

그러나 디스크에 이미지를 쓰는 것은 매우 느리고 응용 프로그램이 중단됩니다. 내가 무엇을 놓치고 있습니까? 간단한 화면 캡처 모듈을 작성하는 더 좋은 방법이 있습니까?

편집 : 이미지를 디스크에 작성하는 몇 가지 방법을 시도했는데 모두 매우 느립니다. 사용하기 쉽기 때문에 다음을 고수했습니다.

ImageIO.write(bufferedImage ,"jpg", file);
도움이 되었습니까?

해결책

또는 이미지를 캡처 할 때 이미지를 비디오 형식으로 인코딩하고 큰 임시 파일을 전혀 쓰지 마십시오. Xuggler를 사용한 전체 코드는 여기에서 찾을 수 있습니다.

Xuggler 화면 캡처 데모 코드

다른 팁

느린 디스크 IO를 기다릴 필요가 없도록 새 스레드에 쓰기를 시도하십시오.

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

동시성 문제를 조심하십시오.

두 번째 (메모리 집약적) 솔루션은 JPG를 버퍼링하고 메모리에 모두 유지하고 일정량의 시간이 지나거나 프로그램이 종료 될 때만 작성하는 것입니다.

기본 버퍼링 이미지는 상당히 큽니다. 더 작은 형식으로 사용해보십시오.

나는 전에 .png를 사용했고 충분히 작습니다.

조금 더 많은 코드를 게시하면 다른 것이 무엇인지 확인하십시오.

편집하다

나는 이것을 사용한다 :

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

동일하게 새 이미지를 만듭니다 너비 그리고 그러나 다른 이미지 유형.

새 이미지로 이미지를 쓰고 새 이미지를 디스크에 저장하십시오.

다른 이미지 유형 값을 탐색하고 자신에게 더 나은 것을 확인하십시오. 물론 품질과 속도 사이에 상충 관계가있을 수 있습니다. (그러나 당신의 문제는 다른 곳이라고 생각하지만 이것을 먼저 시도하십시오)

답장 6을 확인하십시오 전기. JAI를 사용하면 쓰기 성능을 향상시킬 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top