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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章