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>
<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>