如何在Windows(ffmpeg等)中使用Java快速拍摄桌面截图?
我想用java来截图我的机器使用FFMPEG或其他解决方案。我知道linux可以在没有JNI的情况下使用ffmpeg,但在Windows中运行它不起作用,可能需要(JNI?)是否有一些简单Java类(以及任何其他必要的)的示例来捕获可在windows环境中运行的屏幕截图?有什么替代FFMPEG的方法吗?我想以比Java Robot API更快的速度拍摄屏幕截图,我发现Java Robot API可以拍摄屏幕截图,但速度比我想要的要慢
我知道在Linux中,这一点非常快:
import com.googlecode.javacv.*;
public class ScreenGrabber {
public static void main(String[] args) throws Exception {
int x = 0, y = 0, w = 1024, h = 768;
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环境下不起作用。我不确定是否有某种方法可以使用相同的代码,但使用javacpp可以真正让它工作,而不必更改上面的大部分代码
我们的目标是快速拍摄屏幕截图,但在拍摄到“不同”的屏幕截图(又名)后停止拍摄。屏幕因某些事件而改变,如窗口关闭等
# 1 楼答案
你熟悉Xuggler吗?它使用FFmpeg进行编码和解码。几个月前,当我不得不从视频中提取帧时,我就知道了这一点,而且它运行得很顺利
在官方网站上,你可以找到一些例子,包括一个名为“CaptureScreentToFile.java”的例子。有关更多信息,请点击以下链接:
http://www.xuggle.com/xuggler/
https://github.com/artclarke/xuggle-xuggler/tree/master/src/com/xuggle/xuggler/demos
# 2 楼答案
根据官方ffmpeg documentation的说法,如果将} expects ,您应该能够保持它非常跨平台
file
参数传递给FFmpegFrameGrabber
(这实际上是一个input
参数,作为ffmpeg的-i
选项传递给different formats each ^{例如:
对于Windows:
dshow
期望-i video="screen-capture-recorder"
对于OSX:
avfoundation
期望-i "<screen device index>":
对于Linux:
x11grab
期望-i :<display id>+<x>,<y>
因此,只需将这些值(参数到
-i
)传递给构造函数并相应地设置格式(通过setFormat
)就可以了