天天看點

FFmpeg 濾鏡詳解

FFmpeg Filter

1. 概念介紹

在多媒體進行中,術語濾鏡(filter)指的是修改未編碼的原始音視訊資料幀的一種軟體工具。

2. 基本原理

● 在編碼前,ffmpeg可以對raw(真實/原)音頻和視訊使用libavfilter庫中的濾鏡進行處理。(非壓縮資料幀)

● 多個濾鏡可以組成濾鏡鍊圖(濾鏡鍊圖filtergraphs )。

● 在ffmpeg看來隻有2種濾鏡:簡單濾鏡,複合濾鏡。

2.1 簡單濾鏡

簡單濾鏡就是隻有1個輸入和輸出的濾鏡,濾鏡兩邊的資料都是同一類型的,可以了解為在非壓縮資料幀到再次編碼前簡單附加了一步:

FFmpeg 濾鏡詳解

image

FFmpeg 濾鏡詳解

2.2 複合濾鏡

complex filtergraph,通常是具有多個輸入輸出檔案,并有多條執行路徑;ffmpeg指令行中使用-lavfi、-filter_complex,基本原理圖如下:

FFmpeg 濾鏡詳解

2.3 原理示例

在libavfilter, 一個filter可以包含多個輸入、多個輸出。下圖是一個filtergraph的示例:

FFmpeg 濾鏡詳解

        在這個濾鏡鍊圖中,利用split濾鏡把輸入流分離成了兩路流,其中一路通過crop濾鏡和vfilp濾鏡的同一路級聯應用,再同另外一路一起通過overlay濾鏡處理的流合成進行輸出。則可以采用如下的指令行實作:

        這個filtergraph可以用下面指令行表示:

ffmpeg -i INPUT -vf "split [main][tmp]; [tmp] crop=iw:ih/2:0:0, vflip [flip]; [main][flip] overlay=0:H/2" OUTPUT

        這樣最終輸出将是視訊上部是原始,下部是上部的鏡像。(倒影效果)

ffplay -i Irving_360p.mp4 -vf "split [main][tmp]; [tmp] crop=iw:ih/2:0:0, vflip [flip]; [main][flip] overlay=0:H/2"

        同一路的濾鏡間用逗号(‘,’)進行分割,不同路的濾鏡間用分号(‘;’)進行分割。

        在這個例子裡面crop和vflip是在同一路中的濾鏡,split和overlay則不是同一路的(同一路的級聯是對連續的視訊進行,如果涉及到一輸多、多輸一或者多輸多則都不是在同一路的,即不是同一路級聯)。可以通過在方括号(’[]’)中的标簽名來命名處理的鍊路。這個例子裡,split濾鏡生成了兩路就通過[main]和[tmp]進行了标簽命名以友善後續處理。

        其中被split處理輸出的第二路流被命名為[tmp],它又被crop濾鏡處理裁去下半部視訊,然後通過vflip進行了水準鏡像(垂直翻轉,即把視訊鏡像到下半部了)。這是整個輸出被命名為flip。再把[main]與flip通過overlay進行覆寫合成,即把源輸入通過split濾鏡獲得的[main]的上半部分覆寫到由crop和vflip濾鏡級聯處理的輸出(這裡的[flip])上最終得到了鏡像結果。

        一些濾鏡支援參數清單: 濾鏡名=由冒号(‘:’)隔開的多個參數

2.4 例子

        比如視訊縮放、截取、翻轉、疊加、模糊等。其中定義了很多的filter,例如以下常用的一filter。

縮放

ffplay -i good.mp4 -vf scale=iw/2:ih/2

疊加

ffmpeg -i good_scale.mp4 -i mark.png -filter_complex overlay=main_w-overlay_w-10:main_h-overlay_h-10 good_mark.mp4

裁剪

ffplay -i good_scale.mp4 -vf crop=w=200:h=200:x=100:y=0

截取視訊

ffmpeg -i good_scale.mp4 -vf trim=10:30 good_trim.mp4

模糊

ffplay -i good.mp4 -vf boxblur=luma_radius=2:luma_power=1

邊緣檢測

ffplay -i good_scale.mp4 -vf "edgedetect=low=0.1:high=0.4"

