廢話少說,先舉個例子
ffmpeg -i input.mp4 -i image1.png -i image2.png -filter_complex [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 -y output.mp4
這個例子其實在android端使用ffmpeg給視頻添加圖片水印里已經(jīng)說過了。
這是一個給視頻打上圖片水印的命令。
然而,他打的不是一個普通的水印,而是兩個。
命令看上去很簡潔。然而(又是然而),正因為他這么簡潔,所以一開始上來未免搞不清他實際是什么意思。
來,我們把他拆開,其實他由以下部分組成:
//1.起始
ffmpeg
//2.輸入
-i input.mp4//這個是原始文件
-i image1.png//第一個水印圖片
-i image2.png//第二個水印圖片
//3.濾鏡
-filter_complex [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
//4.輸出
-y output.mp4//輸出文件
1、2、4部分的含義一目了然。3里頭的scale和overlay也是字面的意思,不難理解。然而,-filter_complex濾鏡的參數(shù)結(jié)構(gòu)就不是那么好理解了,比如說那一坨[]里頭的東西是什么鬼?
來,一個個解釋。
[1:v]這個里頭兩個參數(shù),1表示的是操作對象的編號。在本例中0就是原始視頻文件input.mp4,1就是image1.png,2就是image2.png,3就是output.mp4。而另一個參數(shù)v表示操作對象里的視頻信息。
[img1]是這個操作過濾器的名字。(當(dāng)然名字可以隨便起)
所以這頭一句[1:v]scale=100:100[img1]的意思就是對圖片imagei.png進(jìn)行調(diào)節(jié)尺寸的操作,并將這個操作的結(jié)果命名為img1。后面的[2:v]和[img2]也是一個意思。
我們繼續(xù),overlay前面[0:v][img1]湊一起是什么意思呢。0自然就是指的原始視頻,這句的意思就是將[img1]疊加到0對象的視頻上。本例中就是把image1.png疊加到input.mp4上。這里需要注意的就是順序:后一個對象疊加到前一個上,后一個對象在上層。如果寫成[img1][0:v],那相對本例其實就是把視頻疊加到圖片imge1.png上。這樣的話一般來說由于視頻通常是全屏,等于用視頻覆蓋了圖片,水印完全看不到了。
好,我們又把這個操作的結(jié)果命名為[bkg],那么接下來[bkg][img2]的意思就很明了了。就是把image2.png再疊加上去,image2.png是在最上層的,如果位置重合的話,他會遮蓋 image1.png的水印。
于是,事就這樣成了。
加個餐
1.水印的移動:
這里需要用到時間參數(shù)。
比如:overlay=0+t*20:0
這里在x坐標(biāo)上加上了+t*10,于是水印就會慢慢向右邊移動。
2.特定時間顯示水?。?br> 這次不僅要用到時間參數(shù),還要用上條件語句。
overlay=x='if(gte(t,2),10,NAN)':(main_h-overlay_h)/2
if條件語句的基本結(jié)構(gòu)就是
if(條件,條件為true時的值,條件為false時的值)
再來看看計算表達(dá)式。
這里用到了表達(dá)式gte(x,y)。如果x大于等于y則表達(dá)式的值為1,反之為0。
所以if(gte(t,2),10,NAN)的意思就是,當(dāng)時間大于等于2秒時,水印x位置為10,反之不顯示水印。(或者你也可以用lte來判斷“小于或等于”)
要了解所有表達(dá)式的話,可以去啃一下ffmpeg官方文檔的Expression Evaluation部分。