直接舉個栗子:
public static String[] addwaterMark(String imageUrl,String videoUrl,String outputUrl){
String[] commands = new String[9];
commands[0] = "ffmpeg";
//輸入
commands[1] = "-i";
commands[2] = videoUrl;
//水印
commands[3] = "-i";
commands[4] = imageUrl;//此處的圖片地址換成帶透明通道的視頻就可以合成動態視頻遮罩。
commands[5] = "-filter_complex";
commands[6] = "overlay=(main_w-overlay_w)/2:(main_h-overlay_h)/2";
//覆蓋輸出
commands[7] = "-y";//直接覆蓋輸出文件
//輸出文件
commands[8] = outputUrl;
return commands;
}
private void makeVideo(){
final String[] _commands=addwaterMark(imageUrl,videoUrl,outputUrl);
Runnable compoundRun=new Runnable() {
@Override
public void run() {
FFmpegKit.execute(_commands, new FFmpegKit.KitInterface() {
@Override
public void onStart() {
Log.d("FFmpegLog LOGCAT","FFmpeg 命令行開始執行了...");
}
@Override
public void onProgress(int progress) {
Log.d("FFmpegLog LOGCAT","done com"+"FFmpeg 命令行執行進度..."+progress);
}
@Override
public void onEnd(int result) {
Log.d("FFmpegLog LOGCAT","FFmpeg 命令行執行完成...");
}
});
}
};
ThreadPoolUtils.execute(compoundRun);
}
addwaterMark()中的videoUrl是原始文件地址,imageUrl是水印圖片地址,outputUrl是視頻輸出地址。
-filter_complex 參數是表示使用混合濾鏡把圖片疊加到視頻上。
overlay=(main_w-overlay_w)/2:(main_h-overlay_h)/2 是將圖片居中,當然這里的具體位置可以自己調。
一般來說,加個水印就這樣就可以了。
然而,實際中我們總是需要來點大小的調整。
使用scale參數可以調整水印大小。
像這樣
String[] commands = new String[9];
commands[0] = "ffmpeg";
//輸入
commands[1] = "-i";
commands[2] = videoUrl;
//水印
commands[3] = "-i";
commands[4] = imageUrl;//此處的圖片地址換成帶透明通道的視頻就可以合成動態視頻遮罩。
commands[5] = "-filter_complex";
commands[6] = "[1:v]scale=100:200[s];[0:v][s]overlay=0:0";
//覆蓋輸出
commands[7] = "-y";//直接覆蓋輸出文件
//輸出文件
commands[8] = outputUrl;
return commands;
好,現在你可以隨意添加任意大小位置的水印了。
那么,能不能再給力一點?我們使用兩張圖片疊加雙重水印。
命令行格式如下:
String[] commands = new String[11];
commands[0] = "ffmpeg";
//輸入
commands[1] = "-i";
commands[2] = videoUrl;
//水印
commands[3] = "-i";
commands[4] = image1;
commands[5] = "-i";
commands[6] = image2;
commands[7] = "-filter_complex";
commands[8] = "[1:v]scale=100:100[img1];[2:v]scale=1280:720[img2];[0:v][img1]overlay=(main_w-overlay_w)/2:(main_h-overlay_h)/2[bkg];[bkg][img2]overlay=0:0";
//覆蓋輸出
commands[9] = "-y";//直接覆蓋輸出文件
//輸出文件
commands[10] = outputUrl;
return commands;
附1:
用來當水印的圖片也支持gif格式,那么gif要在整個視頻播放階段循環的話就請使用-ignore_loop參數。這個參數的值為1則忽略gif文件本身的循環設置,為0的話則使用文件本身的設置。
比如這樣:
String[] commands = new String[11];
commands[0] = "ffmpeg";
//輸入
commands[1] = "-i";
commands[2] = videoUrl;
//水印
commands[3] = "-ignore_loop";
commands[3] = "0";
commands[3] = "-i";
commands[4] = image1.gif;
commands[5] = "-i";
commands[6] = image2;
commands[7] = "-filter_complex";
commands[8] = "[1:v]scale=100:100[img1];[2:v]scale=1280:720[img2];[0:v][img1]overlay=(main_w-overlay_w)/2:(main_h-overlay_h)/2[bkg];[bkg][img2]overlay=0:0";
//覆蓋輸出
commands[9] = "-y";//直接覆蓋輸出文件
//輸出文件
commands[10] = outputUrl;
return commands;
附2:
以上命令也適用與透明視頻的疊加。把圖片地址換成帶透明通道的視頻文件的地址就好了。(帶透明通道的視頻素材網上可以下載到很多,一般都是mov格式)(然而不知道怎么像gif那樣設置循環,疊加的視頻僅播放一次。有知道的同學分享下經驗唄。)
附3:
ffmpeg的命令行參數除了頭尾,中間各組的順序是無關的,但是各組參數內部不能放錯。比如屬于設置濾鏡的參數穿插到了輸出里了的話就會出錯。
相關:
在android studio中使用FFmpeg
FFmpeg命令行語法之-filter_complex
使用ffmpeg添加文字水印一直沒有成功,打包了freetype也沒有搞定。暫時只好把文字生成為png圖片湊合一下。有沒有小伙伴提供下思路或者范例的?