一、截圖,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>ffmpeg-platform</artifactId> <version>5.1.2-1.5.8</version> </dependency> <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 { Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); FrameGrabber grabber = new FFmpegFrameGrabber("desktop"); grabber.setFormat("gdigrab"); // grabber.setFrameRate(20); // 捕獲指定區域,不設置則爲全屏 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("D://output.avi", grabber.getImageWidth(), grabber.getImageHeight()); // recorder.setFrameRate(20); recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264);// 編碼,使用編碼能讓視頻佔用內存更小,根據實際自行選擇 recorder.start(); int count = 0; while (count < 100) { // 獲取屏幕捕捉的一幀 Frame frame = grabber.grabFrame(); // 將這幀放到錄製 recorder.record(frame); count ++; } // 停止 recorder.stop(); grabber.stop(); // 釋放 recorder.release(); grabber.release(); } }