前言
Github
地址:Github
简书地址:简书
专辑地址:FFplay专辑
29. 视频过滤器
配置FFmpeg
构建时,可以使用--disable-filters
禁用任何现有过滤器。 配置输出将显示构建中包含的视频过滤器。
以下是当前可用视频过滤器的说明。
29.1 alphaextract
从输入中提取alpha
分量作为灰度视频。 这对alphamerge
过滤器特别有用。
29.2 alphamerge
使用第二个输入的灰度值添加或替换主输入的alpha
分量。 这旨在与alphaextract
一起使用,以允许传输或存储具有不支持alpha
通道的格式的alpha
的帧序列。
例如,要从正常的YUV
编码视频和使用alphaextract
创建的单独视频重建完整帧,可以使用:
movie=in_alpha.mkv [alpha]; [in][alpha] alphamerge [out]
由于此过滤器是为重建而设计的,因此它在不考虑时间戳的情况下对帧序列进行操作,并在任一输入到达流末尾时终止。 如果您的编码管道丢帧,这将导致问题。 如果您尝试将图像应用为视频流的叠加层,请考虑使用叠加层滤镜。
29.3 ass
与字幕过滤器相同,只是它不需要libavcodec
和libavformat
工作。 另一方面,它仅限于ASS
(Advanced Substation Alpha
)字幕文件。
除了字幕过滤器中的常用选项外,此过滤器还接受以下选项:
shaping
设置整形引擎
可用值包括:
参数 | 解释 |
---|---|
auto | 默认的libass 整形引擎,它是最好的 |
simple | 快速,与字体无关的整形器,只能进行替换 |
complex | 使用OpenType 进行替换和定位的较慢整形器 |
默认值是: auto
。
29.4 atadenoise
将自适应时间平均降噪器应用于视频输入。
过滤器接受以下选项:
0a
为第一个平面设置阈值A
。 默认值为0.02
。 有效范围是0
到0.3
。
0b
为第一个平面设置阈值B
。 默认值为0.04
。 有效范围是0
到5
。
1a
为第二个平面设置阈值A
。 默认值为0.02
。 有效范围是0
到0.3
。
1b
设置第二平面的阈值B
。 默认值为0.04
。 有效范围是0
到5
。
2a
为第3
平面设置阈值A
。 默认值为0.02
。 有效范围是0
到0.3
。
2b
为第3
平面设置阈值B
。 默认值为0.04
。 有效范围是0
到5
。
阈值A
设计用于对输入信号的突然变化做出反应,阈值B
设计用于对输入信号的连续变化作出反应。
s
设置帧滤波器将用于平均。 默认值为33
。必须是范围[5,129]
中的奇数。
p
设置帧滤波器的平面将用于平均。 默认是all
。
29.5 avgblur
应用平均模糊滤镜。
过滤器接受以下选项:
sizeX
设置水平内核大小。
planes
设置要过滤的平面。 默认情况下,将过滤所有平面。
sizeY
设置垂直内核大小,如果为零则与sizeX
相同。 默认值为0
。
29.6 bbox
计算输入帧亮度平面中非黑色像素的边界框。
此过滤器计算包含亮度值大于最小允许值的所有像素的边界框。 描述边界框的参数将打印在过滤器日志中。
过滤器接受以下选项:
min_val
设置最小亮度值。 默认值为16
。
29.7 bitplanenoise
显示和测量位平面噪声。
过滤器接受以下选项:
bitplane
设置要分析的平面。 默认值为1
。
filter
从上面的bitplane
滤除噪声像素。 默认为禁用。
29.8 blackdetect
检测(almost
)完全黑色的视频间隔。可用于检测章节转换,商业广告或无效录制。输出行包含检测到的黑色间隔的开始,结束和持续时间,以秒为单位。
要显示输出行,需要将loglevel
至少设置为AV_LOG_INFO
值。
过滤器接受以下选项:
black_min_duration,d
设置以秒为单位表示的最小检测黑色持续时间它必须是非负浮点数。
默认值为2.0
。
picture_black_ratio_th,pic_th
设置考虑图片"black"
的阈值。表达比率的最小值:
nb_black_pixels / nb_pixels
图片被认为是黑色的。默认值为0.98
。
pixel_black_th,pix_th
设置考虑像素"black"
的阈值。
阈值表示像素被认为是"black"
的最大像素亮度值。提供的值根据以下等式缩放:
absolute_threshold = luminance_minimum_value + pixel_black_th * luminance_range_size
luminance_range_size
和luminance_minimum_value
取决于输入视频格式,YUV
全范围格式的范围是[0-255]
,YUV
非全范围格式的范围是[16-235]
。
默认值为0.10
。
以下示例将最大像素阈值设置为最小值,并仅检测2
秒或更多秒的黑色间隔:
blackdetect = d = 2:pix_th = 0.00
29.9 blackframe
检测(almost)
完全黑色的帧。 可用于检测章节转换或商业广告。 输出行包括检测到的帧的帧编号,黑度百分比,文件中的位置(如果已知)或-1
以及时间戳(以秒为单位)。
要显示输出行,需要将loglevel
至少设置为AV_LOG_INFO
值。
此过滤器导出帧元数据lavfi.blackframe.pblack
。 该值表示图片中低于阈值的像素百分比。
它接受以下参数:
amount
必须低于阈值的像素百分比; 它默认为98
。
threshold, thresh
像素值被认为是黑色的阈值; 它默认为32
。
29.10 blend, tblend
将两个视频帧相互混合。
blend
滤波器采用两个输入流并输出一个流,第一个输入是"top"
层,第二个输入是"bottom"
层。 默认情况下,输出在最长输入终止时终止。
tblend
(时间混合)滤波器从一个单独的流中获取两个连续的帧,并输出通过在旧帧的顶部混合新帧而获得的结果。
接下来的选项的描述如下:
c0_mode
c1_mode
c2_mode
c3_mode
all_mode
在all_mode
的情况下,为特定像素组件或所有像素组件设置混合模式。 默认值是正常的。
组件模式的可用值为:
值 |
---|
addition |
grainmerge |
and |
average |
burn |
darken |
difference |
grainextract |
divide |
dodge |
freeze |
exclusion |
extremity |
glow |
hardlight |
hardmix |
heat |
lighten |
linearlight |
multiply |
multiply128 |
negation |
normal |
or |
overlay |
phoenix |
pinlight |
reflect |
screen |
softlight |
subtract |
vividlight |
xor |
c0_opacity
c1_opacity
c2_opacity
c3_opacity
all_opacity
在all_opacity
的情况下,为特定像素组件或所有像素组件设置混合不透明度。 仅与像素组件混合模式结合使用。
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 | 第一个视频帧(顶层)当前位置的像素分量值 |
BOTTOM, B | 第二视频帧(底层)当前位置的像素分量值 |
混合滤镜还支持framesync
选项。
29.10.1 示例
-
在前
10
秒内应用从底层到顶层的过渡:blend=all_expr='A*(if(gte(T,10),1,T/10))+B*(1-(if(gte(T,10),1,T/10)))'
-
应用从顶层到底层的线性水平过渡:
blend=all_expr='A*(X/W)+B*(1-X/W)'
-
应用
1x1 checkerboard
效果:blend=all_expr='if(eq(mod(X,2),mod(Y,2)),A,B)'
-
应用
uncover lef
效果:blend=all_expr='if(gte(N*SW+X,W),A,B)'
-
应用
uncover down
效果:blend=all_expr='if(gte(Y-N*SH,0),A,B)'
-
应用
uncover up-left
效果:blend=all_expr='if(gte(T*SH*40+Y,H)*gte((T*40*SW+X)*W/H,W),A,B)'
-
对角线分割视频,并在每侧显示顶层和底层:
blend=all_expr='if(gt(X,Y*(W/H)),A,B)'
-
显示当前帧和上一帧之间的差异:
tblend=all_mode=grainextract