package com.immomo.kaka.vesta.service;
import java.io.IOException;
import java.io.InputStream;
import java.util.Objects;
/**
* @author wangduanqing
* @date 2021/05/13
*/
public class WebpMux {
private final static String dir = "/Users/wangduanqing/Desktop/test/";
public static void main(String[] args) throws IOException {
String filePath = dir + "koubi.webp";
InputStream is = Runtime.getRuntime().exec("webpmux -info " + filePath).getInputStream();
String[] rows = new String(is.readAllBytes()).split("\n");
int total = Integer.parseInt(rows[3].replace("Number of frames: ", ""));
System.out.println("total frames: " + total);
WebpMuxConfig[] webpMuxConfigs = new WebpMuxConfig[total];
for (int i = 5; i < total + 5; i++) {
webpMuxConfigs[i - 5] = splitRow(rows[i]);
}
for (int i = 0; i < total; i++) {
Runtime.getRuntime().exec("webpmux -get frame " + (i + 1) + " " + filePath + " -o " + dir + (i + 1) + ".webp");
}
InputStream xx = Runtime.getRuntime().exec(buildCommand(webpMuxConfigs)).getInputStream();
System.out.println(new String(xx.readAllBytes()));
}
private static String buildCommand(WebpMuxConfig[] webpMuxConfigs) {
StringBuilder builder = new StringBuilder("webpmux ");
for (int i = 0; i < webpMuxConfigs.length; i += 2) {
builder.append("-frame ").append(dir).append(i + 1).append(".webp ");
if (i == 0) {
builder.append("+").append(webpMuxConfigs[i].duration);
} else {
builder.append("+").append(webpMuxConfigs[i].duration * 2);
}
builder
.append("+").append(webpMuxConfigs[i].offsetX)
.append("+").append(webpMuxConfigs[i].offsetY)
.append("+").append(webpMuxConfigs[i].dispose)
.append(webpMuxConfigs[i].blend).append(" ");
}
builder.append("-loop 0 ");
builder.append("-o ").append(dir).append("koubi_2.webp");
System.out.println(builder.toString());
return builder.toString();
}
private static WebpMuxConfig splitRow(String row) {
char[] chars = row.toCharArray();
String[] items = new String[11];
StringBuilder builder = new StringBuilder();
int index = 0;
for (char c : chars) {
if (c != ' ') {
builder.append(c);
} else {
if (builder.length() != 0) {
items[index++] = builder.toString();
}
builder.setLength(0);
}
}
if (builder.length() != 0) {
items[index] = builder.toString();
}
String dispose = Objects.equals("background", items[7]) ? "1" : "0";
String blend = Objects.equals("no", items[8]) ? "-b" : "+b";
return new WebpMuxConfig(items[4], items[5], Integer.parseInt(items[6]), dispose, blend);
}
/**
* No.: width height alpha x_offset y_offset duration dispose blend image_size compression 1: 388 397 yes 64 64 42 background no 6976 lossy
*/
private static class WebpMuxConfig {
private String offsetX;
private String offsetY;
private int duration;
private String dispose;
private String blend;
public WebpMuxConfig(String offsetX, String offsetY, int duration, String dispose, String blend) {
this.offsetX = offsetX;
this.offsetY = offsetY;
this.duration = duration;
this.dispose = dispose;
this.blend = blend;
}
}
}
命令参考:https://developers.google.com/speed/webp/docs/webpmux