3. Filter的文法

        一個濾鏡鍊圖(filtergraph)是連接配接濾鏡的有向圖。它可以包含循環動作,也可以在多個濾鏡間形成鍊路,每個連結都有一個連接配接到濾鏡的輸入和一個連接配接到濾鏡的輸出。(參考)

        濾鏡鍊圖采用文本表示,其有由一些ffmpeg和ffplay通用的選項-filter/-vf/-af和-filter_complex(ffmpeg)以及-vf/-af(ffplay)外加定義與libavfilter/avfilter.h的avfilter_graph_parse_ptr()等來描述。

(1)一個濾鏡鍊包含序列連結起來的濾鏡,這個序列由“,”分隔各個濾鏡描述;

(2)一個濾鏡鍊圖包含序列濾鏡鍊,這個序列有“;”分隔各個濾鏡鍊描述

FFmpeg 濾鏡詳解

一個濾鏡由一個字元串表單表示:

[input_link_lable1][input_link_lable2]... filter_name=parameters [output_link_lable1][output_link_lable12]...

(1) 輸入輸出都有連接配接标号(link lable),連接配接符号是可選項,在濾鏡名和參數前 和 後 有一個連接配接标簽清單。一個連接配接标簽允許命名1個名字的連接配接,其作為濾鏡的輸入或者輸出端口。

如果一個輸出端沒有命名标簽,它預設連接配接到濾鏡鍊上後面濾鏡中第一個沒有命名标簽的輸入端

(2) filter_name是濾鏡類名字

(3) =arguments用于指定濾鏡選項:參數表示法如下規則

        (3.1)“:”分隔的key=value清單

舉個例子:ffplay -i good.mp4 -vf scale=iw/2:ih/2

        (3.2)一個“:”分隔的清單value值,在這種情況下,鍵(key)假定為選項名聲明順序

舉個例子:ffplay -i good_scale.mp4 -vf fade=in:0:30(淡入視訊的前30幀),按順序聲明了3個選項type、start_frame和nb_frames

        (3.3)上面兩個規則混用

        (3.4)如果選項的值本身就是一個清單(例如format濾鏡有一個像素格式清單選項),則這種清單通常用“|”分隔

舉個例子:将輸入視訊轉換為清單中的任何格式

ffmpeg -i good_scale.mp4 -vf "format=pix_fmts=yuv420p|yuv444p|yuv410p" format.mp4

4. 功能工具

4.1 工具graph2dot

FFmpeg工具目錄下包含一個graph2dot程式可以用來分析濾鏡鍊圖描述并産生用dot語言描述的對應文本表示。

指令:dot -Tpng graph.tmp -o graph.png

描述檔案:graph.tmp

FFmpeg 濾鏡詳解

生成圖:

FFmpeg 濾鏡詳解

下載下傳連結 https://graphviz.org/download/

github的位址 https://github.com/jrfonseca/gprof2dot.git

更多例子見附錄的參考。

4.2 時間線編輯

        一些濾鏡支援正常的enable選項。對于支援時間線編輯的濾鏡,這個選項可以被設定為一個表達式,其通過評估之前的情況來決定是否把幀畫面發送給濾鏡。

        例如,要在1秒到20秒允許一個blur(模糊)濾鏡(smartblur),然後curves濾鏡在3秒之後:

        ffplay -i good_scale.mp4 -vf "smartblur=enable='between(t,1,20)',curves=enable='gte(t,3)':preset=cross_process"

4.3 實時更新Filter參數

        在過濾器操作期間,可以使用指令更改某些選項。

這些選項在ffmpeg -h filter = <過濾器名稱>的輸出上标記為“ T”。指令的名稱是選項的名稱,參數是新值。

4.4 幀同步

一些具有多個輸入的過濾器支援一組通用選項。

(1) eof_action(在secondary input上遇到EOF時采取的措施)

repeat\endall\pass

(2)shortest(如果設定為1,則在最短輸入終止時強制輸出終止。預設值為0。)

(3)repeatlast(如果設定為1,則強制過濾器将輔助流的最後一幀擴充到主流的末尾。值為0禁用此行為。預設值為1。)

5. Filter指令詳解

source filter(僅輸出)、sink filter(僅輸入)

5.1 指令分類

(1) audio filter

        (1.1)Audio Base

        (1.2)Audio Sources

        (1.3)Audio Sinks

