移动水印
水印设置未操作,需要修改水印需要自行添加
public static void watermarkMove(MultimediaObject video, File mark, File target) {
OverlayFilter filter = new OverlayFilter();
filter.addNamedArgument("x", "if(lt(mod(t*100,2*(main_w-overlay_w)),main_w-overlay_w),mod(t*100,2*(main_w-overlay_w)),2*(main_w-overlay_w) -mod(t*100,2*(main_w-overlay_w)))");
filter.addNamedArgument("y", "if(lt(mod(t*100,2*(main_h-overlay_h)),main_h-overlay_h),mod(t*100,2*(main_h-overlay_h)),2*(main_h-overlay_h) -mod(t*100,2*(main_h-overlay_h)))");
VideoAttributes videoattr = new VideoAttributes();
videoattr.setComplexFiltergraph(new FilterGraph(new FilterChain(filter)));
EncodingAttributes attrs = new EncodingAttributes();
attrs.setVideoAttributes(videoattr);
attrs.setAudioAttributes(new AudioAttributes());
List<EncodingArgument> args = new ArrayList<>();
try {
new Encoder().encode(List.of(video, new MultimediaObject(mark)), target, attrs, null, args);
} catch (IllegalArgumentException | EncoderException e) {
e.printStackTrace();
}
}
平铺满屏水印
sx和sy 为水印间距
public static void watermarkMore(MultimediaObject video, File mark, File target) {
try {
VideoSize videoSize = video.getInfo().getVideo().getSize();
MultimediaObject wm = new MultimediaObject(mark);
VideoSize wmSize = wm.getInfo().getVideo().getSize();
int sx = 10;
int sy = 10;
int x = videoSize.getWidth() / (wmSize.getWidth() + sx) + 1;
int y = videoSize.getHeight() / (wmSize.getHeight() + sy) + 1;
List<Filter> list = new ArrayList<>();
ScaleFilter sf1 = new ScaleFilter();
sf1.addInputLabel("1:v");
sf1.addOutputLabel("s0");
list.add(sf1);
OverlayFilter filter1 = new OverlayFilter();
filter1.addInputLabel("0:v");
filter1.addInputLabel("s0");
filter1.addNamedArgument("x", "" + (sx / 2));
filter1.addNamedArgument("y", "" + (sy / 2));
filter1.addOutputLabel("vw1");
list.add(filter1);
int index = 1;
for (int i = 0; i < x; i++) {
for (int j = 0; j < y; j++) {
if (i == 0 && j == 0) {
continue;
}
ScaleFilter sf = new ScaleFilter();
sf.addInputLabel("1:v");
sf.addOutputLabel("s" + index);
list.add(sf);
OverlayFilter filter = new OverlayFilter();
filter.addInputLabel("vw" + index);
filter.addInputLabel("s" + index);
filter.addNamedArgument("x", (sx / 2) + i * (wmSize.getWidth() + sx) + "");
filter.addNamedArgument("y", (sy / 2) + j * (wmSize.getHeight() + sy) + "");
index++;
if (i == x - 1 && j == y - 1) {
} else {
filter.addOutputLabel("vw" + index);
}
list.add(filter);
}
}
VideoAttributes videoattr = new VideoAttributes();
videoattr.setComplexFiltergraph(new FilterGraph(new FilterChain(list.toArray(new Filter[] {}))));
EncodingAttributes attrs = new EncodingAttributes();
attrs.setVideoAttributes(videoattr);
attrs.setAudioAttributes(new AudioAttributes());
List<EncodingArgument> args = new ArrayList<>();
new Encoder().encode(List.of(video, wm), target, attrs, null, args);
} catch (Exception e) {
}
}
水印旋转 (平铺改进)
public static void watermarkMore(MultimediaObject video, File mark, File target) {
try {
VideoSize videoSize = video.getInfo().getVideo().getSize();
MultimediaObject wm = new MultimediaObject(mark);
VideoSize wmSize = wm.getInfo().getVideo().getSize();
int osize = wmSize.getHeight() + wmSize.getWidth();
int sx = 80;
int sy = 80;
int x = videoSize.getWidth() / (osize + sx) + 1;
int y = videoSize.getHeight() / (osize + sy) + 1;
List<FilterChain> list = new ArrayList<>();
Filter f1 = new Filter("rotate");
f1.addInputLabel("1:v");
f1.addOrderedArgument("-30*PI/180");// 参数为弧度
f1.addNamedArgument("ow", osize + "");
f1.addNamedArgument("oh", osize + "");
f1.addNamedArgument("c", "none");
ScaleFilter sf1 = new ScaleFilter();
sf1.addOutputLabel("s0");
list.add(new FilterChain(f1, sf1));
OverlayFilter filter1 = new OverlayFilter();
filter1.addInputLabel("0:v");
filter1.addInputLabel("s0");
filter1.addNamedArgument("x", "" + (sx / 2));
filter1.addNamedArgument("y", "" + (sy / 2));
filter1.addOutputLabel("vw1");
list.add(new FilterChain(filter1));
int index = 1;
for (int i = 0; i < x; i++) {
for (int j = 0; j < y; j++) {
if (i == 0 && j == 0) {
continue;
}
Filter rf = new Filter("rotate");
rf.addInputLabel("1:v");
rf.addOrderedArgument("-30*PI/180");
rf.addNamedArgument("ow", osize + "");
rf.addNamedArgument("oh", osize + "");
rf.addNamedArgument("c", "none");
ScaleFilter sf = new ScaleFilter();
sf.addOutputLabel("s" + index);
list.add(new FilterChain(rf, sf));
OverlayFilter filter = new OverlayFilter();
filter.addInputLabel("vw" + index);
filter.addInputLabel("s" + index);
filter.addNamedArgument("x", (sx / 2) + i * (osize + sx) + "");
filter.addNamedArgument("y", (sy / 2) + j * (osize + sy) + "");
index++;
if (i == x - 1 && j == y - 1) {
} else {
filter.addOutputLabel("vw" + index);
}
list.add(new FilterChain(filter));
}
}
VideoAttributes videoattr = new VideoAttributes();
videoattr.setComplexFiltergraph(new FilterGraph(list.toArray(new FilterChain[] {})));
EncodingAttributes attrs = new EncodingAttributes();
attrs.setVideoAttributes(videoattr);
attrs.setAudioAttributes(new AudioAttributes());
List<EncodingArgument> args = new ArrayList<>();
new Encoder().encode(List.of(video, wm), target, attrs, null, args);
} catch (Exception e) {
}
}