简单说明一下用FFmpeg给视频加多个图片水印的方法,此处添加的是三个图片水印,没有测试更多的。
Android用的FFmpeg相关库网上已经有很多例子,这里就不详细说明了。
代码:
Runnable compoundRun=new Runnable() {
@Override
public void run() {
String[] commands = new String[14];
commands[0] = "ffmpeg";
commands[1] = "-i";
commands[2] = videoUrl; //原视频地址
commands[3] = "-i";
commands[4] = image1; //图片水印1地址
commands[5] = "-i";
commands[6] = image2; //图片水印2地址
commands[7] = "-i";
commands[8] = image3; //图片水印3地址
commands[9] = "-filter_complex";
commands[10] = "[0:v][1:v]overlay=(main_w-overlay_w)/2:0[bkg1];[bkg1][2:v]overlay=(main_w-overlay_w)/2:main_h-overlay_h[bkg2];[bkg2][3:v]overlay=main_w-overlay_w:0";
commands[11] = "-codec:a"; //音频选项,后加copy表示音频拷贝
commands[12] = "copy"; //表示音频拷贝,无需处理音频时添加,可节省加水印时间
commands[13] = outputUrl; //水印添加完成后的视频文件地址
FFmpegKit.execute(commands, new FFmpegKit.KitInterface() {
@Override
public void onStart() {
Log.d("xxxxx","开始执行...");
}
@Override
public void onProgress(int progress) {
Log.d("xxxxx","执行进度..."+progress);
}
@Override
public void onEnd(int result) {
Log.d("xxxxx","执行完成...");
}
});
}
};
ThreadPoolUtils.execute(compoundRun);
-filter_complex解释:
[0:v][1:v]overlay=(main_w-overlay_w)/2:0[bkg1];[bkg1][2:v]overlay=(main_w-overlay_w)/2:main_h-overlay_h[bkg2];[bkg2][3:v]overlay=main_w-overlay_w:0
[0:v]表示原视频,[1:v]表示图片水印1,[2:v]表示图片水印2,[3:v]表示图片水印3
overlay表示水印覆盖的位置,main_w-overlay_w表示视频宽度-水印宽度,高度0
所以overlay=(main_w-overlay_w)/2:0表示顶部中间。[0:v][1:v]overlay=(main_w-overlay_w)/2:0表示图片水印1覆盖在原视频顶部中间位置,[bkg1]用来命名这一操作。
那么[bkg1][2:v]overlay=(main_w-overlay_w)/2:main_h-overlay_h[bkg2]就表示在第一个操作的基础上再覆盖图片水印2于视频底部中间的位置,并命名此操作为[bkg2]
最后[bkg2][3:v]overlay=main_w-overlay_w:0,在之前的操作基础上在视频右上角添加图片水印3。
操作名可自定义。
参考:
在Android中使用FFmpeg(android studio环境)
android端使用ffmpeg给视频添加图片水印
FFmpeg命令行语法之-filter_complex (Android环境)
网友评论