(9)ffmpeg濾鏡概念入門,了解并嘗試簡(jiǎn)單濾鏡
往期回顧。

第六和第八期的最后我們都提到了“濾鏡”:一個(gè)是硬嵌字幕的“-vf subtitles”,一個(gè)是拼接媒體文件的“-filter_complex "concat"”。這期我們就來(lái)講講什么是ffmpeg的“濾鏡”。
注意這里的“濾鏡”和在我們平常生活中理解的比如說(shuō)手機(jī)“美顏濾鏡”,ps、lr里的“調(diào)色濾鏡”有點(diǎn)不同。除了畫(huà)面,ffmpeg的“濾鏡”還能處理音頻和字幕。
說(shuō)白了,這個(gè)意義上的ffmpeg“濾鏡”就像某種“預(yù)設(shè)”。我們通過(guò)使用某個(gè)這些“預(yù)設(shè)”的操作,設(shè)定相關(guān)參數(shù),來(lái)把音視頻、字幕處理成某種想要的效果。
一、濾鏡相關(guān)概念
上面所說(shuō)的ffmpeg“濾鏡”,是我們平時(shí)討論這整塊內(nèi)容的概稱。當(dāng)要進(jìn)一步討論時(shí),它通常包含如下概念:
濾鏡輸入流:輸入給濾鏡處理的流。簡(jiǎn)稱輸入流。
濾鏡輸出流:濾鏡處理完后輸出的流。簡(jiǎn)稱輸出流。
注意兩點(diǎn)。一是“被濾鏡處理”。如果所輸入或輸出的流沒(méi)有被濾鏡處理過(guò),那不能算是輸入流和輸出流。二是,這里的輸入輸出流和第六篇說(shuō)的“流”的概念不同。“流”、軌道流是針對(duì)音視頻、字幕這些類型來(lái)說(shuō),不同類型就是不同的“流”。輸入輸出流是針對(duì)“濾鏡處理對(duì)象”來(lái)說(shuō),濾鏡對(duì)A進(jìn)行了處理,A就是它的輸入流,濾鏡處理完后輸出了B,B就是它的輸出流。比如把兩個(gè)視頻軌輸入給overlay濾鏡處理之后輸出了一個(gè)視頻軌,那就說(shuō)這個(gè)濾鏡現(xiàn)在有兩個(gè)輸入流,一個(gè)輸出流。
簡(jiǎn)單濾鏡:指輸入流和輸出流都只有一個(gè),而且輸入流和輸出流的類型相同的濾鏡。例如subtitles濾鏡,它只是利用所輸入的字幕文件來(lái)對(duì)輸入流進(jìn)行處理,字幕文件本身沒(méi)有得到任何處理也沒(méi)有被輸出。因此它的輸入流是待硬嵌字幕的視頻,輸出流是字幕硬嵌完的視頻。這樣,輸入流和輸出流都只有一個(gè),且都是視頻流,所以subtitles濾鏡是簡(jiǎn)單濾鏡。
復(fù)雜濾鏡:指存在不止一個(gè)輸入流或輸出流,或者存在不同類型的輸入輸出流的濾鏡。例如concat、overlay濾鏡。
濾鏡:泛指單個(gè)的濾鏡。像subtitles、concat、overlay,這里是三個(gè)濾鏡。
濾鏡鏈:按一定順序方向運(yùn)作的一組濾鏡。比如同時(shí)使用a、b、c這三個(gè)濾鏡,它們按從左到右這個(gè)確定順序運(yùn)行,那就稱它們是一個(gè)濾鏡鏈。注意a、b、c是可以任意搭配起來(lái)的濾鏡,這里沒(méi)有特指一定是哪個(gè),也沒(méi)有特指一定要按某種搭配才是一個(gè)濾鏡鏈。在這例子里少了c,或者多加一個(gè)任意的d,都仍稱為一個(gè)濾鏡鏈。
簡(jiǎn)單濾鏡鏈:按一定順序方向運(yùn)作的一組只有一個(gè)且類型都相同的輸入輸出流的簡(jiǎn)單濾鏡。
復(fù)雜濾鏡鏈:按一定順序方向運(yùn)作的一組存在不止一個(gè)或類型不同的輸入輸出流的濾鏡。
(注:簡(jiǎn)單、復(fù)雜濾鏡鏈?zhǔn)莡p為了方便思考理解所提出的推廣概念,目前up沒(méi)有在其它地方查閱到這兩個(gè)概念的說(shuō)明)
濾鏡圖:?jiǎn)蝹€(gè)或多個(gè)按一定順序方向運(yùn)作的濾鏡、濾鏡鏈都統(tǒng)稱濾鏡圖。濾鏡圖是這里最大最廣義的概念。就像工程圖紙,濾鏡圖描述的是整個(gè)的“濾鏡處理”過(guò)程。
簡(jiǎn)單濾鏡圖:只有簡(jiǎn)單濾鏡或簡(jiǎn)單濾鏡鏈的濾鏡圖。
復(fù)雜濾鏡圖:存在復(fù)雜濾鏡或復(fù)雜濾鏡鏈的濾鏡圖。
濾鏡的運(yùn)行方向順序也一樣默認(rèn)是按命令行從左到右。命令行其它參數(shù)操作和濾鏡之間,各濾鏡鏈之內(nèi)、之間都是默認(rèn)前者的輸出內(nèi)容作為后者的輸入內(nèi)容。沒(méi)有輸入流的濾鏡稱為“源(source)”,沒(méi)有輸出流的濾鏡稱為“槽(sink)"。
二、濾鏡的分類,相關(guān)參數(shù)介紹,濾鏡圖的寫(xiě)法
如上文所說(shuō),ffmpeg濾鏡按“處理過(guò)程”可以分為簡(jiǎn)單濾鏡、復(fù)雜濾鏡。但通常在查詢上我們是按“處理對(duì)象”分為視頻濾鏡、音頻濾鏡。“ffmpeg -filters”可以查看其所有支持的濾鏡。
注意,這個(gè)分類是從濾鏡所處理的“流”類型來(lái)分類的,處理的是視頻流就是視頻濾鏡,是音頻流就是音頻濾鏡。它們與簡(jiǎn)單、復(fù)雜濾鏡的關(guān)系如下圖:

