android端使用ffmpeg給視頻添加圖片水印

直接舉個(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 命令行開始執(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)有小伙伴提供下思路或者范例的?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 15,351評(píng)論 4 61
  • 走過(guò)半生后,愿你每次流淚都是喜極而泣,愿你精疲力盡時(shí)都有樹可倚。愿你學(xué)會(huì)釋懷后一身輕,愿你無(wú)悔亦無(wú)懼安度余生。 飄...
    向行閱讀 579評(píng)論 2 5
  • 隨緣而得之友誼 共度青春宿時(shí)光 閱書論影共成長(zhǎng) 席地暢享人生夢(mèng) 文藝清新討人喜 知性內(nèi)斂惹人愛(ài) 相隔異地倍思念 愿...
    我是芥末小姐閱讀 177評(píng)論 0 0
  • 工作以后進(jìn)入社會(huì),突然間發(fā)現(xiàn)有一種顏色叫灰色,有些事情不只是有黑和白,經(jīng)歷了一段痛苦感情,終于覺(jué)得該放手了,真...
    輕輕改變閱讀 263評(píng)論 0 0
  • 感恩早上起來(lái)發(fā)愿讓自己成為覺(jué)醒悟的人,感恩今天是女兒一模的日子,我卻不能在跟前陪她,或許讓她更放松,感恩還有近三個(gè)...
    liuxiaorui閱讀 137評(píng)論 0 0

友情鏈接更多精彩內(nèi)容