(2) video filter

        (2.1)Base Video Filters

        (2.2)OpenCL Video Filters

        (2.3)VAAPI Video Filters

        (2.4)Video Sources

        (2.5)Video Sinks

(3)Multimedia filter

        (3.1)Multimedia

        (3.2)Multimedia Sources

5.2 Audio Base(96)

8.1 acompressor (壓縮器主要用于減小信号的動态範圍,調整響度db)

8.2 acontrast (簡單的音頻動态範圍壓縮/擴充濾波器。)

ps:音響的動态範bai圍是指音響裝置重放du時最大不失真輸出功率與靜态時系統zhi噪音輸出功dao率之比的對數。機關為分貝(dB)。一般性能較好的音響系統的動态範圍在100(dB)以上。

8.3 acopy (将輸入音頻源原樣複制到輸出。這主要用于測試目的。)

8.4 acrossfade(将交叉淡入淡出從一個輸入音頻流應用于另一輸入音頻流。交叉淡入淡出将在第一個流的結尾附近的指定持續時間内應用。)

ffmpeg -i ca.mp3 -i see.mp3 -filter_complex acrossfade=d=10:c1=exp:c2=exp output.mp3

8.5 acrossover(将音頻流分成幾個頻段。該濾波器将音頻流分成兩個或多個頻率範圍。)

sub bass[20~65hz]這裡是顯示聲音力量感的頻段

Bass[65~250hz]定義聲音肥瘦 節奏根音大都在在這個頻段 提高250hz左右的頻段可以在不影響清晰度的情況下給低頻增加溫暖感

中頻[250~2000hz]決定了一個樂器有多突出 提升1000hz的頻段可以給樂器增加質感 但這個頻段過多使人感覺不适可能導緻聽覺疲勞

中高頻[2000~6000hz]人耳對這個頻段尤其敏感 即使提升很小的量 也會給聲音造成質變 對這個頻段需要小心處理

高頻[6000~10000hz]這個頻段可以聽到一些刺耳的聲音 提高這個頻段可以增加明亮感 降低這個頻段增加溫暖感

8.6 acrusher(降低音頻位分辨率。用于減少音頻信号的采樣位數。使聲音柔和)

8.7 acue(延遲音頻過濾,直到給定的牆上時鐘時間戳。)

8.8 adeclick (消除輸入音頻中的脈沖噪聲。)

8.9 adeclip (從輸入音頻中删除剪輯的樣本。)

8.10 adelay (延遲一個或多個音頻通道。)

ffplay -i ca.mp3 -af "adelay=1500|0|500"

8.11 aderivative, aintegral (計算音頻流的導數/積分。)

8.12 aecho (将回聲應用于輸入音頻。)

更長的延遲聽起來像山區的露天音樂會(輸入增益:輸出增益:延遲:衰變)

ffplay -i ca.mp3 -af "aecho=0.8:0.9:1000:0.3"

8.13 aemphasis(音頻強調過濾器可以建立或恢複直接從具有不同過濾器曲線的LP或重點CD中擷取的素材。先通過濾波器更改信号,以消除該記錄媒體的缺點。)

8.14 aeval(根據指定的表達式修改音頻信号。)

采樣率、輸入輸出通道數、音量等

ffplay -i ca.mp3 -af "aeval=val(ch)/5:c=same"(音量減小到1/5)

8.15 afade(将淡入/淡出效果應用于輸入音頻。)

ffplay -i ca.mp3 -af "afade=t=in:ss=0:d=15" (淡入15秒)

8.16 afftdn(使用FFT對音頻樣本進行除噪。)

8.17 afftfilt(将任意表達式應用于頻域中的樣本)

在音頻中幾乎隻保留低頻

ffplay -i ca.mp3 -af afftfilt="'real=re * (1-clip((b/nb)b,0,1))':imag='im * (1-clip((b/nb)b,0,1))'"

8.18 afir (應用任意的有限沖激響應濾波器。可用作數字分頻器濾波器,房間均衡,串擾消除,波場合成,聽覺化,歧義,歧義和空間化的元件。)

8.19 aformat (設定輸入音頻的輸出格式限制。該架構将協商最合适的格式以最​​大程度地減少轉化。)

8.20 agate(門控主要用于減少信号的過低。這種信号處理可減少有用信号之間的幹擾噪聲。)

