一、图片转视频条件:需要两个jar包,这里我提供下(生成图片不用导jar包),请根据需要自行下载。
- 链接: https://pan.baidu.com/s/1oag2gOJJq3S57rO-hZSEDQ
- 提取码: 2sn9
二、捕获屏幕生成jpg---自行查看代码
package record.screen; /** * @Author:dongwn * @Description: * @Date: 2019/7/12 14:22 * @Version: opencv-cnV1.0 */ import java.awt.*; import java.awt.image.*; import com.sun.image.codec.jpeg.*; import java.io.*; public class WnetWScreenRecorder extends Thread { private Dimension screenSize; private Rectangle rectangle; private Robot robot; private long i = 0; private JPEGImageEncoder encoder; public WnetWScreenRecorder() { this.screenSize = Toolkit.getDefaultToolkit().getScreenSize(); this.rectangle = new Rectangle(screenSize);//可以指定捕获屏幕区域 try { robot = new Robot(); } catch (Exception e) { e.printStackTrace(); System.out.println(e); } } public static void main(String[] args) { new WnetWScreenRecorder().start(); } public void run() { FileOutputStream fos = null; while (true) { try { BufferedImage image = robot.createScreenCapture(rectangle);//捕获制定屏幕矩形区域 fos = new FileOutputStream("D://Arecords//" + i + ".jpg"); JPEGCodec.createJPEGEncoder(fos).encode(image);//图像编码成JPEG fos.close(); i = i + 1; Thread.sleep(40);//每秒25帧 } catch (Exception e) { e.printStackTrace(); System.out.println(e); try { if (fos != null) fos.close(); } catch (Exception e1) { } } } } }
三、播放图片
package record.screen; /** * @Author:dongwn * @Description: * @Date: 2019/7/12 14:27 * @Version: opencv-cnV1.0 */ import java.awt.*; import javax.swing.*; public class WnetWScreenRecordPlayer extends JFrame { BorderLayout borderLayout1 = new BorderLayout(); Dimension screenSize; public WnetWScreenRecordPlayer() { super(); screenSize = Toolkit.getDefaultToolkit().getScreenSize(); this.setSize(screenSize); Screen p = new Screen(); Container c = this.getContentPane(); c.setLayout(borderLayout1); c.add(p, "Center"); new Thread(p).start(); this.show(); } public static void main(String[] args) { new WnetWScreenRecordPlayer(); } } class Screen extends JPanel implements Runnable { private BorderLayout borderLayout1 = new BorderLayout(); private Image cimage; public void run() { int i = 0; while (true) { try { cimage = loadImage(i + ".jpg"); i = i + 1; repaint(); Thread.sleep(40);//与录像时每秒帧数一致 } catch (Exception e) { e.printStackTrace(); System.out.println(e); } } } public Image loadImage(String name) { Toolkit tk = Toolkit.getDefaultToolkit(); Image image = null; image = tk.getImage("D:/Arecords/" + name); MediaTracker mt = new MediaTracker(this); mt.addImage(image, 0); try { mt.waitForID(0); } catch (Exception e) { e.printStackTrace(); System.out.println(e); } return image; } public Screen() { super(); this.setLayout(null); } public void paint(Graphics g) { super.paint(g); Graphics2D g2 = (Graphics2D) g; g2.drawImage(cimage, 0, 0, null); } }
四、转换图片生成avi,生成文件--项目根目录
package util; /** * @Author:dongwn * @Description: * @Date: 2019/7/12 14:46 * @Version: opencv-cnV1.0 */ import java.io.File; import java.io.IOException; import java.util.Arrays; import java.util.Comparator; import org.jim2mov.core.DefaultMovieInfoProvider; import org.jim2mov.core.ImageProvider; import org.jim2mov.core.Jim2Mov; import org.jim2mov.core.MovieInfoProvider; import org.jim2mov.core.MovieSaveException; import org.jim2mov.utils.MovieUtils; public class PictureToVideoUtils { /** * 将图片转换成视频 * * @param jpgDirPath jpg图片文件夹绝对路径 * @param aviFileName 生成的avi视频文件名 * @param fps 每秒帧数 * @param mWidth 视频的宽度 * @param mHeight 视频的高度 * @throws Exception */ public static void convertPicToAvi(String jpgDirPath, String aviFileName, int fps, int mWidth, int mHeight) { // jpgs目录放置jpg图片,图片文件名为(1.jpg,2.jpg...) final File[] jpgs = new File(jpgDirPath).listFiles(); if (jpgs == null || jpgs.length == 0) { return; } // 对文件名进行排序(本示例假定文件名中的数字越小,生成视频的帧数越靠前) Arrays.sort(jpgs, new Comparator<File>() { public int compare(File file1, File file2) { String numberName1 = file1.getName().replace(".jpg", ""); String numberName2 = file2.getName().replace(".jpg", ""); return new Integer(numberName1) - new Integer(numberName2); } }); // 生成视频的名称 DefaultMovieInfoProvider dmip = new DefaultMovieInfoProvider(aviFileName); // 设置每秒帧数 dmip.setFPS(fps > 0 ? fps : 3); // 如果未设置,默认为3 // 设置总帧数 dmip.setNumberOfFrames(jpgs.length); // 设置视频宽和高(最好与图片宽高保持一直) dmip.setMWidth(mWidth > 0 ? mWidth : 1440); // 如果未设置,默认为1440 dmip.setMHeight(mHeight > 0 ? mHeight : 860); // 如果未设置,默认为860 try { new Jim2Mov(new ImageProvider() { public byte[] getImage(int frame) { try { // 设置压缩比 return MovieUtils.convertImageToJPEG((jpgs[frame]), 0.4f);//1.0f更清晰,对应的文件也变大 } catch (IOException e) { System.err.println(e); } return null; } }, dmip, null).saveMovie(MovieInfoProvider.TYPE_AVI_MJPEG); } catch (MovieSaveException e) { System.err.println(e); } System.out.println("create avi success."); } /** * main * * @param args * @throws Exception */ public static void main(String[] args) throws Exception { String jpgDirPath = "D:/Arecords/"; // jpg文件夹路径 String aviFileName = "Arecords.avi"; // 生成的avi视频文件名(生成路径为本工程) int fps = 3; // 每秒播放的帧数 int mWidth = 600; // 视频的宽度 int mHeight = 400; // 视频的高度 PictureToVideoUtils.convertPicToAvi(jpgDirPath, aviFileName, fps, mWidth, mHeight); } }