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();
    }
}

 

posted @ 2023-11-09 10:01  小不点丶  阅读(402)  评论(0编辑  收藏  举报