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

直接舉個栗子:

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圖片湊合一下。有沒有小伙伴提供下思路或者范例的?

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

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