FFmpeg Filter
1. 概念介紹
在多媒體處理中,術語濾鏡(filter)指的是修改未編碼的原始音視頻數據幀的一種軟件工具。
2. 基本原理
● 在編碼前,ffmpeg可以對raw(真實/原)音頻和視頻使用libavfilter庫中的濾鏡進行處理。(非壓縮數據幀)
● 多個濾鏡可以組成濾鏡鏈圖(濾鏡鏈圖filtergraphs )。
● 在ffmpeg看來只有2種濾鏡:簡單濾鏡,復合濾鏡。
2.1 簡單濾鏡
簡單濾鏡就是只有1個輸入和輸出的濾鏡,濾鏡兩邊的數據都是同一類型的,可以理解為在非壓縮數據幀到再次編碼前簡單附加了一步:


2.2 復合濾鏡
complex filtergraph,通常是具有多個輸入輸出文件,並有多條執行路徑;ffmpeg命令行中使用-lavfi、-filter_complex,基本原理圖如下:

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

在這個濾鏡鏈圖中,利用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)一個濾鏡鏈圖包含序列濾鏡鏈,這個序列有“;”分隔各個濾鏡鏈描述

一個濾鏡由一個字符串表單表示:
[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

生成圖:

下載鏈接 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)
-
ffmpeg -i good_scale.mp4 -i mark.png -filter_complex overlay good_mark.mp4
-
ffmpeg -i good_scale.mp4 -i mark.png -filter_complex overlay=main_w-overlay_w-10:main_h-overlay_h-10 good_mark.mp4
- crop:視頻/圖像的裁剪(https://ffmpeg.org/ffmpeg-filters.html#crop)
- 裁剪尺寸為200x200的中央輸入區域
ffplay -i good_scale.mp4 -vf crop=200:200
- 裁剪長寬200x200,位置(100,0)左上角起始
ffplay -i good_scale.mp4 -vf crop=w=200:h=200:x=100:y=0
- 從左右邊界裁剪10個像素,從上下邊界裁剪20個像素
ffplay -i good_scale.mp4 -vf crop=in_w-210:in_h-220
- 應用顫抖效果
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)
- 截取視頻10s到30s的內容,這里音頻還在
ffmpeg -i good_scale.mp4 -vf trim=10:30 good_trim.mp4
- 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)
ffplay -i Irving_360p.mp4 -vf "crop=iw/2:ih:0:0,split[left][tmp];[tmp]hflip[right];[left][right] hstack"
ffplay -i Irving_360p.mp4 -vf "split [main][tmp]; [tmp] crop=iw:ih/2:0:0, vflip [flip]; [main][flip] overlay=0:H/2"
ffplay -i good.mp4 -vf boxblur=luma_radius=2:luma_power=1
- 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=low=0.1:high=0.4"
添加油畫效果
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則提供對硬件加速視頻處理的訪問,處理流程圖如下。

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文件序列。
(8) 視頻中去水印delogo
ffmpeg -i good_mark.mp4 -vf delogo=x=10:y=10:w=100:h=60 delogo.mp4
(ffmpeg -i good_scale.mp4 -i mark.png -filter_complex overlay=10:10 good_mark.mp4 加水印)
6. 參考文章
[1]. http://ffmpeg.org/ffmpeg.html#Filtering
[2]. https://ffmpeg.org/ffmpeg-filters.html
[3]. https://www.bookstack.cn/read/other-doc-cn-ffmpeg/ffmpeg-doc-cn-30.md
[4]. FFmpeg filter的使用介紹
[5]. https://www.bogotobogo.com/FFMpeg/ffmpeg_image_scaling_jpeg.php
[6]. 使用gprof2dot和graphivz生成程序運行調用圖
[7]. Graphviz 畫圖和例子
[8]. Graphviz典型例子
[9]. https://restream.io/blog/what-is-low-latency/
[10]https://www.jianshu.com/p/297fd1cb52c6