37 视频滤镜
在配置编译FFmpeg时可以通过--disable-filters
来禁止所有滤镜的编译。也可以配置编译脚本来输出所有包含进编译的滤镜信息。
下面是当前可用的视频滤镜介绍。
alphaextract
把输入视频作为灰度视频来提取透明通道,它通常和alphamerge
滤镜联用。
alphamerge
通过添加或者替换透明通道,让主要视频与另外一路视频混合。这里主要是使用alphaextract
来让不支持透明通道的视频成为允许传输或存储帧透明的帧序列
例如:为了重建完整的帧,让一个普通的YUV编码视频和利用了alphaextract
的一个单独的视频混合:
movie=in_alpha.mkv [alpha]; [in][alpha] alphamerge [out]
因为这个滤镜专为重建帧设计,所以它的运行过程中没有考虑时间戳,而是在输入达到流结束时终止。这可能将导致编码管道丢帧,如果你仅想实现一个图像叠加到视频,建议采用overlay
滤镜。
ass
类似subtitles
,除了它不需要libavcodec
和libavformat
。另一方面,它受限于ASS(Advanced Substation Alpha-高级子透明)字幕格式文件
这个滤镜除了subtitles
滤镜选项外还接受下面选项:
-
shaping
设置图像引擎,有效的值有:
‘auto’
默认的`libass`图像引擎,它是最合适的值
‘simple’
快, 仅采用font-agnostic图像
‘complex’
慢,采用OpenType。
默认为auto.
bbox
在输入的亮度平面上计算非黑边缘。
这个滤镜按设定的最小亮度值计算平面上所有像素图像的编译(按亮度——即按阀值连接起来构成多个区块,阀值连线即边缘)。描述边缘的参数会记录到滤镜日志中。
滤镜接受下面的选项:
-
min_val
设置最小的亮度值(其下认为是黑的,其上为非黑),默认16
blackdetect
检测视频(几乎)完全是黑色的时间间隔(段)。它可以用于检测章间的过渡、广告或者无效的录制。输出是以秒为单位的检测出黑场时间段的开始、结束和持续时间线信息。
为了显示(输出)时间线信息,你需要设置日志层次为AV_LOG_INFO
。
滤镜接受下面的选项:
-
black_min_duration, d
以秒为单位设置最小黑场持续时间(小于这个的不被检出),它必须是非负浮点数,默认为2.0
-
picture_black_ratio_th, pic_th
设置画面黑场检验标准,即图像中黑色像素占画面所有像素比的最小值:
nb_black_pixels / nb_pixels
如果画面中黑色像素占比大于这个值则判断当前画面是黑场画面,默认值为0.98
-
pixel_black_th, pix_th
设置判断像素是黑色像素的标准
采用像素亮度值来判断,只有像素亮度不大于一个设定的值(所确定的标准,见后)即为黑色像素。其依据下面的方程计算亮度:
absolute_threshold = luminance_minimum_value + pixel_black_th * luminance_range_size
luminance_range_size
和luminance_minimum_value
依赖于输入视频格式,范围为 对YUV全范围格式视频[0-255],非全范围格式[16-235]默认值0.10(对于YUV全范围格式,则计算值为 0+0.1255=25.5,对于非YUV全范围则为 16+0.1(235-16)=37.9)
下面的例子设置黑像素标准为最小值,黑场时长大于等于2秒:
blackdetect=d=2:pix_th=0.00
blackframe
判断(几乎)黑帧。它可以用于检测章间的过渡、广告等。输出内容包括检测到的黑帧数、占比和文件中的偏移(对文件格式支持检测,如果不支持检测为-1)和以秒为单位的时间戳。
为了显示这些输出信息,需要设置日志层次为AV_LOG_INFO
它接受下面的参数:
-
amount
像素为黑在帧中的占比百分比数,默认98
-
threshold, thresh
像素为黑的判断标准,默认为32
blend,tblend
混合两个视频帧
其中blend
混合两路输出1路流,第一个输入为top
层,二个路为bottom
层,输出以输入短的为结束。而tblend
(时间混合)需要从一个单独视频流的连续两帧,让新帧在上叠加在老帧上。
接受选项的介绍如下:
-
c0_mode
-
c1_mode
-
c2_mode
-
c3_mode
-
all_mode
设置混合模式(对指定像素或者所有像素——利用
all_mode
),默认值是normal
当前有效的混合模式如下:
‘addition’
‘and’
‘average’
‘burn’
‘darken’
‘difference’
‘difference128’
‘divide’
‘dodge’
‘exclusion’
‘glow’
‘hardlight’
‘hardmix’
‘lighten’
‘linearlight’
‘multiply’
‘negation’
‘normal’
‘or’
‘overlay’
‘phoenix’
‘pinlight’
‘reflect’
‘screen’
‘softlight’
‘subtract’
‘vividlight’
‘xor’ -
c0_opacity
-
c1_opacity
-
c2_opacity
-
c3_opacity
-
all_opacity
设置特定像素的透明度,或者设置整个透明度(利用
all_opacity
),仅用于组合像素混合模式blend
滤镜. -
c0_expr
-
c1_expr
-
c2_expr
-
c3_expr
-
all_expr
设置特定像素混合表达式或所有像素混合表达式(
all_expr
),注意如果它们被设定,则相关模式选项被忽略表达式可以采用下面的变量:
N
进入滤镜的帧序数,从0开始计数
X
Y样本点坐标(像素坐标)
W
H整个帧画面的宽和高(原始的)
SW
SH取决于当前滤镜平面的宽和高。它对应于像素亮度平面和当前平面的比值,如对于YUV4:2:0格式,则对于亮度平面为1,1,对于色度平面则是0.5,0.5
T
当前帧的时间,单位秒
TOP, A
`top`层的视频帧上当前像素值
BOTTOM, B
`bottom`层的视频帧上当前像素值
-
shortest
在短输入结束时强制结束,默认为0,只用于
blend
滤镜 -
repeatlast
在结束流后继续应用底帧。值为0表明不继续应用底帧,默认为1.选项只用于
blend
滤镜
blend,tblend例子
-
在前10秒应显示底帧:
blend=all_expr=‘A*(if(gte(T,10),1,T/10))+B*(1-(if(gte(T,10),1,T/10)))‘
-
显示1x1棋盘效应效果(有的显示A,有的显示B):
blend=all_expr=‘if(eq(mod(X,2),mod(Y,2)),A,B)‘
-
从左到右揭开的效果:
blend=all_expr=‘if(gte(N*SW+X,W),A,B)‘
-
从上到下揭开效果:
blend=all_expr=‘if(gte(Y-N*SH,0),A,B)‘
-
从右下向左上揭开效果:
blend=all_expr=‘if(gte(TSH40+Y,H)gte((T40*SW+X)*W/H,W),A,B)‘
-
显示当前和前一帧之间的差异:
tblend=all_mode=difference128
boxblur
对输入视频应用边缘虚化
接受下面的参数:
-
luma_radius, lr
-
luma_power, lp
-
chroma_radius, cr
-
chroma_power, cp
-
alpha_radius, ar
-
alpha_power, ap
接受选项的介绍见下:
-
luma_radius, lr
-
chroma_radius, cr
-
alpha_radius, ar
在输入平面,设置用于边缘模糊的像素半径表达式
这个半径必须是非负数,且必须在亮度和透明度(平面/通道上)大于min(w,h)/2,在色度平面上大于 min(cw,ch)/2
luma_radius
默认为2,如果没有指定 is "2".chroma_radius
和alpha_radius
默认是根据luma_radius
值的默认集表达式中允许下面内容:
w
h输入视频宽和高
cw
ch输入色度图像的高和宽
hsub
vsub水平和垂直采样的色彩浓度值,例如对于 "yuv422p"像素格式,`hsub`为2,`vsub`为1
-
luma_power, lp
-
chroma_power, cp
-
alpha_power, ap
指定应用于相应平面的边缘虚化滤镜次数。
默认
luma_power
为2,chroma_power
和alpha_power
的默认值是根据luma_power
的对于默认值集如果有1个值为0则禁止了效果
boxblur例子
-
对亮度、色度和透明都以2的半径进行边缘虚化(模糊):
boxblur=luma_radius=2:luma_power=1
boxblur=2:1 -
设置亮度编译模糊半径为2,而透明和色度模糊半径为0:
boxblur=2:1:cr=0:ar=0
-
设置亮度和色度模糊半径是视频维度的小部分(这里是1/10):
boxblur=luma_radius=min(h,w)/10:luma_power=1:chroma_radius=min(cw,ch)/10:chroma_power=1
codecview
可视化展示一些编码的信息
一些编码可以在图像的一端或者其他地方输出信息。例如一些MPEG
编码器就可以通过设置flags2
标志为export_mvs
来输出运动矢量检测信息
滤镜接受下面选项:
-
mv
设置运动矢量检测来可视化,
对
mv
选项有效的标志有:‘pf’
基于P帧的前向预测
‘bf’
基于B帧的前向预测
‘bb’
基于B帧的后向预测
codecview例子
-
基于P帧和B帧,可视化多径向运动矢量检测
ffplay -flags2 +export_mvs input.mpg -vf codecview=mv=pf+bf+bb
colorbalance
对输入帧编辑主要的颜色(红、绿和蓝)强度
滤镜用于对输入帧调整阴影、中间调或高亮区域实现 red-cyan(红和蓝绿), green-magenta(绿和品红) 或blue-yellow(蓝和黄)的平衡。
一个正向的调整值对应于平衡主要颜色,一个负数值则对应于补色。
滤镜接受下面的选项:
-
rs
-
gs
-
bs
调整red, green和blue的阴影(黑暗像素).
-
rm
-
gm
-
bm
调整red, green和blue的中间调 (中亮度像素).
-
rh
-
gh
-
bh
调整red, green和blue的高亮 (亮的像素).
所有值的取值范围为[-1.0, 1.0],默认为0(不调整)
colorbalance例子
-
添加影子的红色
colorbalance=rs=.3
colorkey
RGB颜色键控
滤镜接受下面的选项:
-
color
设置被作为透明的颜色
-
similarity
设置对色键的相似性百分比(表示也作为色键的颜色范围)
0.01匹配表示只有色键,而1表示所有颜色(相当于直接是透明了)
-
blend
混合百分比
0.0 表示像素完全透明或者完全不透明
更高的值导致半透明像素,对于更高的透明度相当于像素的颜色更接近于色键
colorkey例子
-
让所有的绿色像素透明
ffmpeg -i input.png -vf colorkey=green out.png
-
在绿屏上显示背景图片
ffmpeg -i background.png -i video.mp4 -filter_complex "[1:v]colorkey=0x3BBD1E:0.3:0.2[ckout];[0:v][ckout]overlay[out]" -map "[out]" output.flv
colorlevels
使用层来调整输入视频
滤镜接受下面的选项:
-
rimin
-
gimin
-
bimin
-
aimin
调整输入红、绿、蓝和透明的黑(标准),允许范围为[-1.0,1.0],默认为0
-
rimax
-
gimax
-
bimax
-
aimax
调整输入红、绿、蓝和透明的白(标准),允许范围为[-1.0,1.0],默认为1.
输入水平被用来减轻突出(明亮的色调),变暗阴影(暗色调),改变亮和暗的平衡
-
romin
-
gomin
-
bomin
-
aomin
调整输出红、绿、蓝和透明的黑(标准),允许范围为[-1.0,1.0],默认为0
-
romax
-
gomax
-
bomax
-
aomax
调整输出红、绿、蓝和透明的白(标准),允许范围为[-1.0,1.0],默认为1.
用来手动调整输出电平范围
colorlevels例子
-
让视频输出暗色调
colorlevels=rimin=0.058:gimin=0.058:bimin=0.058
-
增加对比度
colorlevels=rimin=0.039:gimin=0.039:bimin=0.039:rimax=0.96:gimax=0.96:bimax=0.96
-
让视频更亮
colorlevels=rimax=0.902:gimax=0.902:bimax=0.902
-
增加亮度
colorlevels=romin=0.5:gomin=0.5:bomin=0.5
colorchannelmixer
通过重新混合颜色通道调整视频输入帧
这个滤镜通过在不同颜色通道对同一个像素添加与其他通道相关的值进行颜色调整,例如为了修改红色,输出会是:
red=red*rr + blue*rb + green*rg + alpha*ra
滤镜接受下面选项:
-
rr
-
rg
-
rb
-
ra
为调整输出的红色通道而进行参数设置(分别对应于根据红、绿、蓝和透明通道的权值),rr默认为1,其他默认为0
-
gr
-
gg
-
gb
-
ga
为调整输出的绿色通道而进行参数设置(分别对应于根据红、绿、蓝和透明通道的权值),gg默认为1,其他默认为0
-
br
-
bg
-
bb
-
ba
为调整输出的蓝色通道而进行参数设置(分别对应于根据红、绿、蓝和透明通道的权值),bb默认为1,其他默认为0
-
ar
-
ag
-
ab
-
aa
为调整输出的透明通道而进行参数设置(分别对应于根据红、绿、蓝和透明通道的权值),aa默认为1,其他默认为0
各个值的运行范围为[-2.0, 2.0].
colorchannelmixer例子
-
转换源到灰度模式
colorchannelmixer=.3:.4:.3:0:.3:.4:.3:0:.3:.4:.3
-
模拟墨色应用
colorchannelmixer=.393:.769:.189:0:.349:.686:.168:0:.272:.534:.131
colormatrix
颜色转换矩阵(常用于颜色标准转换)
滤镜接受下面的选项:
-
src
-
dst
分别指定源和目标的颜色矩阵模式。两个值都必须要设置。
接受的值为:
‘bt709’
BT.709
‘bt601’
BT.601
‘smpte240m’
SMPTE-240M
‘fcc’
FCC
例如要转换BT.601 到 SMPTE-240M需要:
colormatrix=bt601:smpte240m
copy
复制输入源,而不改变的输出,常用于测试。
crop
裁剪输入
接受下面的参数:
-
w, out_w
输出视频的宽,默认为
iw
。这个表达式只有过滤器配置是进行一次求值 -
h, out_h
输出视频的高,默认为
iw
。这个表达式只有过滤器配置是进行一次求值 -
x
输入的水平坐标,默认为(in_w-out_w)/2,每帧都计算
-
y
输入的垂直坐标,默认为(in_h-out_h)/2,每帧都计算
-
keep_aspect
如果设置为1,则强制输出采样输入一样的长宽比例,默认为0
这里 out_w
, out_h
, x
, y
参数都可以是表达式,包含下述意义:
-
x
-
y
计算x和y,通常每帧计算
-
in_w
-
in_h
输入的宽和高
-
iw
-
ih
同于
in_w
和in_h
-
out_w
-
out_h
输出的(裁剪后的)宽和高
-
ow
-
oh
同于
out_w
和out_h
-
a
同于
iw / ih
-
sar
输入的样本点(像素)长宽比
-
dar
输入显示样本点长宽比它同于
(iw / ih) * sar
-
hsub
-
vsub
水平和垂直颜色分量值。例如对于"yuv422p"的像素,
hsub
为2,vsub
为1 -
n
输入帧的序数,从0计数
-
pos
输入帧在文件中的偏移,如果未知则为
NAN
-
t
秒为单位的输入帧时间戳,如果时间戳未知则为
NAN
crop例子
-
从(12,34)开始裁剪出一个100x100的图像
crop=100:100:12:34
-
使用命名选项,同上例一样:
crop=w=100:h=100:x=12:y=34
-
在输入中心裁剪出100x100:
crop=100:100
-
裁剪输入的2/3区域:
crop=2/3in_w:2/3in_h
-
裁剪输入中心区域:
crop=out_w=in_h
crop=in_h -
据边缘100裁剪出中间部分.
crop=in_w-100:in_h-100:100:100
-
据左右10像素,上下20像素的中间部分
crop=in_w-210:in_h-220
-
保留右下角(四分后的右下部分)
crop=in_w/2:in_h/2:in_w/2:in_h/2
-
按黄金分割裁剪
crop=in_w:1/PHI*in_w
-
应用抖动效果
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)
-
取决于时间戳的不定照相效果:
crop=in_w/2:in_h/2:(in_w-out_w)/2+((in_w-out_w)/2)sin(t10):(in_h-out_h)/2 +((in_h-out_h)/2)sin(t13)"
-
让x依赖于y
crop=in_w/2:in_h/2:y:10+10*sin(n/10)
cropdetect
自动检测裁剪尺寸(自动去除边缘的黑部)
它计算必要的剪切参数并通过日志系统输出推荐的参数。检测尺寸对应于输入视频的黑色区域
它接受下面的参数:
-
limit
设置更高的黑色阀值。可以选择从0到所有(255,基于8位格式)。一组强度值更大的价值被认为是黑色。它默认为24。你也可以指定一个值在0.0和1.0之间,将按比例根据像素格式的位深计算
-
round
设置可行(分割出)的宽/高分割基数,默认为16。偏移量自动调整到视频的中心,对于平面维度采用2的倍数(4:2:2视频需要的),16已经可以满足大多数编码要求了
-
reset_count, reset
设置在处理多少帧后计数器重置以重新检测最佳裁剪区域。 默认为0.
它被用于通道标志混乱的视频。0表示不复位,并返回已播放视频的最大区域
curves
利用curves(曲线)实现颜色调整
这个滤镜模拟Adobe Photoshop 和GIMP的curves
工具。每个分量(红、绿和蓝)都由定义的N
个节点相互作用成为光滑的曲线来调整输入到输出的关系。其中x轴是像素从输入帧获取的值,而y轴则是对应作为输出帧的值(从而实现输入到输出的映射)。
默认原始的曲线实为(0,0)和(1,1)连接的直线。这种“变化”关系就是输出=输入,意味着没有变化。
滤镜允许根据设置的两点或者更多点产生一个新的分量关系曲线(采用自然三次样条插值法依次连接各个点形成的平滑曲线)。所有的点坐标中x和y值范围在[0,1],超出定义域的点都被抛弃。
如果定义中没有关键点定义在x=0,则自动添加点(0,0),类似,如果没有关键点定义在x=1,则自动添加一个(1,1)点。
下面是滤镜允许的选项:
-
preset
选定一个颜色预置(配置)。这个选项用在除了r,g,b选项的设置。在这种情况下,在后的选择作为实际预置。可用的预置有:
‘none’
‘color_negative’
‘cross_process’
‘darker’
‘increase_contrast’
‘lighter’
‘linear_contrast’
‘medium_contrast’
‘negative’
‘strong_contrast’
‘vintage’默认为none.
-
master, m
设置主要的关键点。这些关键点用于定义第二个通过映射。它们有时调用"luminance" 或者 "value"映射。它们可以被用于r, g, b 或者 all,因为它们更像一个后处理LUT。
-
red, r
对红色分量指定关键点
-
green, g
对绿色分量指定关键点
-
blue, b
对蓝色分量指定关键点
-
all
设置针对所有分量的关键点(对复合信号,但不包括主要的——即对单独设置了的分量外的其他分量的处理), 在这种情况下,没有单独设置的分量都采用这里的设置
-
psfile
指定一个Photoshop曲线文件(.asv)来导入设置
curves例子
-
略有增加中间层次的蓝色:
curves=blue=‘0.5/0.58‘
-
复古的效果:
curves=r=‘0/0.11 .42/.51 1/0.95‘:g=‘0.50/0.48‘:b=‘0/0.22 .49/.44 1/0.8‘
在这里,我们为每个分量设置以下坐标:
red
(0;0.11) (0.42;0.51) (1;0.95)
green
(0;0) (0.50;0.48) (1;1)
blue
(0;0.22) (0.49;0.44) (1;0.80)
-
前面的例子也可以通过预置实现:
curves=preset=vintage
-
或者更简单的:
curves=vintage
-
采用Photoshop预置并应用于绿色分量:
curves=psfile=‘MyCurvesPresets/purple.asv‘:green=‘0.45/0.53‘
dctdnoiz
采用2D DCT来降噪(频域滤波)
滤镜不能实时应用。
滤镜接受下面的选项:
-
sigma, s
设置固定的噪声标准差(西格玛——sigma)
这里的
sigma
用于确定一个固定的阀值3*sigma
,每个DCT系数(绝对值)如果低于这个阀值则被丢弃(认为是噪声)如果你需要更多高级的过滤特性,则需要
expr
默认为 0
-
overlap
为每个块重叠的像素数。如果滤镜非常慢,你可以降低这个值,从而在较少的成本下有效过滤各种纹理
如果重叠值不允许处理整个输入宽度或高度,将显示一个警告,且在边界不会运用
默认为blocksize-1,它通常是一个最佳设置
-
expr, e
设置系数表达式
对于每个DCT块的系数,表达式会计算得出一个乘数系数值
如果这里被设置,则
sigma
选项被忽略系数的绝对值可以通过
c
变量访问到 -
n
按位宽设置块尺寸。1远远小于n(1<<n),这决定于处理块的宽度和高度
默认值是3(对应于8x8)和 4(对应于16x16),注意改变这个值将极大影响处理速度,同时一个更大的块大小并不一定有好的降噪效果
dctdnoiz例子
-
以
sigma
为4.5降噪dctdnoiz=4.5
-
同上效果,但是采用了
expr
dctdnoiz=e=‘gte(c, 4.5*3)‘
-
块大小设置为16x16
dctdnoiz=15:n=4
decimate
定期重复的帧数丢弃
接受下面的选项:
-
cycle
指示要被丢弃的帧。设置为
N
表示如果一帧已经被重复N
次就被丢弃,默认为5 -
dupthresh
设置检验重复的阀值。如果帧间变化量小于等于阀值则被认为是重复的。默认为1.1.
-
scthresh
设置场景变化阀值,默认为15
-
blockx
-
blocky
设置x或y轴大小,其用于度量计算内存。更大的内存块可以更好的实现噪声抑制,但小的运动检测效果也越差。 必须是2的幂。,默认为32
-
ppsrc
标记一个输入是有预处理的,还有一个是原始源。它允许通过输入(经各种滤镜)预处理的源和原始源来更好的无损保持内容。设置为1时,第一个输入是经过预处理的输入流,第二个流是清洁源,其保留了原始的帧(信息)。 默认为0.
-
chroma
设置颜色通道是否也用这个矩阵计算。默认为1
dejudder
删除部分隔行电视电影的内容产生的颤动
颤动可被引发,例如通过pullup
滤镜,如果原始内容经pullup
产生向上的爬动效应,dejudder
可以引入动态帧频来消除。它可能会改变容器的帧频记录,除了这个改变,滤镜不会影响固定帧频视频的其他地方。
下面的选项被允许:
-
cycle
指定颤抖的重复窗口的长度
接受一个大于1的整数,常用值有:
‘4’
常用于把24帧电影转换为30帧的NTSC信号
‘5’
用于把25帧的PAL转换为30帧的NTSC
‘20’
前俩个的混合
默认为‘4’.
delogo
通过一个简单的插值周围像素来抑制台标。仅需要在台标周围设置一个矩形遮盖就可以消除台标(有时会出现莫名的东西)
它接受下面的参数:
-
x
-
y
指定台标覆盖的x和y坐标,必须被设置
-
w
-
h
指定覆盖的宽和高,必须被设置(联合前面的x和y就定义了一个矩形覆盖区)
-
band, t
指定矩形的边缘模糊厚度(添加到w和h),默认为4
-
show
但设置为1时,一个绿色的矩形被简单填充到覆盖区。默认为0,这时采用的区域内像素填充计算方法为:矩形内,画在最外层的像素将(部分)内插替换值。下一个像素的值在每个方向用于计算矩形内的内插像素值。
delogo例子
-
采用默认方法,在坐标(0,0)采用100x77,模糊10的台标覆盖:
delogo=x=0:y=0:w=100:h=77:band=10
deshake
尝试在小的范围内去除/修复 水平/垂直变化。用于去除手持、或者旋转三脚架以及在移动车辆上拍摄的抖动(防抖效果)
接受下面的选项
-
x
-
y
-
w
-
h
定义一个处理区域,它限定了动态监测搜索范围。它定义了有限运动矢量的左上角位置以及宽度和高度。这些参数随着
drawbox
滤镜一样有相同的意义,可以用来界定想象的边界位置对于同时运动(比如在车上拍摄),它十分有用,因为主题框架内混淆了本身有益的运动和无意的抖动,通过限定可以有效的区分,减少搜索难度。
如果这些参数中的一个或者所用被设置为-1则意味着在全帧应用。这使得后来选项设置不指定的边界框运动矢量搜索
默认为搜索整个帧
-
rx
-
ry
指定最大程度x和y方向运动范围,值范围为0-64像素,默认为16.
-
edge
指定如何生成像素来填补空白的边缘。可用值:
‘blank, 0’
在空白的地方填零
‘original, 1’
填充原始图像(背景部分) locations
‘clamp, 2’
在空白地方挤压边缘值
‘mirror, 3’
在空白位置反映边缘
默认为 ‘mirror’.
-
blocksize
指导用于运动检测的块尺寸,范围4-128像素,默认8.
-
contrast
指定块的对比度阈值。只有块超过指定的对比(黑暗和轻的像素)将被考虑。范围1-255,默认125 。
-
search
指定的搜索策略。可用值:
‘exhaustive, 0’
穷举搜索
‘less, 1’
不详尽的搜索
默认‘exhaustive’.
-
filename
如果设置,那么运动搜索的详细日志写入指定的文件
-
opencl
如果设置为1时,指定使用OpenCL功能,只在编译FFmpeg时配置了
——enable-opencl
可用。默认值是0。
detelecine
使用电视电影的逆操作。它需要一个预定的模板指定使用过的模式(必须同原始操作一样的参数)
滤镜接受下面的选项:
-
first_field
‘top, t’
顶场优先
‘bottom, b’
底场优先
默认为top.
-
pattern
一串数字表示您想要应用的下拉模式。默认值是23。
-
start_frame
许多代表第一帧的位置对电视电影模式,这用于流被剪辑过。默认值是0。
drawbox
在输入图像上画一个颜色区块。
它接受下面的参数:
-
x
-
y
指定区块的x和y坐标,可以是表达式,默认为0
-
width, w
-
height, h
指定表示区块宽和高的表达式,如果为0表示整个输入的宽和高,默认为0
-
color, c
指定填充颜色。语法详见颜色/color中的介绍。如果指定的值是
invert
,则区块边缘颜色采用视频该处颜色的反亮(这样可以衬托出区域)。 -
thickness, t
设置边缘宽度的表达式,默认为3.
各个表达式接受的值见下面的介绍。
对于 x, y, w 和 h 以及t是表达式时,可以包括下面的内容:
-
dar
输入的显示长宽比,它即为 (w / h) * sar.
-
hsub
-
vsub
水平和垂直色度量化分量值,例如对于"yuv422p"像素格式,hsub为2,vsub为1
-
in_h, ih
-
in_w, iw
输入的宽和高
-
sar
输入样本点的长宽比
-
x
-
y
区块的x和y坐标偏移
-
w
-
h
区块的宽和高
-
t
区块边缘厚度
这些x, y, w, h 和 t常(变)量都允许相互在表达式中引用,例如可以设置 y=x/dar 或 h=w/dar.
drawbox例子
-
在输入图像上画一个黑块
drawbox
-
采用50%透明的红色画一个区块
drawbox=10:20:200:60:red@0.5
也可以写为
drawbox=x=10:y=20:w=200:h=60:color=red@0.5
-
采用
pink
填充一个区块drawbox=x=10:y=10:w=100:h=100:color=pink@0.5:t=max
-
画一个2像素红,有2.40:1的遮盖区域
drawbox=x=-t:y=0.5*(ih-iw/2.4)-t:w=iw+t2:h=iw/2.4+t2:t=2:c=red
drawgrid
在输入图像上画上网格线(外框)
接受下面的参数:
-
x
-
y
指定区块的x和y坐标,可以是表达式,默认为0
-
width, w
-
height, h
指定表示区块宽和高的表达式,如果为0表示整个输入的宽和高采用最小的
thickness
划线,默认为0. -
color, c
指定填充颜色。语法详见颜色/color中的介绍。如果指定的值为
invert
,则网格线采用视频该处的反亮颜色绘制。 -
thickness, t
设置边缘宽度的表达式,默认为1.
各个表达式接受的值见下面的介绍。
对于 x, y, w 和 h 以及t是表达式时,可以包括下面的内容:
-
dar
输入的显示长宽比,它即为 (w / h) * sar.
-
hsub
-
vsub
水平和垂直色度量化分量值,例如对于"yuv422p"像素格式,hsub为2,vsub为1
-
in_h, ih
-
in_w, iw
输入的宽和高
-
sar
输入样本点的长宽比
-
x
-
y
区块的x和y坐标偏移
-
w
-
h
区块的宽和高
-
t
区块边缘厚度
这些x, y, w, h 和 t常(变)量都允许相互在表达式中引用,例如可以设置 y=x/dar 或 h=w/dar.
drawgrid例子
-
以2像素宽度绘制一个100x100的网格,颜色是红色,透明度50%
drawgrid=width=100:height=100:thickness=2:color=red@0.5
-
在图像上绘制3x3网格,透明度50%
drawgrid=w=iw/3:h=ih/3:t=2:c=white@0.5
drawtext
在视频的上绘制文本或者描述于文件的文本块,使用了libfreetype
库。
为了允许这个滤镜,在编译时需要配置--enable-libfreetype
,为了允许默认的字体回调和font
选项,还需要配置--enable-libfontconfig
。为了允许text_shaping
选项,还需要配置--enable-libfribidi
drawtext语法
它接受如下参数:
-
box
设置是否在文本下衬一个背景颜色,1为要,0为不要,默认为0
-
boxborderw
设置背景块边缘厚度(用于在背景块边缘用
boxcolor
再围绕画一圈),默认为0 -
boxcolor
设置用于绘制文本底衬的颜色。语法详见颜色/color中的介绍。
默认为"white".
-
borderw
使用
bordercolor
颜色绘制的文字边缘厚度,默认为0 -
bordercolor
绘制文本衬底的颜色。语法详见颜色/color中的介绍。
默认为"black".
-
expansion
设置文本扩展模式。可以为
none
,strftime
(已弃用了) 或normal
(默认). 见后面文本扩展中的详细介绍 -
fix_bounds
如果为true,检查和修复文本坐标来避免剪切
-
fontcolor
设置文本颜色。语法详见颜色/color中的介绍。
默认为"black".
-
fontcolor_expr
用于计算获得动态
fontcolor
值的字符串表达式。默认为控,即不处理。当被设置时将把计算结果覆盖fontcolor
选项 -
font
设置选用的字体,默认为Sans.
-
fontfile
指定字体文件。信息中包括路径。这个参数在
fontconfig
被禁用时必须设置 -
draw
这个选项已不存在,参考
timeline
系统(时间线) -
alpha
设置绘制的文本透明度,值范围为0.0-1.0。而且还可以接受x和y的变量。请参阅
fontcolor_expr
-
fontsize
设置字体大小,默认为16 drawing text. The default value of fontsize is 16.
-
text_shaping
如果设置为1,则试图整理文本排列顺序(例如阿拉伯语是按从右到左排序),否则按给定的顺序从左到右排,默认为1
-
ft_load_flags
这些标志用于加载字体
这些标志对应于
libfreetype
支持的标志,并结合下面的值:default
no_scale
no_hinting
render
no_bitmap
vertical_layout
force_autohint
crop_bitmap
pedantic
ignore_global_advance_width
no_recurse
ignore_transform
monochrome
linear_design
no_autohint默认值为 "default".
要了解更多信息,请参考文档中
libfreetype
标志的FT_LOAD_*
部分。 -
shadowcolor
阴影颜色。语法详见颜色/color中的介绍。
默认为"black".
-
shadowx
-
shadowy
这里的x和y是字阴影对于字本体的偏移。可以是正数或者负数(决定了偏移方向),默认为0
-
start_number
起始帧数,对于
n/frame_num
变量。 默认为0 -
tabsize
用于呈现的区域数量空间大小,默认为4
-
timecode
设置初始的时间码,以"hh:mm:ss[:;.]ff"格式。它被用于有或者没有
text
参数,此时timecode_rate
必须被指定 -
timecode_rate, rate, r
设置时间码
timecode
的帧率(在timecode
指定时) -
text
要被绘制的文本。文本必须采用
UTF-8
编码字符。如果没有指定textfile
则这个选项必须指定 -
textfile
一个文本文件,其内容将被绘制。文本必须是一个
UTF-8
文本序列如果没有指定
text
选项,则必须设定。如果同时设定了
text
和textfile
将引发一个错误 -
reload
如果设置为1,
textfile
将在每帧前加载。一定要自动更新它,或者它可能是会被读取的或者失败 -
x
-
y
指定文本绘制区域的坐标偏移。是相对于图像顶/左边的值
默认均为"0".
下面是接受的常量和函数
对于x和y是表达式时,它们接受下面的常量和函数:
-
dar
输入显示接受的长宽比,它等于 (w / h) * sar
-
hsub
-
vsub
水平和垂直色度分量值。例如对于"yuv422p"格式像素,
hsub
为2,vsub
为1 -
line_h, lh
文本行高
-
main_h, h, H
输入的高
-
main_w, w, W
输入的宽
-
max_glyph_a, ascent
从基线到最高/上字形轮廓高点(所有内容的最高点)的最大距离。必须是一个正值,因为网格与Y轴方向关系使然
-
max_glyph_d, descent
从基线到最低/下字形轮廓高点(所有内容的最高点)的最大距离。必须是一个负值,因为网格与Y轴方向关系使然
-
max_glyph_h
最大字形高度,限定了所有单个字的高度,如果设置值小于实际值,则输出可能覆盖到其他行上
-
max_glyph_w
最大字形宽度,限定了所单个字显示的宽度,如果设置值小于实际值,则发生字重叠
-
n
输入帧序数,从0计数
-
rand(min, max)
返回一个min和max间的随机数
-
sar
输入样本点的长宽比
-
t
以秒计的时间戳。如果无效则为
NAN
-
text_h, th
渲染文本的高
-
text_w, tw
渲染文本的宽
-
x
-
y
文本的x和y坐标。
所有参数都允许
x
和y
被引用,例如y=x/dar
文本扩展
如果expansion
设置为strftime
,则滤镜会接受strftime()
序列提供的文本并进行相应扩展。检查strftime()
的文档。这个特性现在是弃用的。
如果expansion
设置为none
,则文本都是直接打印文本(即直接以文本内容不扩展进行输出)
如果expansion
设置为normal
(它是默认值),将应用下面的扩展规则。
序列形式${...}
的内容将被扩展。大括号之间的文本是一个函数的名字,可能紧随其后是一些用:
隔开的参数。如果包含特殊字符或分隔符(这里是:
或者}
),它们应该被转义。
注意对于在作为滤镜参数的text
选项值,或者滤镜链图中的参数(多个滤镜连接时)以及是在shell
环境中使用,则可能需要4层转义。使用文本文件可以避免这些问题(减少转义的使用)。
下面是有效的函数(功能):
-
expr, e
计算结果的表达式
它必须有一个参数来计算,接受计算x和y相同的常数和函数。注意并不是所有的常数都适合,例如
text_w
和text_h
在此时还是一个未定义值(因为这两个值依赖于这里计算结果) -
expr_int_format, eif
把表达式求值和输出格式化为整数
第一个参数是用于计算的表达式,就像是
expr
函数(包括了变量/常量等),第二个参数指定输出格式,允许‘x’, ‘X’, ‘d’ 和 ‘u’,其意义同于printf
函数(C语言)中的意义。第三个参数是可选的,用来设置格式化为固定位数,左边可以用0来填补。 -
gmtime
设置滤镜运行时间,是UTC时间。它接受一个
strftime()
格式字符串参数 -
localtime
滤镜运行的本地时间,它以本地时区表示的时间。它接受一个
strftime()
格式字符串参数 -
metadata
帧的元数据。它必须有一个指定元数据键的参数
-
n, frame_num
帧序数,从0开始计数
-
pict_type
一个字符描述当前图片类型
-
pts
当前帧的时间戳。它可以有2个参数
第一个参数是时间戳格式,默认为
flt
是秒格式,其有微秒级精度;hms
则代表[-]HH:MM:SS.mmm
格式时间戳表示,其也有毫秒精度。第二个参数是添加到时间戳的偏移量
drawtext例子
-
以FreeSerif字体绘制 "Test Text" ,其他可选参数均为默认值
drawtext="fontfile=/usr/share/fonts/truetype/freefont/FreeSerif.ttf: text=‘Test Text‘"
-
以FreeSerif字体,24大小在x=100 和y=50位置 绘制 ’Test Text’ ,字体采用黄色且还有红色边缘,字体和衬底军为20%透明度
drawtext="fontfile=/usr/share/fonts/truetype/freefont/FreeSerif.ttf: text=‘Test Text‘:
x=100: y=50: fontsize=24: fontcolor=yellow@0.2: box=1: boxcolor=red@0.2"注意如果不是参数列表则不一定采用双引号来标识范围
-
把字显示在视频中间(计算位置)
drawtext="fontsize=30:fontfile=FreeSerif.ttf:text=‘hello world‘:x=(w-text_w)/2:y=(h-text_h-line_h)/2"
-
在视频帧的最后一排从右向左滑动显示一个文本行。假设文件LONG_LINE仅包含一行且没有换行。
drawtext="fontsize=15:fontfile=FreeSerif.ttf:text=LONG_LINE:y=h-line_h:x=-50*t"
-
从下向上显示文本行内容
drawtext="fontsize=20:fontfile=FreeSerif.ttf:textfile=CREDITS:y=h-20*t"
-
在视频中间以绿色绘制单独的字符"g"。文本基线放置在视频半高位置
drawtext="fontsize=60:fontfile=FreeSerif.ttf:fontcolor=green:text=g:x=(w-max_glyph_w)/2:y=h/2-ascent"
-
每3秒显示文本1秒
drawtext="fontfile=FreeSerif.ttf:fontcolor=white:x=100:y=x/dar:enable=lt(mod(t,3),1):text=‘blink‘"
-
采用
fontconfig
来设置字体。注意冒号需要转义drawtext=‘fontfile=Linux Libertine O-40:style=Semibold:text=FFmpeg‘
-
输出实时编码日期(参考
strftime(3)
):drawtext=‘fontfile=FreeSans.ttf:text=%{localtime:%a %b %d %Y}‘
-
以淡入淡出显示文本 (显示/消失)
#!/bin/sh
DS=1.0 # display start
DE=10.0 # display end
FID=1.5 # fade in duration
FOD=5 # fade out duration
ffplay -f lavfi "color,drawtext=text=TEST:fontsize=50:fontfile=FreeSerif.ttf:fontcolor_expr=ff0000%{eif\\: clip(255*(1*between(t\, $DS + $FID\, $DE - $FOD) + ((t - $DS)/$FID)*between(t\, $DS\, $DS + $FID) + (-(t - $DE)/$FOD)*between(t\, $DE - $FOD\, $DE) )\, 0\, 255) \\: x\\: 2 }"
关于libfreetype
, 参考http://www.freetype.org/
对于fontconfig
,参考http://freedesktop.org/software/fontconfig/fontconfig-user.html.
对于libfribidi
, 参考http://fribidi.org/.
edgedetect
检测边缘。滤镜采用精明边缘检测(Canny Edge Detection)算法
接受下面的选项:
-
low
-
high
设置检测算法边缘探测的低和高的阀值。
high
阀值选择强有力
的边缘像素,然后通过8向邻接检测软弱
到low
阀值,从而标注出边缘low
和high
的值范围为[0,1],且low
<=higt
默认
low
为20/255,high
为50/255. -
mode
定义绘制(边缘)模式
‘wires’
绘制一个 white/gray间隔线在黑背景上
‘colormix’
混合颜色创建一个油漆/卡通效果
默认为 wires.
edgedetect例子
-
采用了自定义滞后阀值的标准边缘检测
edgedetect=low=0.1:high=0.4
-
绘画效果没有阈值(因为high设置为0,low必须小于等于high则只能为0了)
edgedetect=mode=colormix:high=0
eq
设置亮度、对比度、饱和度和近似伽马(gamma)调整
滤镜支持下面选项:
-
contrast
设置contrast表达式,值必须是一个-2.0-2.0间的浮点数,默认为0
-
brightness
设置brightness表达式.值必须是一个-1.0-1.0间的浮点数,默认为0
-
saturation
设置saturation表达式. 值必须是一个0-3.0间的浮点数,默认为1
-
gamma
设置gamma表达式 ,值必须是一个0.1-10.0间的浮点数,默认为1
-
gamma_r
设置gamma表达式,对红色. 值必须是一个0.1-10.0间的浮点数,默认为1
-
gamma_g
设置gamma表达式,对绿色. 值必须是一个0.1-10.0间的浮点数,默认为1
-
gamma_b
设置gamma表达式,对蓝色. 值必须是一个0.1-10.0间的浮点数,默认为1
-
gamma_weight
设置gamma权重表达式.它可以用来减少高伽马值在明亮的图像区域影响,例如只是普通的白色放大,而其它保持不变。值必须是一个在0.0到1.0范围的浮点数。值为0.0时把伽马校正效果最强,为1.0没有效果。默认设置是“1”。
-
eval
设置brightness, contrast, saturation 和 gamma是表达式时的计算模式S
它接受下面值:
‘init’
仅在滤镜初始化或者命令被处理时计算
‘frame’
每帧计算
默认为‘init’.
下面是表达式中接受的参数:
-
n
帧序数,从0计数
-
pos
当前包在文件中的偏移,如果没有定义则为
NAN
-
r
输入视频帧率,如果无效则为
NAN
-
t
以秒计的时间戳,如果输入时间戳无效则为
NAN
eq命令
滤镜也接受下面的命令:
-
contrast
设置contrast表达式
-
brightness
设置brightness表达式
-
saturation
设置saturation表达式
-
gamma
设置gamma表达式
-
gamma_r
设置gamma_r表达式
-
gamma_g
设置gamma_g表达式
-
gamma_b
设置gamma_b表达式
-
gamma_weight
设置gamma_weight表达式
命令接受对应选项中相同的语法
如果指定的表达式是无效的,则保持当前值
extractplanes
从输入流分离单独的颜色通道成为灰度视频流
滤镜接受下面选项:
-
planes
设置要提取的通道
接受下面的值(标识通道):
‘y’
‘u’
‘v’
‘a’
‘r’
‘g’
‘b’选择无效的值会产生错误。这也意味着同时你只能选择
r, g, b和y
,或者y, u, v
extractplanes例子
-
提取亮度和
u
和v
颜色分量到3个灰度输出。ffmpeg -i video.avi -filter_complex ‘extractplanes=y+u+v[y][u][v]‘ -map ‘[y]‘ y.avi -map ‘[u]‘ u.avi -map ‘[v]‘ v.avi
elbg
应用多色调分色印效果,使用了ELBG(增强型LBG)算法。(构建颜色模板)
对每个输入图像,滤镜会对于给定编码长度计算最优的从输入到输出的的映射,它们对应于不同的输出颜色的数量
滤镜接受下面的选项:
-
codebook_length, l
设置编码长度,值必须是正整数,代表不同的输出颜色数量,默认为256
-
nb_steps, n
设置计算最优映射的最大迭代数。值越高,结果越好,但越耗时。默认为1
-
seed, s
设置一个随机种子,必须是0-UINT32_MAX间的整数,如果不指定,或者设置为-1 ,则会自动选择一个好的随机值
fade
应用淡入/淡出
它接受下面参数:
-
type, t
指定类型是
in
代表淡入,out
代表淡出,默认为in
-
start_frame, s
指定应用效果的开始时间,默认为0.
-
nb_frames, n
应用效果的最后一帧序数。对于淡入,在此帧后将以本身的视频输出,对于淡出此帧后将以设定的颜色输出,默认25.
-
alpha
如果设置为1,则只在透明通道实施效果(如果只存在一个输入),默认为0
-
start_time, st
指定按秒的开始时间戳来应用效果。如果
start_frame
和start_time
都被设置,则效果会在更后的时间开始,默认为0 -
duration, d
按秒的效果持续时间。对于淡入,在此时后将以本身的视频输出,对于淡出此时后将以设定的颜色输出。如果
duration
和nb_frames
同时被设置,将采用duration
值。默认为0(此时采用nb_frames
作为默认) -
color, c
设置淡化后(淡入前)的颜色,默认为"black".
fade例子
-
30帧开始淡入
fade=in:0:30
-
等效上面
fade=t=in:s=0:n=30
-
在200帧视频中从最后45帧淡出
fade=out:155:45
fade=type=out:start_frame=155:nb_frames=45 -
对1000帧的视频25帧淡入,最后25帧淡出:
fade=in:0:25, fade=out:975:25
-
让前5帧为黄色,然后在5-24淡入:
fade=in:5:20:color=yellow
-
仅在透明通道的第25开始淡入
fade=in:0:25:alpha=1
-
设置5.5秒的黑场,然后开始0.5秒的淡入:
fade=t=in:st=5.5:d=0.5
fftfilt
在频域内应用任意表达式于样品
-
dc_Y
调整亮度dc值(增益),范围0-1000,默认为0
-
dc_U
调整色度第1分量dc值(增益),范围0-1000,默认为0
-
dc_V
调整色度第2分量dc值(增益),范围0-1000,默认为0
-
weight_Y
设置对于亮度的频域权重表达式
-
weight_U
设置对于色度第1分量的频域权重表达式
-
weight_V
设置对于色度第2分量的频域权重表达式
滤镜接受下面的变量:
-
X
-
Y
对应当前样本点的坐标
-
W
-
H
当前图像的宽和高
fftfilt例子
-
高通:
fftfilt=dc_Y=128:weight_Y=‘squish(1-(Y+X)/100)‘
-
低通:
fftfilt=dc_Y=0:weight_Y=‘squish((Y+X)/100-1)‘
-
锐化:
fftfilt=dc_Y=0:weight_Y=‘1+squish(1-(Y+X)/100)‘
field
使用步算法从隔行图像中提取单个场来避免浪费CPU时间。标记为逐行输出帧。
滤镜接受下面选项:
-
type
指定是
top
(或者0)还是bottom
(或者1)类型的场
fieldmatch
场匹配用于反转电视(隔行)电影。它为了从电视流中建立起逐帧电影,需要过滤保留部分重复帧,为了更好的对压缩转换电视fieldmatch
滤镜需要跟随一个decimate
滤镜之类的抽取滤镜。
为了更好的分离和抽取,需要在两个滤镜间插入一个反交错滤镜。如果源是混合了电视电影和现实的内容,则单独的fieldmatch
滤镜不足以分离出交错内容,所以需要一个诸如