如何在屏幕捕获程序中使用 Java 获得超过 30FPS?

Rai*_*fur 2 java screen capture recording awtrobot

我目前正在使用 Java 中的 Robot 类来记录屏幕。但是,它没有达到每秒 30 帧的最小值。我不是重新创建对象,而是尽可能高效,但我平均每秒只有 15 帧左右。机器人根本不切割它。

我可以用什么来捕获屏幕?我试过 Xuggle,但我似乎也无法足够快地捕捉它。

Sam*_*det 6

对于遵循 X11 标准的操作系统(Linux、FreeBSD、Solaris 等),我们可以通过JavaCVFFmpeg这样做:

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

我不了解 Windows 或 Mac OS X,但我怀疑我们需要直接访问本机 API。尽管如此,JavaCPP可以帮助解决这个问题。

  • 根据 https://trac.ffmpeg.org/wiki/Capture/Desktop,您应该能够使用相同的 API,只需使用不同的“设备”(Windows 的“dshow”而不是“x11grab”和 OSX 的“avfoundation”) ) (2认同)

Rob*_*ade 5

以@Samuel 的回答为基础,根据官方ffmpeg 文档,如果您将file参数传递给FFmpegFrameGrabber(实际上是input作为-i选项传递给 ffmpeg 的参数)遵守不同的格式每个device期望

IE:

对于 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");
Run Code Online (Sandbox Code Playgroud)

对于 OSX:

new FFmpegFrameGrabber("\"<screen device index>:\"")
    .setFormat("avfoundation");
Run Code Online (Sandbox Code Playgroud)

对于 Linux:

new FFmpegFrameGrabber(":<display id>+<x>,<y>")
    .setFormat("x11grab");
Run Code Online (Sandbox Code Playgroud)

PS:还没有完全测试过,所以不确定引号是否真的有必要。

  • 特别是对于 Windows,您还可以使用 `gdigrab` 作为格式并相应地传递输入/文件参数和选项。有关更多信息,请参阅 http://ffmpeg.org/ffmpeg-devices.html。 (2认同)