2012-01-08 7 views
2

私は、設定された間隔で画面をキャプチャするためのプログラムを書いていたと私はテストを始めたとき、私はそれが映像をキャプチャーを開始した後、私はほとんどすぐのOutOfMemoryExceptionを得ることがわかりました。私はもっ​​と多くの記憶を割り当てようとしました - 私はそれを256m与えましたが、それはほとんど役に立たなかった。例外をスローして再びクラッシュする前に、最後に2〜3秒待っていただけです。のJava:ロボット#1 createScreenCaptureを使用してのOutOfMemory(長方形)

私は、createScreenCapture(...)メソッドが大量のメモリを使用することを理解していますが、同じメソッドを使用して長時間記録できるサンプルプログラムを見てきました。

編集:私はあなたの男アドバイスのいくつかを使用してきましたし、今私はOutOfMemoryExceptionsを得ることはありません!やめ!私は写真をハードディスクに保存するというルートをとった。しかし、実際にアーカイブファイルに書き込むにはかなりの時間がかかります。アーカイブファイルに63フレームを書き込むのに2分ほどかかります!

私はI/Oの一部を書き換えてるので、私は任意のコードを提供することはできません。 ^状況の改善に取り組んでいます。

答えて

1

私は、同じ方法で長時間録音できるサンプルプログラムを見てきました。

イメージをディスクにシリアル化します(個別のファイルとして、または1つのZipに)。


私はハードドライブに保存するために使用すべき特定の手順がありますか?私はint []配列にイメージを変換し、それを格納することを考えていました。なぜなら、配列は直列化可能であるからです。

追跡可能な戦略の数があります。

  • 非損失性(&符号化しやすい)画像フォーマットに画像を変換し、画像のいずれかの保存:における個別のエントリとしてディスク上の別のファイルに
    1. 、または..
    2. (圧縮されていない)Zipアーカイブ。 Zipを使用することで、「何千もの」ファイルを保存することで報告された初期の問題を回避することができます。速度を考慮して非圧縮にしてください(ほとんどのメディアフォーマットではZipがほとんど機能しません)。
  • 私はかつてあなたが提案のような多くのをやったこと(今それを見つけることができません)(AFAIR「)Screenies」またはそのような何かと呼ばれていましたユーズネット上のコードを見ました。それは生の情報を(エンコードなしで)ディスクに保存しました。私はコードを試して、PNGに画像をエンコードするよりも良いパフォーマンスを得ることができなかった&ディスクに画像をシリアライズする。いくつかのテストを実行して、どのアプローチがより早く出てくるかを確認することができます。
+0

イメージをメモリにコミットするのではなく、プログラムの存続期間中にハードドライブに保存しますか? –

+0

* "それをハードドライブに保存しますか?*はい。 –

+0

さて、私はそれを調べます。それをハードドライブに保存するために使用すべき特定の手順はありますか?私はint []配列にイメージを変換し、それを格納することを考えていました。なぜなら、配列は直列化可能であるからです。 –

0

90ミリ秒は、次の画像をスナップする前のかなり短いスリープインターバルです。あなたはおそらくあまりにも多くを取っています。 collectionの大きさに制限を設けないでください。

+0

私はかなり速度を落とすことを試みました、それはほとんど役に立たなかった。それが私にとって驚くべき理由です。 –

0

のThread.sleep(90)は、90ミリ秒のためのあなたのプログラムの一時停止を行います。だから2〜3秒で、それは約200〜300の写真を取る、これはかなり多くなります。

+0

通常は、ユーザーが1秒あたりの画像の数を選択できる設定があります。もともと、私は毎秒30フレーム(FPS)でテストし、数秒でメモリ不足になった後、毎秒5フレームにして、おそらく1,2秒後にクラッシュしました。 –

1

どのように画像を保存していますか?画面の大きさはどれくらいですか?私はBufferedImageでサポートされているすべてのColorModelsに精通していませんが、最悪の場合、1900 x 1200のフルRGB画像は1900 * 1200 * 24ビット、つまり約7 MBになります。 5 FPSでも、それは35 MB /秒で、他のすべてのメモリ使用を無視して、10秒未満で256 MBをオーバーフローします。

あなたは確かに、代わりにディスクに書き込むか、その場でデータを圧縮する必要がありますが、メモリの限界に容易にぶつかるでしょう。

+0

イメージを整数配列に変換してハードドライブに書き込んでも、すぐに限界に達しますか? –

+0

後で一緒に何をしていますか?私はあなたが何かを再生したいと思いますか?イメージファイルをコレクションに保管するのではなく、ディスクに書き込むと、ディスクサイズに拘束されます(35 MB /秒は約30秒に1GBになります)ので、4時間の記録時間を必要とします500 GBのドライブ。あなたはおそらくそれらを圧縮することができますあなたがビデオにそれらを回している場合、それを行うだけです。あなたが参照しているロボットがXuggleである場合は、http://wiki.xuggle.com/MediaTool_Introduction#How_To_Take_Snapshots_Of_Your_Desktopをご覧ください。 – James

0

イメージ(領域)のメモリをコレクションに追加しています。

 BufferedImage image = robot.createScreenCapture(area); //OutOfMemory on this line. 
     collection.addFirst(image); 

あなたが期待していたことは、追加するほど大きくなります。

ファイル/データベースに書き込んだり、古い画像バッファを削除して、最終画像を20枚保存するようにしてください。

90ミリ秒が少し短いです。イメージを比較しようとしている場合は、コレクションに追加する前に、前のイメージと現在のイメージを比較してみてください。

ウェブカメラからトラッキングタイプのソリューションをお探しの場合は、そのツールとコンセプトの全く新しいセットをお知らせください。

+0

現時点では、ハードドライブに保存する必要があります。 –

+0

達成しようとしていることを教えてください。猫をスキンする多くの方法があります – Araejay

+0

基本的にビデオフォーマットで画面をキャプチャするツールを作成します。 JMFを使用してたくさんの写真を撮り、ビデオに変換します。 –

関連する問題