現在、Java の Robot クラスを使用して画面を記録しています。ただし、最低 30 フレーム/秒には達しません。私はオブジェクトを再作成しておらず、できる限り効率的にしていますが、平均して 1 秒あたり約 15 フレームしかありません。ロボットは単にそれをカットしていません。
画面をキャプチャするには何を使用できますか? Xuggle を試してみましたが、十分な速さでキャプチャすることもできないようです。
X11 標準 (Linux、FreeBSD、Solaris など) に準拠するオペレーティング システムでは、JavaCVおよびFFmpegを介して次のように実行できます。
import com.googlecode.javacv.*;
public class ScreenGrabber {
public static void main(String[] args) throws Exception {
int x = 0, y = 0, w = 1024, h = 768; // specify the region of screen to grab
FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(":0.0+" + x + "," + y);
grabber.setFormat("x11grab");
grabber.setImageWidth(w);
grabber.setImageHeight(h);
grabber.start();
CanvasFrame frame = new CanvasFrame("Screen Capture");
while (frame.isVisible()) {
frame.showImage(grabber.grab());
}
frame.dispose();
grabber.stop();
}
}
Windows や Mac OS X についてはわかりませんが、ネイティブ API に直接アクセスする必要があると思います。それにもかかわらず、JavaCPPはそれを助けることができます。
@Samuel の回答に基づいてビルドします。公式のffmpeg ドキュメントfile
によると、渡されたパラメーターFFmpegFrameGrabber
(実際にはffmpeg のオプションinput
として渡されるパラメーター) を異なるものに準拠させると、プラットフォームをかなりクロス プラットフォームに保つことができるはずです。それぞれが期待するフォーマット。-i
device
すなわち:
Windows の場合:dshow
予想-i video="screen-capture-recorder"
OSX の場合:avfoundation
予想-i "<screen device index>:"
および Linux の場合: がx11grab
期待され-i :<display id>+<x>,<y>
ます。
したがって、これらの値 ( への引数) をコンストラクターに渡し、それに応じ-i
て ( を介して) フォーマットを設定するsetFormat
だけでうまくいくはずです:
例:
Windows の場合:
new FFmpegFrameGrabber("video=\"screen-capture-recorder\"")
.setFormat("dshow");
OSX の場合:
new FFmpegFrameGrabber("\"<screen device index>:\"")
.setFormat("avfoundation");
Linux の場合:
new FFmpegFrameGrabber(":<display id>+<x>,<y>")
.setFormat("x11grab");
PS:これを完全にテストしていないため、引用符が実際に必要かどうかはわかりません.