2009-07-06 1 views
2

Robotクラスを使用してスクリーンキャプチャモジュールを作成しています。私はxミリ秒ごとにアプリケーションのスクリーンショットを撮り、ディスクに書き出します。画面キャプチャが終了したら、私はFFMPEGでスクリーンショットをビデオにコンパイルしています。私はJavaでスクリーンキャプチャモジュールを作成していますが、スクリーンショットをディスクに書き込む際に重大なパフォーマンス上の問題があります。他に何ができますか?

しかし、ディスクに画像を書き込むことは非常に遅く、アプリケーションを停止させる原因となります。私は何が欠けていますか?シンプルなスクリーンキャプチャモジュールを書く良い方法はありますか?

編集:画像をディスクに書き込むいくつかの方法を試しましたが、すべてが非常に遅いです。私が原因その使いやすさに、次のようにこだわってきた:あなたは遅いディスクIOを待つ必要はありませんので、

ImageIO.write(bufferedImage ,"jpg", file); 
+2

我々は簡単にそれが遅くなっているもの言うことができないいくつかのコードを見ず。イメージをディスクに保存する方法を投稿してください。 –

+0

アプリケーションはマルチスレッドですか? – diciu

答えて

4

イメージをキャプチャするときにイメージをビデオ形式にエンコードし、大きな一時ファイルをまったく書き込まないでください。 Xugglerを使用して完全なコードはここで見つけることができます:

Xuggler Screen Capture Demo Code

3

は、新しいスレッドにあなたのライトを入れてみてください。

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

並行性の問題を監視してください。

2番目の(メモリを大量に消費する)ソリューションは、jpgをバッファに入れてメモリに保存し、一定時間が経過するかプログラムが終了したときにのみ書き込みます。

0

デフォルトのバッファリングされたイメージはかなり大きいです。それをより小さなフォーマットとしてお試しください。

私は以前に.pngを使用していましたが、それは十分に小さいです。

もう少しコードを投稿すれば、あなたの中で他に何が間違っているのかがわかります。私はこれを使用

EDIT

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

同じ高さで新しいイメージが異なるimage typesを作成します。

イメージを新しいイメージに書き込み、その新しいイメージをディスクに保存します。

さまざまな画像タイプの値を調べ、どちらが良いかを確認します。もちろん、品質とスピードの間にはトレードオフがあります。 (あなたの問題はどこか別のものだと思いますが、まずこれを試してみてください)

0

このpostingをチェックしてください。 JAIを使用すると、書き込みパフォーマンスが向上することを意味します。

関連する問題