首页 > 编程语言 >Java实现截图和录屏

Java实现截图和录屏

时间:2023-11-09 10:12:47浏览次数:38  
标签:截图 Java grabber javacv 录屏 org import recorder bytedeco

  一、截图,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();
    }
}

 

标签:截图,Java,grabber,javacv,录屏,org,import,recorder,bytedeco
From: https://www.cnblogs.com/ll409546297/p/17819078.html

相关文章

  • Java获取Windows或Linux下的IP地址
    Java获取Linux或Windows下的IP地址,详情如下importlombok.extern.slf4j.Slf4j;importjava.net.InetAddress;importjava.net.NetworkInterface;importjava.net.SocketException;importjava.net.UnknownHostException;importjava.util.Enumeration;@Slf4jpubli......
  • Java Fastjson反序列化漏洞研究
    一、Fastjson简介Fastjson是阿里巴巴的一个开源项目,在GitHub上开源,使用Apache2.0协议。它是一个支持JavaObject和JSON字符串互相转换的Java库。Fastjson最大的特点在于它的快速,它超越了JackJson、Gson等库。据官方发布的说明,Fastjson从2011年fastjson发布1.1.x版本之后,其性能......
  • elasticsearch在Java中查询指定列的方法
     背景ES在查询时如果数量太多,而每行记录包含的字段很多,那就会导致超出ES的查询上线,默认是100MB,但是很多场景下我们只需要返回特定的字段即可,那么如何操作呢。主要代码@AutowiredprivateRestHighLevelClientclient;publicList<Map<String,Object>>search(Stringin......
  • java.lang.NoSuchMethodError错误解决
    一、错误原因java.lang.NoSuchMethodError错误可能的原因:1、有这个类,该类没有这个方法2、类冲突、Jar包冲突、Jar包版本冲突3、有这个类(A),类中也有方法,但在B类中引用了A类,并调用A类的方法,后面修改A类,把该A类的方法返回值类型改变(如将方法返回类型由void类型改成String类型),只部署A类,......
  • java 字符串比较
    packagecom.elaina.test2;publicclassStringTest{publicstaticvoidmain(String[]args){//创建字符串Strings1=newString("abc");Strings2="abc";Strings3="Abc";//==号比......
  • 【Java基础】Java容器相关知识小结
    目录0.前言1.Collection接口1.1.List接口1.1.1.ArrayList1.1.2.LinkedList1.1.3.Vector1.1.4.Stack1.2.Set接口1.2.1.HashSet1.2.2.LinkedHashSet1.2.3.TreeSet1.3.Queue接口1.3.1.PriorityQueue1.3.2.LinkedList2.Map接口2.1.HashMap2.2.TreeMap2.3.LinkedHash......
  • Java——集合
     一、集合类概述为什么会出现集合类?面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作数组和集合类同是容器,有何不同?数组虽然可以存储对象,但长度是固定的;集合的长度是可变的。数组中可以存储基本数据类型;集合只能存储对象。......
  • java 创建字符串对象
    packagecom.elaina.test1;publicclassStringTest{publicstaticvoidmain(String[]args){//直接赋值Strings1="abc";System.out.println(s1);//使用new//空参构造,创建一个空白的字符串对象Strings2......
  • java jna 动态库从资源路径载入问题?
    在其他项目中依赖你的功能jar包时,可能出现无法找到动态库的问题。这是因为在这种情况下,动态库不再位于资源目录中,而是被打包到了依赖的项目中。为了解决这个问题,你可以尝试以下方法:修改Native.loadLibrary方法的调用方式:将动态库的绝对路径传递给Native.loadLibrary方法,而不......
  • 有趣的Java之记录用户操作日志
    Java记录操作日志java自带的日志框架是java.util.logging(JUL),从JDK1.4(2002)开始捆绑在JDK中。可以使用JUL来记录操作日志。以下是使用JUL记录事务的示例://java.util.loggingjava.util.logging.Loggerlogger=java.util.logging.Logger.getLogger(this.getClass().getName());......