java实现录屏_javacv实现桌面端录屏

该博客展示了如何使用javacv库在Java中实现桌面屏幕录制。代码示例包括创建FFmpegFrameRecorder实例,设置参数如视频编码、格式、帧率等,并使用Robot类捕获屏幕图像。同时,它还涵盖了音频录制,使用了AudioFormat和TargetDataLine来捕捉音频数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

不多说,直接上代码,源码参考了javacv官方提供的demo。

package czh.iewbs.recordingscreenVideo;

import static org.bytedeco.javacpp.opencv_imgcodecs.cvLoadImage;

import java.awt.AWTException;

import java.awt.Rectangle;

import java.awt.Robot;

import java.awt.image.BufferedImage;

import java.io.File;

import java.io.IOException;

import java.nio.ByteBuffer;

import java.nio.ByteOrder;

import java.nio.ShortBuffer;

import java.util.Scanner;

import java.util.concurrent.ScheduledThreadPoolExecutor;

import java.util.concurrent.TimeUnit;

import javax.imageio.ImageIO;

import javax.sound.sampled.AudioFormat;

import javax.sound.sampled.AudioSystem;

import javax.sound.sampled.DataLine;

import javax.sound.sampled.LineUnavailableException;

import javax.sound.sampled.Mixer;

import javax.sound.sampled.TargetDataLine;

import org.bytedeco.javacpp.avcodec;

import org.bytedeco.javacpp.avutil;

import org.bytedeco.javacpp.opencv_core;

import org.bytedeco.javacpp.opencv_core.IplImage;

import org.bytedeco.javacv.FFmpegFrameRecorder;

import org.bytedeco.javacv.FrameRecorder.Exception;

import org.bytedeco.javacv.OpenCVFrameConverter;

/**

* 使用javacv进行录屏

*

* @author gj

*

*亲测每秒截5幅图片的效果是最好的,截多了会丢帧

*

*/

public class VideoRecord {

private ScheduledThreadPoolExecutor screenTimer;

private final Rectangle rectangle = new Rectangle(Constant.WIDTH, Constant.HEIGHT);

private FFmpegFrameRecorder recorder;

private Robot robot;

private OpenCVFrameConverter.ToIplImage conveter;

private BufferedImage screenCapture;

private final int AUDIO_DEVICE_INDEX = 4;

private ScheduledThreadPoolExecutor exec;

private TargetDataLine line;

private AudioFormat audioFormat;

### 使用JavaCV实现制 #### 制基础概念 为了实现在不同操作系统上的制,开发者通常会选择适合特定平台的技术栈。对于跨平台应用而言,JavaCV因其良好的兼容性和丰富的API成为理想的选择之一。 #### MacOS环境下的制与音频采集 在苹果MacOS平台上,可以通过结合JavaCV库和AVFoundation API完成制及麦克风声音的收集工作[^1]。下面给出一段简单的代码片段展示这一过程: ```java import org.bytedeco.javacv.*; import static org.bytedeco.opencv.global.opencv_imgcodecs.*; public class MacScreenRecorder { public static void main(String[] args) throws Exception { FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(":0"); // ":0" 表示默认显示器 grabber.setFormat("avfoundation"); grabber.start(); FrameRecorder recorder = new FFmpegFrameRecorder("output.mp4", grabber.getImageWidth(), grabber.getImageHeight()); recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264); recorder.setFormat("mp4"); recorder.start(); while (true) { Frame frame = grabber.grabImage(); if (frame == null) break; recorder.record(frame); } recorder.stop(); grabber.stop(); } } ``` 这段程序初始化了一个`FFmpegFrameGrabber`实例用于抓取来自系统的图像帧,并设置其输入格式为`avfoundation`以便于访问macOS特有的显示设备和服务。接着创建了另一个名为`FFmpegFrameRecorder`的对象负责编码并将捕获到的画面序列化成最终的目标文件——这里指定了H.264作为视频压缩标准以及MP4封装容器。 #### Windows环境下仅限幕画面捕捉 当目标转向Windows系统时,则更多依赖于GDIGrab机制来进行高效的桌面渲染获取操作[^2]。以下是适用于Win32架构下纯视觉部分记的一段简化版脚本: ```java import org.bytedeco.javacv.FrameGrabber.Exception; // ... 导入其他必要的类 ... public class WinScreenRecorder { private static final String OUTPUT_FILE_NAME = "screen_record.avi"; public static void recordScreen() throws InterruptedException, Exception { try (FFmpegFrameGrabber grabber = new FFmpegFrameGrabber("desktop")) { grabber.setFormat("gdigrab"); grabber.setImageWidth(1920); // 设置分辨率宽度 grabber.setImageHeight(1080); // 设置分辨率高度 grabber.start(); CanvasFrame canvas = new CanvasFrame("Captured Video", CanvasFrame.getDefaultGamma() / grabber.getGamma()); FFmpegFrameRecorder recorder = new FFmpegFrameRecorder( OUTPUT_FILE_NAME, grabber.getImageWidth(), grabber.getImageHeight() ); recorder.setFormat("avi"); recorder.setFrameRate(grabber.getFrameRate()); recorder.setPixelFormat(avutil.AV_PIX_FMT_YUV420P); recorder.start(); int i = 0; long startTime = System.currentTimeMillis(); while ((i++ < 5 * grabber.getFrameRate()) && !canvas.isClosed()) { // 制大约五秒 Frame grabbedImage = grabber.grabImage(); if (grabbedImage != null) { recorder.record(grabbedImage); canvas.showImage(grabbedImage); } else { Thread.sleep(1L); } } recorder.stop(); grabber.stop(); canvas.dispose(); } } public static void main(String[] args) throws Exception { recordScreen(); } } ``` 此版本中特别注意到了对输出质量参数(比如尺寸大小、比特率等)进行了配置优化;同时也引入了实时预览窗口让用户能够即时查看当前正在被摄的内容。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值