不多说,直接上代码,源码参考了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;