8.21 aiir(應用任意的無限沖激響應濾波器。)

在5000Hz左右施加2極橢圓形陷波,采樣率為48000 Hz

ffplay -i ca.mp3 -af "aiir=k=1:z=7.957584807809675810E-1 -2.575128568908332300 3.674839853930788710 -2.57512875289799137 7.957586296317130880E-1:p=1 -2.86950072432325953 3.63022088054647218 -2.28075678147272232 6.361362326477423500E-1:f=tf:r=d"

8.22 alimiter(限幅器可防止輸入信号超過所需的門檻值。)

8.23 allpass(全通濾波器可更改音頻的頻率與相位關系,而不會更改其頻率與振幅關系。)

8.24 aloop (循環音頻樣本。)

8.25 amerge(将兩個或多個音頻流合并為一個多通道流。)

8.26 amix(将多個音頻輸入混合為一個輸出。)

8.27 amultiply(将第一音頻流與第二音頻流相乘,并将結果存儲在輸出音頻流中。通過将來自第一流的每個樣本與來自第二流的相同位置的樣本相乘來完成乘法。)

8.28 anequalizer(每個通道的高階參數多頻帶均衡器。)

8.29 anlmdn(使用非本地均值算法減少音頻樣本中的寬帶噪聲。)

8.30 anlms(使用第二個音頻流将标準化的最小均方算法應用于第一個音頻流。)

8.31 anull(将未更改的音頻源傳遞到輸出。)

8.32 apad(用靜音填充音頻流的結尾。)

8.33 aphaser(向輸入音頻添加定相效果。)

8.34 apulsator(音頻脈沖發生器介于自動調音台和顫音之間。但是它也可以産生有趣的立體聲效果。)

8.35 aresample(使用libswresample庫将輸入音頻重新采樣為指定的參數。使用libswresample庫将輸入音頻重新采樣為指定的參數。)

ffplay -i ca.mp3 -af aresample=44100

8.36 areverse(反轉音頻剪輯。)

8.37 arnndn(使用遞歸神經網絡減少語音噪聲。需要模型檔案)

8.38 asetnsamples(設定每個輸出音頻幀的樣本數。)

8.39 asetrate(在不更改PCM資料的情況下設定采樣率。這将導緻速度和螺距的變化。)

8.40 ashowinfo(顯示一行,其中包含每個輸入音頻幀的各種資訊。輸入音頻未修改。)

8.41 asoftclip(應用音頻軟剪輯。)

8.42 asr(自動語音識别,需要模型)

8.43 astats(顯示有關音頻通道的時域統計資訊。計算并顯示每個音頻通道的統計資訊,并在适用的情況下還提供總體數字。)

8.44 asubboost(提高低音炮頻率。)

8.45 atempo(調整音頻速度。)

ffplay -i ca.mp3 -af atempo=3

8.46 atrim(修剪輸入,以便輸出包含輸入的一個連續子部分。)

删除除輸入第二分鐘外的所有内容

ffmpeg -i INPUT -af atrim=60:120

ffmpeg -i ca.mp3 -af atrim=5:30 ca_trim.mp3

8.47 axcorrelate(計算兩個輸入音頻流之間的歸一化互相關。)

8.48 bandpass

8.49 bandreject

8.50 bass, lowshelf(使用兩極置物架濾波器來增強或削減音頻的低音(較低)頻率,其響應類似于标準高保真音調控制。這也稱為擱架均衡(EQ)。)

8.51 biquad(應用具有給定系數的雙二階IIR濾波器。)

8.52 bs2b(鮑爾(Bauer)立體聲轉換為雙耳,可改善立體聲音頻記錄的耳機收聽效果。)

8.53 channelmap(将輸入通道重新映射到新位置。)

8.54 channelsplit(将每個通道從輸入音頻流拆分為單獨的輸出流。)

8.55 chorus(向音頻添加合唱效果。)

具有三個延遲的更豐富的合唱:

ffplay -i ca.mp3 -af "chorus=0.5:0.9:50|60|40:0.4|0.32|0.3:0.25|0.4|0.3:2|2.3|1.3"

8.56 compand(壓縮或擴充音頻的動态範圍。)

使音樂既安靜又響亮,适合在嘈雜的環境中收聽

ffplay -i ca.mp3 -af "compand=.3|.3:1|1:-90/-60|-60/-40|-40/-30|-20/-20:6:0:-90:0.2"

