android視頻加水印
⑴ FFmpeg命令行語法之-filter_complex (Android環境)
廢話少說,先舉個例子
這個例子其實在 android端使用ffmpeg給視頻添加圖片水印 里已經說過了。
這是一個給視頻打上圖片水印的命令。
然而,他打的不是一個普通的水印,而是兩個。
命令看上去很簡潔。然而(又是然而),正因為他這么簡潔,所以一開始上來未免搞不清他實際是什麼意思。
來,我們把他拆開,其實他由以下部分組成:
1、2、4部分的含義一目瞭然。3里頭的scale和overlay也是字面的意思,不難理解。然而,-filter_complex濾鏡的參數結構就不是那麼好理解了,比如說那一坨[]里頭的東西是什麼鬼?
來,一個個解釋。
[1:v]這個里頭兩個參數,1表示的是操作對象的編號。在本例中0就是原始視頻文件input.mp4,1就是image1.png,2就是image2.png,3就是output.mp4。而另一個參數v表示操作對象里的視頻信息。
[img1]是這個操作過濾器的名字。(當然名字可以隨便起)
所以這頭一句 [1:v]scale=100:100[img1] 的意思就是對圖片imagei.png進行調節尺寸的操作,並將這個操作的結果命名為img1。後面的[2:v]和[img2]也是一個意思。
我們繼續,overlay前面 [0:v][img1] 湊一起是什麼意思呢。0自然就是指的原始視頻,這句的意思就是將[img1]疊加到0對象的視頻上。本例中就是把image1.png疊加到input.mp4上。這里需要注意的就是順序:後一個對象疊加到前一個上,後一個對象在上層。如果寫成 [img1][0:v] ,那相對本例其實就是把視頻疊加到圖片imge1.png上。這樣的話一般來說由於視頻通常是全屏,等於用視頻覆蓋了圖片,水印完全看不到了。
好,我們又把這個操作的結果命名為[bkg],那麼接下來 [bkg][img2] 的意思就很明了了。就是把image2.png再疊加上去,image2.png是在最上層的,如果位置重合的話,他會遮蓋 image1.png的水印。
於是,事就這樣成了。
1.水印的移動:
這里需要用到時間參數。
比如: overlay=0+t*20:0
這里在x坐標上加上了 +t*10 ,於是水印就會慢慢向右邊移動。
2.特定時間顯示水印:
這次不僅要用到時間參數,還要用上條件語句。
if條件語句的基本結構就是
再來看看計算表達式。
這里用到了表達式 gte(x,y) 。如果x大於等於y則表達式的值為1,反之為0。
所以 if(gte(t,2),10,NAN) 的意思就是,當時間大於等於2秒時,水印x位置為10,反之不顯示水印。(或者你也可以用 lte 來判斷「小於或等於」)
要了解所有表達式的話,可以去啃一下ffmpeg官方文檔的 Expression Evaluation 部分。
參考:
ffmpeg 基本用法大全
ffmpeg Documentation
⑵ Android NDK開發之旅38--FFmpeg視頻添加水印
Android NDK開發之旅 目錄
Android也是利用FFmpeg命令行的形式(混編),進行視頻轉碼壓縮。
水印位置參數的第一個數值是水印圖片的左上角的x軸像素值,第二個數值是水印圖片的左上角的y軸像素值。
水印位置參數除了使用數值外,還可以使用以下幾個參數:
對應地可以將overlay參數設置成如下值來改變水印圖片的位置:
所以質量會下降,在參數中添加設置 如:-b 1024k 會提高視頻質量