圖片轉(zhuǎn)視頻能颁,文檔有個(gè)例子,如下
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();
但是如果直接使用上面的代碼倒淫,可能會(huì)遇到問(wèn)題
java.lang.IllegalArgumentException: Component 1 height should be a multiple of 2 for colorspace: YUV420J
圖片高不是2的倍數(shù),就會(huì)報(bào)這個(gè)錯(cuò)誤镜硕,可以通過(guò)圖片縮放來(lái)解決這個(gè)問(wèn)題。
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的倍數(shù)
// 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();