Java实现截图和录屏
一、截图,Javax提供的能力。
import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; import java.io.File; public class Demo1 { public static void main(String[] args) throws Exception { // 创建一个Robot对象 Robot robot = new Robot(); // 获取屏幕的大小 Dimension dimension = Toolkit.getDefaultToolkit().getScreenSize(); // 创建一个Rectangle对象,用于指定截屏的区域 Rectangle rectangle = new Rectangle(dimension); // 捕获屏幕上的内容 BufferedImage bufferedImage = robot.createScreenCapture(rectangle); // 将捕获的内容保存到文件 ImageIO.write(bufferedImage, "jpg", new File("screenshot.jpg")); } }
二、录屏,使用ffmpeg和javacv的形式来实现
1、maven包
<dependencies> <dependency> <groupId>org.bytedeco</groupId> <artifactId>javacv-platform</artifactId> <version>1.5.8</version> </dependency> </dependencies>
2、录屏实现
import org.bytedeco.ffmpeg.global.avcodec; import org.bytedeco.javacv.FFmpegFrameGrabber; import org.bytedeco.javacv.Frame; import org.bytedeco.javacv.FrameGrabber; import org.bytedeco.javacv.FrameRecorder; import java.awt.*; public class Demo2 { public static void main(String[] args) throws Exception { //处理headless exception System.setProperty("java.awt.headless", "false"); Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); FrameGrabber grabber; String osName = System.getProperty("os.name"); if (osName != null) { if (osName.toLowerCase().contains("windows")) { grabber = new FFmpegFrameGrabber("desktop"); grabber.setFormat("gdigrab"); } else { grabber = new FFmpegFrameGrabber(""); grabber.setFormat("x11grab"); } } else { grabber = new FFmpegFrameGrabber(""); grabber.setFormat("x11grab"); } grabber.setFrameRate(24); // 捕获指定区域,不设置则为全屏 grabber.setImageHeight(screenSize.height); grabber.setImageWidth(screenSize.width); grabber.setOption("offset_x", "0"); grabber.setOption("offset_y", "0");//必须设置了大小才能指定区域起点,参数可参考 FFmpeg 入参 grabber.start(); // 用于存储视频 , 先调用stop,在释放,就会在指定位置输出文件,,这里我保存到D盘 FrameRecorder recorder = FrameRecorder.createDefault("./output.avi", grabber.getImageWidth(), grabber.getImageHeight()); recorder.setFrameRate(24); recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264);// 编码,使用编码能让视频占用内存更小,根据实际自行选择 recorder.start(); int count = 0; while (count < 1000) { // 获取屏幕捕捉的一帧 Frame frame = grabber.grabFrame(); // 将这帧放到录制 recorder.record(frame); count ++; } // 停止 recorder.stop(); grabber.stop(); // 释放 recorder.release(); grabber.release(); } }