import org.bytedeco.javacv.FFmpegFrameRecorder;
import org.bytedeco.javacv.Frame;
import org.bytedeco.javacv.Java2DFrameConverter;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.FileInputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
public class ZipToVideo {
    public static void main(String[] args) throws Exception {
        String zipFilePath = "C:\\Users\\86181\\Desktop\\11.zip";
        String outputVideoPath = "D:/sxh/video.mp4";

        List<BufferedImage> images = readImagesFromZip(zipFilePath);
        createVideoFromImages(images, outputVideoPath);
    }

    public static List<BufferedImage> readImagesFromZip(String zipFilePath) throws Exception {
        List<BufferedImage> images = new ArrayList<>();
        try (ZipInputStream zis = new ZipInputStream(new FileInputStream(zipFilePath))) {
            ZipEntry entry;
            while ((entry = zis.getNextEntry()) != null) {
                if (!entry.isDirectory() && entry.getName().toLowerCase().endsWith(".png")) {
                    BufferedImage image = ImageIO.read(zis);
                    BufferedImage imageimage = convertImage(image);
                    images.add(imageimage);
                }
                zis.closeEntry();
            }
        }
        return images;
    }

    public static BufferedImage convertImage(BufferedImage image) throws Exception {
        try {

            // 获取原始图像的宽度和高度
            int originalWidth = image.getWidth();
            int originalHeight = image.getHeight();

            // 计算调整后的宽度和高度
            int destWidth = originalWidth;
            int destHeight = originalHeight;
            boolean shouldScale = false;

            if (originalWidth % 2 != 0) {
                destWidth++;
                shouldScale = true;
            }

            if (originalHeight % 2 != 0) {
                destHeight++;
                shouldScale = true;
            }

            // 如果需要调整大小,则进行缩放
            BufferedImage resizedImage = image;
            if (shouldScale) {
                resizedImage = new BufferedImage(destWidth, destHeight, BufferedImage.TYPE_INT_RGB);
                Graphics2D g2d = resizedImage.createGraphics();
                g2d.drawImage(image, 0, 0, destWidth, destHeight, null);
                g2d.dispose();
            }
            return resizedImage;

        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    public static void createVideoFromImages(List<BufferedImage> images, String outputVideoPath) throws Exception{
        Java2DFrameConverter converter = new Java2DFrameConverter();
        FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(outputVideoPath, 640, 480); // 指定视频的宽度和高度
        recorder.setVideoOption("crf", "0"); // 设置编码质量,例如0是最好质量,但文件会很大。调整此值以平衡文件大小和质量。
        recorder.setFormat("mp4"); // 设置输出格式为MP4
        recorder.setFrameRate(1); // 设置帧率,根据你的需要调整帧率(例如30fps)
        recorder.start(); // 启动录制器
        for (BufferedImage img : images) {
            Frame frame = converter.convert(img); // 将BufferedImage转换为Frame对象
            recorder.record(frame); // 录制帧到视频文件
        }
        recorder.stop(); // 停止录制并释放资源
    }
}

  

<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-compress</artifactId>
<version>1.21</version>
</dependency>
<!-- JavaCV (OpenCV的Java接口) -->
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>javacv-platform</artifactId>
<version>1.5.7</version>
</dependency>