前言
Github
地址:Github
簡(jiǎn)書(shū)地址:簡(jiǎn)書(shū)
專(zhuān)輯地址:FFplay專(zhuān)輯
29.130 prewitt
應(yīng)用prewitt
運(yùn)算符輸入視頻流伴找。
過(guò)濾器接受以下選項(xiàng):
planes
設(shè)置要處理的平面斟赚,將復(fù)制未處理的平面。 默認(rèn)值為0xf
咖刃,將處理所有平面互站。
scale
設(shè)定值將與過(guò)濾結(jié)果相乘。
delta
設(shè)置將添加到篩選結(jié)果的值僵缺。
29.131 program_opencl
使用OpenCL
程序過(guò)濾視頻。
source
OpenCL
程序源文件踩叭。
kernel
程序中的內(nèi)核名稱(chēng)磕潮。
inputs
過(guò)濾器的輸入數(shù)量。 默認(rèn)為1
容贝。
size, s
輸出幀的大小自脯。 默認(rèn)值與第一個(gè)輸入相同。
程序源文件必須包含具有給定名稱(chēng)的內(nèi)核函數(shù)斤富,該函數(shù)將針對(duì)輸出的每個(gè)平面運(yùn)行一次膏潮。 平面上的每次運(yùn)行都會(huì)作為單獨(dú)的2D
全局NDRange
排隊(duì),每個(gè)像素都會(huì)生成一個(gè)工作項(xiàng)满力。 因此焕参,每個(gè)工作項(xiàng)的全局ID
偏移量是目標(biāo)圖像中像素的坐標(biāo)。
內(nèi)核函數(shù)需要采用以下參數(shù):
- 目標(biāo)圖像油额,
__ write_only image2d_t
叠纷。
??這個(gè)圖像將成為輸出; 內(nèi)核應(yīng)該寫(xiě)出所有內(nèi)容。
- 幀索引潦嘶,
unsigned int
涩嚣。
??這是一個(gè)從零開(kāi)始的計(jì)數(shù)器,每幀增加一個(gè)。
- 源圖像航厚,
__ read_only image2d_t
顷歌。
??這些是每個(gè)輸入的最新圖像。 內(nèi)核可以從它們讀取以生成輸出幔睬,但是它們無(wú)法寫(xiě)入眯漩。
示例程序如下:
-
將輸入復(fù)制到輸出(輸出必須與輸入的大小相同)。
__kernel void copy(__write_only image2d_t destination, unsigned int index, __read_only image2d_t source) { const sampler_t sampler = CLK_NORMALIZED_COORDS_FALSE; int2 location = (int2)(get_global_id(0), get_global_id(1)); float4 value = read_imagef(source, sampler, location); write_imagef(destination, location, value); }
-
應(yīng)用簡(jiǎn)單的轉(zhuǎn)換溪窒,使用索引計(jì)數(shù)器增加一個(gè)量的輸入坤塞。 采樣器對(duì)像素值進(jìn)行線(xiàn)性插值,輸出的尺寸不必與輸入相同澈蚌。
__kernel void rotate_image(__write_only image2d_t dst, unsigned int index, __read_only image2d_t src) { const sampler_t sampler = (CLK_NORMALIZED_COORDS_FALSE | CLK_FILTER_LINEAR); float angle = (float)index / 100.0f; float2 dst_dim = convert_float2(get_image_dim(dst)); float2 src_dim = convert_float2(get_image_dim(src)); float2 dst_cen = dst_dim / 2.0f; float2 src_cen = src_dim / 2.0f; int2 dst_loc = (int2)(get_global_id(0), get_global_id(1)); float2 dst_pos = convert_float2(dst_loc) - dst_cen; float2 src_pos = { cos(angle) * dst_pos.x - sin(angle) * dst_pos.y, sin(angle) * dst_pos.x + cos(angle) * dst_pos.y }; src_pos = src_pos * src_dim / dst_dim; float2 src_loc = src_pos + src_cen; if (src_loc.x < 0.0f || src_loc.y < 0.0f || src_loc.x > src_dim.x || src_loc.y > src_dim.y) write_imagef(dst, dst_loc, 0.5f); else write_imagef(dst, dst_loc, read_imagef(src, sampler, src_loc)); }
-
將兩個(gè)輸入混合在一起摹芙,每個(gè)輸入的使用量隨索引計(jì)數(shù)器而變化。
__kernel void blend_images(__write_only image2d_t dst, unsigned int index, __read_only image2d_t src1, __read_only image2d_t src2) { const sampler_t sampler = (CLK_NORMALIZED_COORDS_FALSE | CLK_FILTER_LINEAR); float blend = (cos((float)index / 50.0f) + 1.0f) / 2.0f; int2 dst_loc = (int2)(get_global_id(0), get_global_id(1)); int2 src1_loc = dst_loc * get_image_dim(src1) / get_image_dim(dst); int2 src2_loc = dst_loc * get_image_dim(src2) / get_image_dim(dst); float4 val1 = read_imagef(src1, sampler, src1_loc); float4 val2 = read_imagef(src2, sampler, src2_loc); write_imagef(dst, dst_loc, val1 * blend + val2 * (1.0f - blend)); }
29.132 pseudocolor
用偽彩色改變視頻中的幀顏色宛瞄。
此過(guò)濾器接受以下選項(xiàng):
c0
設(shè)置像素第一組件表達(dá)式浮禾。
c1
設(shè)置像素第二組件表達(dá)式。
c2
設(shè)置像素第三組件表達(dá)式份汗。
c3
設(shè)置像素第四個(gè)組件表達(dá)式盈电,對(duì)應(yīng)于alpha
組件。
i
設(shè)置組件以用作改變顏色的基礎(chǔ)杯活。
它們中的每一個(gè)都指定用于計(jì)算相應(yīng)像素分量值的查找表的表達(dá)式匆帚。
表達(dá)式可以包含以下常量和函數(shù):
w
h
輸入的寬度和高度。
val
像素組件的輸入值旁钧。
ymin吸重,umin,vmin歪今,amin
允許的最小組件值嚎幸。
ymax,umax寄猩,vmax嫉晶,amax
允許的最大組件值。
所有表達(dá)式默認(rèn)為val
田篇。
29.132.1 示例
-
將太高的亮度值更改為漸變:
pseudocolor="'if(between(val,ymax,amax),lerp(ymin,ymax,(val-ymax)/(amax-ymax)),-1):if(between(val,ymax,amax),lerp(umax,umin,(val-ymax)/(amax-ymax)),-1):if(between(val,ymax,amax),lerp(vmin,vmax,(val-ymax)/(amax-ymax)),-1):-1'"
29.133 psnr
獲取兩個(gè)輸入視頻之間的平均替废,最大和最小PSNR
(峰值信噪比)。
此過(guò)濾器輸入兩個(gè)輸入視頻泊柬,第一個(gè)輸入被視為"main"
源舶担,并且不變地傳遞到輸出。 第二輸入用作用于計(jì)算PSNR
的"reference"
視頻彬呻。
兩個(gè)視頻輸入必須具有相同的分辨率和像素格式才能使此濾鏡正常工作衣陶。 此外柄瑰,它假設(shè)兩個(gè)輸入具有相同的幀數(shù),逐個(gè)進(jìn)行比較剪况。
通過(guò)測(cè)井系統(tǒng)打印獲得的平均PSNR
教沾。
濾波器存儲(chǔ)每幀的累積MSE
(均方誤差),并且在處理結(jié)束時(shí)译断,它在所有幀上均等地平均授翻,并且應(yīng)用以下公式來(lái)獲得PSNR
:
PSNR = 10*log10(MAX^2/MSE)
其中MAX
是圖像每個(gè)分量的最大值的平均值。
接下來(lái)的參數(shù)的描述如下孙咪。
stats_file堪唐,f
如果指定,則過(guò)濾器將使用指定的文件來(lái)保存每個(gè)幀的PSNR
翎蹈。當(dāng)filename
等于-
時(shí)淮菠,數(shù)據(jù)被發(fā)送到標(biāo)準(zhǔn)輸出。
stats_version
指定要使用的stats
文件格式的版本荤堪。每種格式的詳細(xì)信息如下合陵。默認(rèn)值為1
。
stats_add_max
確定是否將最大值輸出到統(tǒng)計(jì)日志澄阳。默認(rèn)值為0
拥知。需要stats_version> = 2
。如果設(shè)置且stats_version <2
碎赢,則過(guò)濾器將返回錯(cuò)誤低剔。
此過(guò)濾器還支持framesync
選項(xiàng)。
如果選擇了stats_file
肮塞,則打印的文件包含表單鍵的鍵/值對(duì)序列:每個(gè)比較的幀對(duì)的值襟齿。
如果指定了stats_version
大于1
,則標(biāo)題行位于每幀對(duì)統(tǒng)計(jì)數(shù)據(jù)列表之前峦嗤,其中鍵值對(duì)遵循幀格式,并帶有以下參數(shù):
psnr_log_version
日志文件格式的版本屋摔。將匹配stats_version
烁设。
fields
日志中包含的每幀對(duì)參數(shù)的逗號(hào)分隔列表。
每個(gè)所示的每幀對(duì)參數(shù)的描述如下:
n
輸入幀的序號(hào)钓试,從1開(kāi)始
mse_avg
均方誤差在所有圖像分量上平均的比較幀的逐像素平均差異装黑。
mse_y,mse_u弓熏,mse_v恋谭,mse_r,mse_g挽鞠,mse_b疚颊,mse_a
均值平方誤差由后綴指定的組件的比較幀的逐像素平均差異狈孔。
psnr_y,psnr_u材义,psnr_v均抽,psnr_r,psnr_g其掂,psnr_b油挥,psnr_a
由后綴指定的組件的比較幀的峰值信噪比。
max_avg款熬,max_y深寥,max_u,max_v
每個(gè)通道的最大允許值贤牛,以及所有通道的平均值惋鹅。
例如:
movie = ref_movie.mpg,setpts = PTS-STARTPTS [main];
[main] [ref] psnr =“stats_file = stats.log”[out]
在此示例中盔夜,正在處理的輸入文件與參考文件ref_movie.mpg
進(jìn)行比較负饲。每個(gè)幀的PSNR
存儲(chǔ)在stats.log
中。
29.134 pullup
下拉式反轉(zhuǎn)(反轉(zhuǎn)電視電影)過(guò)濾器喂链,能夠處理混合的硬電視電影返十,24000/1001 fps
漸進(jìn)和30000/1001 fps
漸進(jìn)內(nèi)容。
上拉濾波器旨在利用未來(lái)的背景來(lái)做出決策椭微。 此過(guò)濾器在沒(méi)有鎖定到要跟隨的模式的意義上是無(wú)狀態(tài)的洞坑,但它反過(guò)來(lái)期待以下字段以識(shí)別匹配并重建漸進(jìn)幀。
要生成具有均勻幀率的內(nèi)容蝇率,請(qǐng)?jiān)谏侠蟛迦?code>fps濾波器迟杂,如果輸入幀速率為29.97fps
,則使用fps = 24000/1001
本慕,對(duì)于30fps
使用fps = 24
排拷,使用(稀有)電視電影25fps
輸入。
過(guò)濾器接受以下選項(xiàng):
jl
jr
jt
jb
這些選項(xiàng)分別在圖像的左側(cè)锅尘,右側(cè)监氢,頂部和底部設(shè)置要忽略的"junk"
量。 左和右以8
像素為單位藤违,而頂部和底部以2
行為單位浪腐。 默認(rèn)值是每邊8
像素。
sb
設(shè)置嚴(yán)格的休息時(shí)間顿乒。 將此選項(xiàng)設(shè)置為1
將減少濾波器生成偶然不匹配幀的機(jī)會(huì)议街,但也可能導(dǎo)致在高運(yùn)動(dòng)序列期間丟棄過(guò)多幀。 相反璧榄,將其設(shè)置為-1
將使過(guò)濾器匹配字段更容易特漩。 這可以幫助處理視頻吧雹,其中字段之間存在輕微模糊,但是也可能導(dǎo)致輸出中存在交錯(cuò)幀拾稳。 默認(rèn)值為0
吮炕。
mp
設(shè)置要使用的度量標(biāo)準(zhǔn)平面。 它接受以下值:
值 | 解釋 |
---|---|
l | 使用luma plane
|
u | 使用chroma blue plane
|
v | 使用chroma red plane
|
可以將此選項(xiàng)設(shè)置為使用色度平面而不是默認(rèn)亮度平面來(lái)進(jìn)行濾波器的計(jì)算访得。 這可以提高非常干凈的源材料的準(zhǔn)確度龙亲,但更有可能降低精度,尤其是在存在色度噪聲(彩虹效應(yīng))或任何灰度視頻的情況下悍抑。 將'mp'
設(shè)置為色度平面的主要目的是減少CPU
負(fù)載并使上拉在慢速機(jī)器上實(shí)時(shí)可用鳄炉。
為獲得最佳結(jié)果(輸出文件中沒(méi)有重復(fù)的幀),必須更改輸出幀速率搜骡。 例如拂盯,要反轉(zhuǎn)電視電影NTSC
輸入:
ffmpeg -i input -vf pullup -r 24000/1001 ...
29.135 qp
更改視頻量化參數(shù)(QP
)。
過(guò)濾器接受以下選項(xiàng):
qp
設(shè)置量化參數(shù)的表達(dá)式记靡。
表達(dá)式通過(guò)eval API
進(jìn)行評(píng)估谈竿,并且可以包含以下常量:
known
如果index
不是129
則為1
,否則為0
摸吠。
qp
順序索引從-129
到128
空凸。
29.135.1 示例
-
一些方程如下:
qp=2+2sin(PIqp)
29.136 random
將幀內(nèi)部緩存中的視頻幀刷新為隨機(jī)順序。 沒(méi)有幀被丟棄寸痢。 靈感來(lái)自frei0r神經(jīng)過(guò)濾器呀洲。
frames
設(shè)置內(nèi)部緩存幀數(shù)的大小,范圍為2
到512
啼止。默認(rèn)值為30
道逗。
seed
為隨機(jī)數(shù)生成器設(shè)置種子,必須是0
到UINT32_MAX
之間的整數(shù)献烦。 如果未指定滓窍,或者顯式設(shè)置為小于0
,則過(guò)濾器將嘗試在盡力而為的基礎(chǔ)上使用良好的隨機(jī)種子巩那。
29.137 readeia608
從視頻幀的頂行讀取隱藏式字幕(EIA-608)
信息吏夯。
此過(guò)濾器為lavfi.readeia608.X.cc
和lavfi.readeia608.X.line
添加幀元數(shù)據(jù),其中X
是具有EIA-608
數(shù)據(jù)的標(biāo)識(shí)行的編號(hào)(從0
開(kāi)始)拢操。每個(gè)元數(shù)據(jù)值的描述如下:
lavfi.readeia608.X.cc
這兩個(gè)字節(jié)存儲(chǔ)為EIA-608
數(shù)據(jù)(以十六進(jìn)制打咏跻唷)舶替。
lavfi.readeia608.X.line
識(shí)別和讀取EIA-608
數(shù)據(jù)的行號(hào)令境。
此過(guò)濾器接受以下選項(xiàng):
scan_min
設(shè)置該行以開(kāi)始掃描EIA-608
數(shù)據(jù)。默認(rèn)值為0
顾瞪。
scan_max
將行設(shè)置為結(jié)束掃描EIA-608
數(shù)據(jù)舔庶。默認(rèn)值為29
抛蚁。
mac
設(shè)置同步碼檢測(cè)的最小可接受幅度變化。默認(rèn)值為0.2
惕橙。允許范圍為[0.001 - 1]
瞧甩。
spw
設(shè)置為同步代碼檢測(cè)保留的寬度比率。默認(rèn)值為0.27
弥鹦。允許范圍為[0.01 - 0.7]
肚逸。
mhd
設(shè)置同步代碼檢測(cè)的最大峰高差。默認(rèn)值為0.1
彬坏。允許范圍是[0.0 - 0.5]
朦促。
mpd
設(shè)置同步代碼檢測(cè)的最大峰值周期差。默認(rèn)值為0.1
栓始。允許范圍是[0.0 - 0.5]
务冕。
msd
設(shè)置前兩個(gè)最大起始碼位差異。默認(rèn)值為0.02
幻赚。允許范圍是[0.0 - 0.5]
禀忆。
bhd
設(shè)置與第3
個(gè)起始碼位相比的位高度的最小比率。默認(rèn)值為0.75
落恼。允許范圍為[0.01 - 1]
箩退。
th_w
設(shè)置白色閾值。默認(rèn)值為0.35
领跛。允許范圍是[0.1 - 1]
乏德。
th_b
設(shè)置黑色閾值。默認(rèn)值為0.15
吠昭。允許范圍是[0.0 - 0.5]
喊括。
chp
啟用檢查奇偶校驗(yàn)位。如果出現(xiàn)奇偶校驗(yàn)錯(cuò)誤矢棚,則過(guò)濾器將為該字符輸出0x00
郑什。默認(rèn)值為false
。
29.137.1 示例
-
輸出具有顯示時(shí)間的
csv
和識(shí)別的EIA-608
字幕數(shù)據(jù)的前兩行蒲肋。ffprobe -f lavfi -i movie=captioned_video.mov,readeia608 -show_entries frame=pkt_pts_time:frame_tags=lavfi.readeia608.0.cc,lavfi.readeia608.1.cc -of csv
29.138 readvitc
從視頻幀的頂行讀取垂直間隔時(shí)間碼(VITC
)信息蘑拯。
如果檢測(cè)到有效時(shí)間碼,則過(guò)濾器將幀元數(shù)據(jù)密鑰lavfi.readvitc.tc_str
與時(shí)間碼值相加兜粘。 根據(jù)是否已找到時(shí)間碼數(shù)據(jù)申窘,將進(jìn)一步的元數(shù)據(jù)鍵lavfi.readvitc.found
設(shè)置為0/1
。
此過(guò)濾器接受以下選項(xiàng):
scan_max
設(shè)置要掃描VITC
數(shù)據(jù)的最大行數(shù)孔轴。 如果該值設(shè)置為-1
剃法,則掃描完整的視頻幀。 默認(rèn)值為45
路鹰。
thr_b
設(shè)置黑色的亮度閾值贷洲。 接受[0.0,1.0]
范圍內(nèi)的浮點(diǎn)數(shù)收厨,默認(rèn)值為0.2
。 該值必須等于或小于thr_w
优构。
thr_w
設(shè)置白色的亮度閾值诵叁。 接受[0.0,1.0]
范圍內(nèi)的浮點(diǎn)數(shù),默認(rèn)值為0.6
钦椭。 該值必須等于或大于thr_b
拧额。
29.138.1 示例
-
檢測(cè)
VITC
數(shù)據(jù)并將其繪制到視頻幀上; 如果沒(méi)有檢測(cè)到有效的VITC
,請(qǐng)繪制--:--:--:--
作為占位符:ffmpeg -i input.avi -filter:v 'readvitc,drawtext=fontfile=FreeMono.ttf:text=%{metadata\\:lavfi.readvitc.tc_str\\:--\\\\\\:--\\\\\\:--\\\\\\:--}:x=(w-tw)/2:y=400-ascent'
29.139 remap
使用2nd:Xmap
和3rd:Ymap
輸入視頻流重新映射像素彪腔。
將從源(x势腮,y)
位置拾取位置(X,Y)
處的目標(biāo)像素漫仆,其中x = Xmap(X捎拯,Y)
并且y = Ymap(X,Y)
盲厌。 如果映射值超出范圍署照,則像素的零值將用于目標(biāo)像素。
Xmap
和Ymap
輸入視頻流必須具有相同的尺寸吗浩。 輸出視頻流將具有Xmap / Ymap
視頻流尺寸建芙。 Xmap
和Ymap
輸入視頻流是16bit
深度,單通道懂扼。