8.57 compensationdelay(補償延遲線是基于度量的延遲,用于補償麥克風或揚聲器的不同位置。)

8.58 crossfeed(應用耳機交叉饋電過濾器。)

8.59 crystalizer(擴充音頻動态範圍的簡單算法。)

8.60 dcshift(對音頻應用直流偏移。)

8.61 deesser(測對音頻樣本進行de-essing處理。)

8.62 drmeter(測量音頻動态範圍。)

8.63 dynaudnorm(動态音頻規範化器。)

8.64 earwax(使音頻更易于在耳機上收聽。)

8.65 equalizer(應用兩極峰均化(EQ)濾波器。)

8.66 extrastereo(線性增加左右聲道之間的差異,進而在播放中增加某種“實時”效果)

8.67 firequalizer(使用任意頻率響應進行FOR均衡。)

8.68 flanger(對音頻應用鑲邊效果。)

8.69 haas(将哈斯效果應用于音頻。)

8.70 hdcd(解碼高清相容數字(HDCD)資料。具有嵌入式HDCD代碼的16位PCM流被擴充為20位PCM流)

8.71 headphone

8.72 highpass

8.73 join(将多個輸入流合并為一個多通道流。)

8.74 ladspa(加載LADSPA(Linux音頻開發人員的簡單插件API)插件。要啟用此過濾器的編譯,您需要使用--enable-ladspa配置FFmpeg。)

8.75 loudnorm

8.76 lowpass(應用點頻為3dB的低通濾波器。)

8.77 lv2

8.78 mcompand

8.79 pan

8.80 replaygain

8.81 resample

8.82 rubberband

8.83 sidechaincompress

8.84 sidechaingate

8.85 silencedetect(檢測音頻流中的靜音。)

8.86 silenceremove(消除音頻開頭,中間或結尾的靜音。)

8.87 sofalizer

8.88 stereotools

8.89 stereowiden

8.90 superequalizer

8.91 surround

8.92 treble, highshelf

8.93 tremolo

8.94 vibrato

8.95 volume(調整輸入音頻音量。)

8.96 volumedetect(檢測輸入視訊的音量。)

stereo雙聲道、mono單聲道

5.3 Audio Sources(輸出9)

9.1 abuffer(緩沖音頻幀,并使它們可用于過濾器鍊。該資源主要用于程式設計用途,尤其是通過libavfilter / buffersrc.h中定義的接口。)

9.2 aevalsrc(生成表達式指定的音頻信号。)

生成頻率為440 Hz的正弦信号,将采樣率設定為8000 Hz

ffplay -f lavfi aevalsrc="sin(4402PI*t):s=8000"

産生白噪聲

aevalsrc="-2+random(0)"

9.3 afirsrc(使用頻率采樣方法生成FIR系數。)

9.4 anullsrc(空音頻源,傳回未處理的音頻幀。它主要用作模闆并在分析/調試工具中使用,或用作忽略輸入資料的過濾器(例如sox合成過濾器)的來源。)

9.5 flite(使用libflite庫合成語音。要啟用此過濾器的編譯,您需要使用--enable-libflite配置FFmpeg。)

9.6 anoisesrc(産生噪音音頻信号。)

ffplay -f lavfi anoisesrc=d=60:c=pink:r=44100:a=0.5

9.7 hilbert(生成奇抽頭希爾伯特變換FIR系數。)

9.8 sinc(生成Sinc Kaiser窗式低通,高通,帶通或帶阻FIR系數。)

9.9 sine(生成由振幅為1/8的正弦波組成的音頻信号。)

5.4 Audio Sink(輸入2)

10.1 abuffersink(緩沖音頻幀,并使它們可用于過濾器鍊的末尾。該接收器主要用于程式設計用途,尤其是通過libavfilter / buffersink.h或選項系統中定義的接口。)

10.2 anullsink(空音頻接收器;輸入音頻絕對不做任何事情。它主要用作模闆并用于分析/調試工具。)

5.5 單輸入音頻過濾處理流程

音頻解碼後,可以avfilter api對解碼出來的AVFrame進行效果處理,如音量調節,變速處理。多個音頻輸入還可以進行混音處理單輸入過濾器解碼流程

解碼出

