【问题标题】:How to get over 30FPS using Java in a Screen Capture Program?如何在屏幕捕获程序中使用 Java 获得超过 30FPS?
【发布时间】:2012-11-26 06:25:45
【问题描述】:

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

我可以使用什么来捕获屏幕?我已经尝试过 Xuggle,但我似乎也无法以足够快的速度捕捉它。

【问题讨论】:

  • FFmpeg 支持 x11grab video input 运行速度很快,但仅适用于 X Window 系统。如果这令人满意,JavaCV 的FFmpegFrameGrabber 类可以为您提供图像。如果您想要一些示例代码作为答案,请告诉我
  • 是的,它可能会有所帮助。我不知道我会怎么做...
  • 我想说,例如,您是否关心 Windows 和 Mac OS X,或者 X11 是否足够?
  • 我希望它是 windows,如果你知道如何准确的话。你能也给我看看 X11 方法吗?
  • Robot 可能太慢了,除非在最新的 JDK 中重新实现。

标签: java screen capture recording awtrobot


【解决方案1】:

对于遵循 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 可以提供帮助。

【讨论】:

【解决方案2】:

基于@Samuel 的回答,根据官方ffmpeg documentation,如果您将file 参数传递给FFmpegFrameGrabber(这实际上是一个input 参数作为 -i 选项传递给 ffmpeg)遵循 different formats each device expects。

即:

对于 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:尚未对此进行全面测试,因此不确定引号是否真的必要。

【讨论】:

  • 您能否详细说明如何为 Windows 设置选项?我试图找出哪些选项需要进入格式,哪些进入构造函数。谢谢。
  • 编辑了我的答案并添加了一些显示正在传递的参数的示例。
  • 对于 Windows,您还可以使用 gdigrab 作为格式并相应地传递输入/文件参数和选项。请参阅ffmpeg.org/ffmpeg-devices.html 了解更多信息。
  • 我收到以下错误:org.bytedeco.javacv.FrameGrabber$Exception:avformat_open_input() 错误 -5:无法打开输入“video='screen-capture-recorder'”。 (是否调用了 setFormat() ?)。我正在使用以下代码: FFmpegFrameGrabber retVal = new FFmpegFrameGrabber("video='screen-capture-recorder'"); retVal.setFormat("gdigrab");当我调用返回对象的start方法时出现错误。
  • video=screen-capture-recorder 是dshow 设备/格式期望的参数。如果您要使用gdigrab,则需要传递相应的格式。查看我链接到的页面了解更多信息。
猜你喜欢
  • 1970-01-01
  • 2021-01-30
  • 2018-11-03
  • 2012-04-19
  • 1970-01-01
  • 2019-02-03
  • 2015-04-06
  • 1970-01-01
  • 2023-03-11
相关资源
最近更新 更多