直接舉個(gè)栗子:
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;//此處的圖片地址換成帶透明通道的視頻就可以合成動(dòng)態(tài)視頻遮罩蚪燕。
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 命令行開(kāi)始執(zhí)行了...");
}
@Override
public void onProgress(int progress) {
Log.d("FFmpegLog LOGCAT","done com"+"FFmpeg 命令行執(zhí)行進(jìn)度..."+progress);
}
@Override
public void onEnd(int result) {
Log.d("FFmpegLog LOGCAT","FFmpeg 命令行執(zhí)行完成...");
}
});
}
};
ThreadPoolUtils.execute(compoundRun);
}
addwaterMark()中的videoUrl是原始文件地址,imageUrl是水印圖片地址奔浅,outputUrl是視頻輸出地址馆纳。
-filter_complex 參數(shù)是表示使用混合濾鏡把圖片疊加到視頻上。
overlay=(main_w-overlay_w)/2:(main_h-overlay_h)/2 是將圖片居中汹桦,當(dāng)然這里的具體位置可以自己調(diào)鲁驶。
一般來(lái)說(shuō),加個(gè)水印就這樣就可以了舞骆。
然而钥弯,實(shí)際中我們總是需要來(lái)點(diǎn)大小的調(diào)整。
使用scale參數(shù)可以調(diào)整水印大小督禽。
像這樣
String[] commands = new String[9];
commands[0] = "ffmpeg";
//輸入
commands[1] = "-i";
commands[2] = videoUrl;
//水印
commands[3] = "-i";
commands[4] = imageUrl;//此處的圖片地址換成帶透明通道的視頻就可以合成動(dòng)態(tài)視頻遮罩脆霎。
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;
好,現(xiàn)在你可以隨意添加任意大小位置的水印了狈惫。
那么睛蛛,能不能再給力一點(diǎn)?我們使用兩張圖片疊加雙重水印虱岂。
命令行格式如下:
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:
用來(lái)當(dāng)水印的圖片也支持gif格式玖院,那么gif要在整個(gè)視頻播放階段循環(huán)的話就請(qǐng)使用-ignore_loop參數(shù)。這個(gè)參數(shù)的值為1則忽略gif文件本身的循環(huán)設(shè)置第岖,為0的話則使用文件本身的設(shè)置。
比如這樣:
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:
以上命令也適用與透明視頻的疊加试溯。把圖片地址換成帶透明通道的視頻文件的地址就好了蔑滓。(帶透明通道的視頻素材網(wǎng)上可以下載到很多,一般都是mov格式)(然而不知道怎么像gif那樣設(shè)置循環(huán),疊加的視頻僅播放一次键袱。有知道的同學(xué)分享下經(jīng)驗(yàn)唄燎窘。)
附3:
ffmpeg的命令行參數(shù)除了頭尾,中間各組的順序是無(wú)關(guān)的蹄咖,但是各組參數(shù)內(nèi)部不能放錯(cuò)褐健。比如屬于設(shè)置濾鏡的參數(shù)穿插到了輸出里了的話就會(huì)出錯(cuò)。
相關(guān):
在android studio中使用FFmpeg
FFmpeg命令行語(yǔ)法之-filter_complex
使用ffmpeg添加文字水印一直沒(méi)有成功澜汤,打包了freetype也沒(méi)有搞定蚜迅。暫時(shí)只好把文字生成為png圖片湊合一下。有沒(méi)有小伙伴提供下思路或者范例的俊抵?