AVFrame -> abuffer-> 其他過濾器(volume)...->aformat->abuffersink->過濾後的AVFrame

這裡看到有三個通用的過濾器,abuffer,aformat,abuffersink。abuffer用于接收輸入frame,形成待處理的資料緩存,abuffersink用于傳出輸出Frame,aformat過濾器限制最終的輸出格式(采樣率,聲道數,存儲位數等),這三個不可缺少。而中間的其他過濾器可以串聯多個filter,如volume,atempo

5.6 Base Video Filters(245)

比如視訊縮放、截取、翻轉、疊加、模糊等。其中定義了很多的filter,例如以下常用的一filter。

  • scale:視訊/圖像的縮放(libswscale, 強制原輸入的高寬比)(https://ffmpeg.org/ffmpeg-filters.html#scale-1)

(1)ffplay -i good.mp4 -vf scale=640:360

(2)ffplay -i good.mp4 -vf scale=iw/2:ih/2

(3)ffmpeg -i mark.png -vf scale=iw2:ih2 mark_scale.png

  • overlay:視訊/圖像的疊加(https://ffmpeg.org/ffmpeg-filters.html#overlay-1)
  1. ffmpeg -i good_scale.mp4 -i mark.png -filter_complex overlay good_mark.mp4
  • crop:視訊/圖像的裁剪(https://ffmpeg.org/ffmpeg-filters.html#crop)
  1. 裁剪尺寸為200x200的中央輸入區域

ffplay -i good_scale.mp4 -vf crop=200:200

  1. 裁剪長寬200x200,位置(100,0)左上角起始
  1. 從左右邊界裁剪10個像素,從上下邊界裁剪20個像素

ffplay -i good_scale.mp4 -vf crop=in_w-210:in_h-220

  1. 應用顫抖效果

ffplay -i good_scale.mp4 -vf "crop=in_w/2:in_h/2:(in_w-out_w)/2+((in_w-out_w)/2)sin(n/10):(in_h-out_h)/2 +((in_h-out_h)/2)sin(n/7)"

  • trim:截取視訊的片段(https://ffmpeg.org/ffmpeg-filters.html#trim)
  1. 截取視訊10s到30s的内容,這裡音頻還在
  • rotate:以任意角度旋轉視訊(https://ffmpeg.org/ffmpeg-filters.html#rotate)

(1)順時針旋轉輸入PI / 6弧度

ffplay -i good_scale.mp4 -vf rotate=PI/6

(2)從PI / 3的角度開始,以周期T進行恒定旋轉(T=10就是10s)

ffplay -i good_scale.mp4 -vf "rotate=PI/3+2PIt/T:fillcolor = red"

(3)使輸入視訊旋轉以T秒的周期和A弧度的幅度振蕩(A = 5, T = 10)

ffplay -i good_scale.mp4 -vf rotate=Asin(2PI/T*t)

  • 左右翻轉(https://ffmpeg.org/ffmpeg-filters.html#hflip)

ffplay -i Irving_360p.mp4 -vf "crop=iw/2:ih:0:0,split[left][tmp];[tmp]hflip[right];[left][right] hstack"

  • 上下翻轉(https://ffmpeg.org/ffmpeg-filters.html#vflip)
  • 模糊(https://ffmpeg.org/ffmpeg-filters.html#boxblur)
  • colorchannelmixer 可以設定rgba四個分量的變換關系,共接受16個參數

rrrgrbragrgggbgabrbgbbbaaragabaa

參數本質就是權重求值時候的權重,每個參數接受0-1得值,濾鏡本

質是将每個顔色值權重求值.公式:red=redrr+bluerb+greenrg+alphara 。green/blue和alpha同理。參數預設值對應得是1,其他為0.如:rr,rg,rb,ra。其中rr預設為1,其他為0。

ffplay -i good_scale.mp4 -vf "colorchannelmixer=.3:.4:.3:0:.3:.4:.3:0:.3:.4:.3"

之是以會是灰階效果,原因是将每個顔色分量相等,是以rgb混合後為透明度不同得黑色

褐色處理:

ffplay -i good_scale.mp4 -vf "colorchannelmixer=.393:.769:.189:0:.349:.686:.168:0:.272:.534:.131"

  • edgedetect 邊緣檢測

感覺這個最好還是當作中間操作來用,因為單純過這個濾鏡并不會有什麼美感,但是邊緣檢測卻是實作其他操作的必經之路,比如:油畫效果,卡通片效果等等。

添加油畫效果

ffplay -i good_scale.mp4 -vf "edgedetect=mode=colormix:high=0"

  • geq 功能特别強大,因為它不僅僅因為它接受的參數衆多,而且表達式也很多,是以可以動态的設定很多東西,甚至可以跟播放進度産生關系,進而達到視訊閃爍的效果。

根據像素位置修改RGB分量

ffplay -i good_scale.mp4 -vf "geq=r='X/Wr(X,Y)':g='(1-X/W)g(X,Y)':b='(H-Y)/H*b(X,Y)'"

5.7 OpenCL Video Filters(17)

要啟用這些過濾器的編譯,需要使用--enable-opencl配置FFmpeg。運作OpenCL篩選器要求您初始化硬體裝置,并将該裝置傳遞給任何篩選器圖中的所有篩選器。

由于OpenCL過濾器無法通路普通記憶體中的幀資料,是以所有幀資料需要先上傳(hwupload)到連接配接到适當裝置的硬體表面,然後再使用,然後再下載下傳(hwdownload)回到普通存儲器。請注意,hwupload将以與軟體架構相同的布局上載到表面,是以可能有必要在将輸入轉換為正确格式之前立即添加格式過濾器,并且hwdownload不支援輸出中的所有格式-這可能必須在圖表後立即插入一個附加的格式過濾器,以擷取受支援格式的輸出。

12.1 avgblur_opencl

12.2 boxblur_opencl

12.3 colorkey_opencl(RGB色彩空間顔色鍵控。)

12.4 convolution_opencl(應用3x3、5x5、7x7矩陣的卷積)

12.5 erosion_opencl(對視訊應用腐蝕效果。)

12.6 deshake_opencl(基于特征點的視訊穩定濾波器。防抖)

12.7 dilation_opencl(将膨脹效果應用于視訊。)

12.8 nlmeans_opencl(通過OpenCL的非本地均值降噪過濾器)

12.9 overlay_opencl(将一個視訊疊加在另一個視訊上。)

12.10 pad_opencl(将填充物添加到輸入圖像,并将原始輸入放置在提供的x,y坐标處。)

12.11 prewitt_opencl

12.12 program_opencl(使用OpenCL程式過濾視訊。)

12.13 roberts_opencl

12.14 sobel_opencl(應用Sobel運算符,邊緣檢測用的算子)

12.15 tonemap_opencl(通過色調映射執行HDR(PQ / HLG)到SDR的轉換。)

12.16 unsharp_opencl(銳化或模糊輸入視訊。)

12.17 xfade_opencl(使用OpenCL交叉淡化具有自定義過渡效果的兩個視訊。)

5.8 VAAPI Video Filters(Video Acceleration API)

針對Intel CPU X86架構平台,可采用FFmpeg+VAAPI的硬解方案。其中,FFmpeg用于處理各種格式的視訊解碼;VAAPI則提供對硬體加速視訊處理的通路,處理流程圖如下。

FFmpeg 濾鏡詳解

VAAPI視訊過濾器通常與VAAPI解碼器和VAAPI編碼器一起使用。以下是VAAPI視訊過濾器的說明。要啟用這些過濾器的編譯,您需要使用--enable-vaapi配置FFmpeg

5.9 Video Sources(10)

(1)cellauto 建立由基本元胞自動機生成的模式。

ffplay -f lavfi -i cellauto=ratio=2/3:s=200x200

(2)mptestsrc 生成由MPlayer測試過濾器生成的各種測試模式。

ffplay -f lavfi -i mptestsrc=t=dc_luma

(3)life 生成細胞動态模式。

ffplay -f lavfi -i life=s=300x200:mold=10:r=60:ratio=0.1:death_color=#C83232:life_color=#00ff00,scale=1200:800:flags=16

5.10 Multimedia Filter(30)

用于音頻轉為視訊的顯示(頻率等),

16.1 abitscope(将輸入音頻轉換為視訊輸出,顯示音頻位範圍。)

16.2 adrawgraph(使用輸入的音頻中繼資料繪制圖形。)

16.3 agraphmonitor

16.4 ahistogram(将輸入音頻轉換為視訊輸出,顯示音量直方圖。)

16.5 aphasemeter(測量輸入音頻的相位,将其導出為中繼資料l)

16.6 avectorscope(将輸入音頻轉換為視訊輸出,代表音頻矢量範圍。)

ffplay -f lavfi "amovie=ca.mp3, asplit [a][out1]; [a] avectorscope=zoom=1.3:rc=2:gc=200:bc=10:rf=1:gf=8:bf=7 [out0]"

16.7 bench, abench(篩選器的基準部分。)

16.8 concat(連接配接音頻和視訊流,一個接一個地将它們連接配接在一起。該過濾器适用于同步視訊和音頻流的片段。所有段的每種類型必須具有相同數量的流,并且這也将是輸出中的流數量。)

16.9 ebur128

16.10 interleave, ainterleave(臨時交錯來自多個輸入的幀。)

16.11 metadata, ametadata

16.12 perms, aperms

16.13 realtime, arealtime

16.14 select, aselect(選擇要傳遞的幀。)

16.15 sendcmd, asendcmd

16.16 setpts, asetpts(更改輸入幀的PTS(示範時間戳記)。)

16.17 setrange

16.18 settb, asettb

16.19 showcqt(将輸入音頻轉換為代表頻譜的視訊輸出)

ffplay -f lavfi "amovie=ca.mp3, asplit [a][out1]; [a] showcqt [out0]"

ffplay -f lavfi "aevalsrc=0.1sin(2PI55t)+0.1sin(4PI55t)+0.1sin(6PI55t)+0.1sin(8PI55t),asplit[a][out1]; [a] showcqt [out0]"

16.20 showfreqs(将輸入音頻轉換為代表音頻功率譜的視訊輸出)

16.21 showspatial(将立體聲輸入音頻轉換為視訊輸出,以表示兩個通道之間的空間關系。)

16.22 showspectrum

将輸入音頻轉換為代表音頻頻譜的視訊輸出。

ffplay -f lavfi "amovie=ca.mp3, asplit [a][out1]; [a] showspectrum=mode=separate:color=intensity:slide=1:scale=cbrt [out0]"

16.23 showspectrumpic

16.24 showvolume(将輸入音頻音量轉換為視訊輸出。)

16.25 showwaves

16.26 showwavespic

16.27 sidedata, asidedata

16.28 spectrumsynth

16.29 split, asplit(将輸入音頻音量轉換為視訊輸出。split使用音頻輸入,使用視訊分割。)

16.30 zmq, azmq

5.11 Multimedia Source

movie/amovie

從movie容器中讀取音頻和/或視訊流。

6. 水印、截圖、人物濾鏡等常用指令

        (1) 水印 overlaye

ffmpeg -i good_scale.mp4 -i mark.png -filter_complex overlay=10:10 good_mark.mp4

        (2) 人物濾鏡 colorchannelmixer

        (3) 截取視訊片段 copy

ffmpeg -ss 5 -i input.mp4 -t 10 -c:v copy -c:a copy output.mp4

//-ss 5指定從輸入視訊第5秒開始截取,-t 10指明最多截取10秒。

        (4) 把視訊檔案推送到rtmp伺服器(ffmpeg -re -i jack.mp4 -c copy -f flv rtmp://host/live/test)

        (5) 分離/合并視訊音頻流 (copy)

ffmpeg -i input-video -vn -c:a copy output-audio //分離音頻流

ffmpeg -i input-video -c:v copy -an output-video //分離視訊流

ffmpeg -i input-video -c:v copy -an output-video -c:a -vn output-audio //同時分離音頻和視訊流

ffmpeg -i video_file -i audio_file -c:v copy -c:a copy output_file //合并視訊音頻流

        (6) 視訊截圖

ffmpeg -ss 01:23:45 -i input -vframes 1 -q:v 2 output.jpg

        (7) 圖檔序列與視訊的互相轉換

ffmpeg -i %04d.jpg output.mp4

ffmpeg -i input.mp4 %04d.jpg

\第一行指令是把0001.jpg、0002.jpg、0003.jpg等編碼成output.mp4,

\第二行則是相反把input.mp4變成0001.jpg……。

\%04d.jpg表示從1開始用0補全的4位整數為檔案名的jpg檔案序列。

6. 參考文章

上一篇: css濾鏡基礎