至此,對(duì)濾鏡分類概念的認(rèn)識(shí)非常清楚了。在判斷音視頻濾鏡上,我們就看被濾鏡所處理的“流”的類型;在判斷簡(jiǎn)單或復(fù)雜濾鏡上,既看“流”類型,也看輸入輸出流的數(shù)量。輸入輸出流都各只有一個(gè)且“流”類型都相同,就是簡(jiǎn)單濾鏡,否則就是復(fù)雜濾鏡。
濾鏡的簡(jiǎn)易使用形式例如:-vf 濾鏡圖=相應(yīng)設(shè)置,-af 濾鏡圖=相應(yīng)設(shè)置,-filter_complex 濾鏡圖 "相 應(yīng) 設(shè) 置"(空格和引號(hào)的道理都一樣)。下面介紹使用各種濾鏡時(shí)所采用的參數(shù):
“-vf”,視頻簡(jiǎn)單濾鏡參數(shù),也可給圖像使用。如“-vf subtitles=.\in.ass”,表示以in.ass字幕文件在所輸入該濾鏡的視頻流上繪制文本字幕。注意圖像也屬于視頻流。
“-af”,音頻簡(jiǎn)單濾鏡參數(shù)。如“-af "volume=1.5"”,表示增大原音量的一半。
“-filer_complex”,復(fù)雜濾鏡參數(shù)。如“-filer_complex overlay”。
“-lavfi”,復(fù)雜濾鏡參數(shù)。如“-lavfi amerge”。
注意,復(fù)雜濾鏡參數(shù)可以用上視頻或音頻簡(jiǎn)單濾鏡,相當(dāng)于可代替“-vf”或“-af”,當(dāng)然也可以用上各種濾鏡或?yàn)V鏡鏈。像“-lavfi volume”、“-lavfi subtitles”。
另外類似“-c”,在舊版本中的“-filter:v”、“-filter:a”分別就是現(xiàn)在的“-vf”、“-af”,這些至今都依然適用。
最后說(shuō)說(shuō)濾鏡圖的寫(xiě)法:濾鏡鏈?zhǔn)褂?#34;;"分隔,濾鏡鏈中的濾鏡使用","分隔。
例如-af "atempo=2.0,atempo=2.0"、-lavfi "[0:v]steps=0.5*PTS[v];[0:a]atempo=2.0[a]"。這里像“-map”的道理,在每個(gè)濾鏡的前后設(shè)置所輸入輸出的軌道流。如[v]表示steps濾鏡輸出的視頻流標(biāo)記為[v]。[a]同理。
一個(gè)完整的濾鏡命令行例如:ffmpeg -y -i in1.mp4 -i in2.jpg -filter_complex "[1:v]crop=1920:1080:0:100,format=yuv420p,loop=loop=120:size=1,framerate=30[v1];[0:v][v1]concat=n=2:v=1:a=0[v]" -map "[v]" -map 0:a -crf 20 -r 30 -c:a copy out.mp4
三、簡(jiǎn)單濾鏡的介紹及嘗試運(yùn)用
這里介紹幾個(gè)簡(jiǎn)單濾鏡,大家可以嘗試運(yùn)用,感受一下~
scale,-vf scale=1920:1080,縮放輸入視頻的尺寸并/或改變圖像格式。(-vf scale=iw/2:-1,意為將輸入媒體的寬高尺寸縮放為原來(lái)的一半且寬高比不變,iw 是指輸入媒體的寬度,-1是通知縮放濾鏡在輸出時(shí)保持原始的寬高比)
steps,-vf "steps=0.5*PTS",二倍速播放視頻,設(shè)置輸出視頻幀的顯示時(shí)間戳(Presentation Time Stamp),可以用于快放或慢放等。(注:可能會(huì)導(dǎo)致丟幀,要想避免丟幀,可用設(shè)置輸出的幀率比輸入的幀率高的辦法。如四倍速播放,輸入幀率為4,則設(shè)置輸出幀率為16)
crop,-vf crop=w:h:x:y,以給定的視頻尺寸截取輸入視頻。(w:h是所要截取所寬和高,x:y是以視頻最左上角為原點(diǎn)(0,0)的坐標(biāo))
pad,-vf pad=w:h:x:y:color,給輸入視頻添加填充新的顯示區(qū)域。(w:h是最后輸出帶上新區(qū)域的寬和高,x:y是以視頻最左上角為原點(diǎn)的坐標(biāo),color是所填充的顏色,如black)
atempo,-af?atempo=2.0,二倍速播放音頻,調(diào)整音頻播放速度,范圍是0.5~2.0。(-af "atempo=2.0,atempo=2.0",可用多個(gè)atempo濾鏡來(lái)實(shí)現(xiàn)四倍速音頻)
更多濾鏡介紹請(qǐng)看這個(gè)網(wǎng)址:
ffmpeg濾鏡中英文對(duì)照:https://www.cnblogs.com/nlsoft/p/5195172.html
感謝你觀看到這里。