基于https://blog.csdn.net/qq_36270700/article/details/109334232 上一篇,用javaFX做一个屏幕选择框后,借助ffmpeg,实现屏幕录制
整体思路为
1、选取屏幕区域,通过屏幕选择框,可以得到选取得坐标
2、根据帧率 , 设置间隔时间,再通过Robot截取指定区域屏幕
3、通过ffmpeg将截图合成视频
4、通过ffmpeg将视频转换为gif
重要的是 通过视频合成的gif体积较小!
实现效果:
代码就两个类,跑Main的main函数即可
这边默认帧率为100,实际上会加速,因为通过计算,每秒期望截10张图,但是执行过程中会有短暂的延迟,导致和期待帧率有偏差,这个可以自己调整
比较简单总共两个类加一个ffmpeg.exe
ScreenUtil
package screen;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import javax.imageio.ImageIO;
public class ScreenUtil {
static String ffmpeg = ScreenUtil.class.getResource("ffmpeg.exe").getFile();
int bigNum = 1000000000;
private String PATH = null;
private String fileTypeName = "jpg";
private String fileType = "." + fileTypeName;
private String fieldName = "test";
public ScreenUtil(String fieldName) {
this.fieldName = fieldName;
}
public String getPATH() {
return PATH;
}
public void setPATH(String PATH) {
File file = new File(PATH + "/" + this.fieldName);
while(file.exists()){
this.fieldName = this.fieldName + "1";
file = new File(PATH + "/" + this.fieldName);
}
this.PATH = PATH + "/";
}
public String getFileNamePatten(){
return PATH + fieldName + "/1%09d" + fileType ;
}
//画鼠标
private void buildMousePic(BufferedImage image,Double x,Double y) {
Point p= MouseInfo.getPointerInfo().getLocation();
image.createGraphics().drawOval(p.x-x.intValue() -20, p.y-y.intValue() -20,20,20);
}
public void printScreen(Double x,Double y,Double w ,Double h,int num) throws AWTException, IOException {
//转视屏的时候需要32的倍数和2的倍数
if (w % 32 != 0)
{
w = w.intValue() / 32 * 32D;
}
if (h % 2 != 0) {
h = h.intValue() / 2 * 2D ;
}
// 截取屏幕
BufferedImage image = new