图片转视频,文档有个例子,如下
File output = new File("test.mp4");
SequenceEncoder enc = SequenceEncoder.createWithFps(NIOUtils.writableChannel(output), new Rational(1, 1));
String[] files = {"frame0.png", "frame1.png", "frame2.png"};
for (String file : files) {
enc.encodeNativeFrame(AWTUtil.decodePNG(new File(file), ColorSpace.RGB));
}
enc.finish();
但是如果直接使用上面的代码,可能会遇到问题
java.lang.IllegalArgumentException: Component 1 height should be a multiple of 2 for colorspace: YUV420J
图片高不是2的倍数,就会报这个错误,可以通过图片缩放来解决这个问题。
File output = new File(System.getProperty("user.dir") + File.separator + uniqueId + System.currentTimeMillis() + ".mp4");
SequenceEncoder enc = SequenceEncoder.createSequenceEncoder(output,1);
for (int i=0; i< objectNames.size();i++) {
String g = objectNames.get(i);
InputStream input = inputstreamFrom(g);
BufferedImage image = null;
try {
image = ImageIO.read(input);
// 宽和高必须为2的倍数
// java.lang.IllegalArgumentException: Component 1 height should be a multiple of 2 for colorspace: YUV420J
int destWidth = image.getWidth();
int destHeight = image.getHeight();
boolean shouldScale = false;
if (image.getWidth() % 2 != 0) {
destWidth++;
shouldScale = true;
}
if (image.getHeight() % 2 != 0) {
destHeight++;
shouldScale = true;
}
if (shouldScale) {
BufferedImage destImage = new BufferedImage(destWidth,destHeight,BufferedImage.TYPE_INT_RGB);
destImage.getGraphics().drawImage(image,0,0,destWidth,destHeight,null);
image = destImage;
}
enc.encodeNativeFrame(AWTUtil.fromBufferedImageRGB(image));
} catch (Exception e) {
LoggerFormat.error(e);
} finally {
input.close()
}
}
enc.finish();
this.saveFileToMinio(bucketName,uniqueId + "/" + uniqueId + ".mp4","video/mp4",new FileInputStream(output));
output.delete();