2

現在、Java の Robot クラスを使用して画面を記録しています。ただし、最低 30 フレーム/秒には達しません。私はオブジェクトを再作成しておらず、できる限り効率的にしていますが、平均して 1 秒あたり約 15 フレームしかありません。ロボットは単にそれをカットしていません。

画面をキャプチャするには何を使用できますか? Xuggle を試してみましたが、十分な速さでキャプチャすることもできないようです。

4

2 に答える 2

6

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はそれを助けることができます。

于 2012-12-09T02:54:30.827 に答える
5

@Samuel の回答に基づいてビルドします。公式のffmpeg ドキュメントfileによると、渡されたパラメーターFFmpegFrameGrabber(実際にはffmpeg のオプションinputとして渡されるパラメーター) を異なるものに準拠させると、プラットフォームをかなりクロス プラットフォームに保つことができるはずです。それぞれが期待するフォーマット-idevice

すなわち:

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:これを完全にテストしていないため、引用符が実際に必要かどうかはわかりません.

于 2015-03-04T21:43:07.263 に答える