FFplay文档解读-30-视频过滤器五
前言
Github
地址:Github
简书地址:简书
专辑地址:FFplay专辑
29.40 detelecine
应用电视电影操作的精确倒数。 它需要使用pattern
选项指定的预定义模式,该模式选项必须与传递给电视电影过滤器的模式选项相同。
此过滤器接受以下选项:
first_field
选项 | 解释 |
---|---|
top, t | top field first |
bottom, b | 底部字段优先默认值为top
|
pattern
一串数字,表示希望应用的下拉模式。 默认值为23
。
start_frame
表示第一帧相对于电视电影图案的位置的数字。 如果要切割流,则使用此选项。 默认值为0
。
29.41 dilation
将扩张效果应用于视频。
此过滤器将像素替换为本地(3x3
)最大值。
它接受以下选项:
threshold0
threshold1
threshold2
threshold3
限制每个平面的最大变化,默认为65535
.如果为0
,则平面将保持不变。
coordinates
指定要参考的像素的标志。 默认值为255
,即使用所有八个像素。
标志到本地3x3
坐标映射如下:
1 2 3 4 5 6 7 8
29.42 displace
移位由第二和第三输入流指示的像素。
它需要三个输入流并输出一个流,第一个输入是源,第二个和第三个输入是位移图。
第二个输入指定沿x轴移动像素的程度,而第三个输入指定沿y轴移动像素的程度。 如果位移图流之一终止,则将使用来自该置换图的最后一帧。
请注意,一旦生成,位移贴图可以反复重复使用。
接下来的选项的描述如下:
edge
设置超出范围的像素的置换行为。
可用值包括:
值 | 解释 |
---|---|
blank | 丢失的像素被黑色像素替换 |
smear | 相邻像素将展开以替换丢失的像素 |
wrap | 超出范围的像素被包裹,因此它们指向另一侧的像素 |
mirror | 超出范围的像素将替换为镜像像素 |
默认值是:smear
。
29.42.1 示例
-
为
rgb
输入的视频大小hd720
添加涟漪效果:ffmpeg -i INPUT -f lavfi -i nullsrc=s=hd720,lutrgb=128:128:128 -f lavfi -i nullsrc=s=hd720,geq='r=128+30*sin(2*PI*X/400+T):g=128+30*sin(2*PI*X/400+T):b=128+30*sin(2*PI*X/400+T)' -lavfi '[0][1][2]displace' OUTPUT
-
将
wave
效果添加到视频大小为hd720
的rgb
输入中:ffmpeg -i INPUT -f lavfi -i nullsrc=hd720,geq='r=128+80*(sin(sqrt((X-W/2)*(X-W/2)+(Y-H/2)*(Y-H/2))/220*2*PI+T)):g=128+80*(sin(sqrt((X-W/2)*(X-W/2)+(Y-H/2)*(Y-H/2))/220*2*PI+T)):b=128+80*(sin(sqrt((X-W/2)*(X-W/2)+(Y-H/2)*(Y-H/2))/220*2*PI+T))' -lavfi '[1]split[x][y],[0][x][y]displace' OUTPUT
29.43 drawbox
在输入图像上绘制一个彩色框。
它接受以下参数:
x
y
指定框左上角坐标的表达式。 它默认为0
。
width, w
height, h
指定框的宽度和高度的表达式; 如果为0
,则将它们解释为输入宽度和高度。 它默认为0
。
color, c
指定要写入的框的颜色。 有关此选项的一般语法,请检查(ffmpeg-utils
)颜色语法。 如果使用特殊值反转,则框边缘颜色与具有反转亮度的视频相同。
thickness, t
设置框边缘厚度的表达式。 填充值将创建一个填充框。 默认值为3
。
请参阅下面的可接受常数列表。
replace
如果输入具有alpha
,则适用。 值为1
时,绘制框的像素将覆盖视频的颜色和alpha
像素。 默认值为0
,它将框组合到输入上,使视频的alpha
保持不变
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
。
29.43.1 示例
-
在输入图像的边缘周围绘制一个黑框:
drawbox
-
画一个红色和不透明度为50%的
box
:drawbox=10:20:200:60:red@0.5
-
前面的示例可以指定为:
drawbox=x=10:y=20:w=200:h=60:color=red@0.5
-
用粉红色填充
box
:drawbox=x=10:y=10:w=100:h=100:color=pink@0.5:t=fill
-
画一个
2
像素的红色2.40:1
面具:drawbox=x=-t:y=0.5*(ih-iw/2.4)-t:w=iw+t*2:h=iw/2.4+t*2:t=2:c=red
29.44 drawgrid
在输入图像上绘制网格。
它接受以下参数:
x
y
指定网格交叉点某些点的坐标的表达式(用于配置偏移量)。 两者都默认为0
。
width, w
height, h
指定网格单元格的宽度和高度的表达式,如果为0
,它们分别被解释为输入宽度和高度减去厚度,因此图像被加框。 默认为0
。
color, c
指定网格的颜色。 有关此选项的一般语法,请检查(ffmpeg-utils)颜色语法
。 如果使用特殊值反转,则网格颜色与具有反转亮度的视频相同。
thickness, t
设置网格线粗细的表达式。 默认值为1
。
请参阅下面的可接受常数列表。
replace
如果输入具有alpha
,则适用。 使用1
时,绘制网格的像素将覆盖视频的颜色和alpha
像素。 默认值为0
,它将网格合成到输入上,使视频的alpha
保持不变。
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
。
29.44.1 示例
-
绘制一个网格,单元格为
100x100
像素,厚度为2
像素,红色为红色,不透明度为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
29.45 drawtext
使用libfreetype
库从视频顶部的指定文件中绘制文本字符串或文本。
要启用此过滤器的编译,需要使用--enable-libfreetype
配置FFmpeg
。 要启用默认字体回退和字体选项,需要使用--enable-libfontconfig
配置FFmpeg
。 要启用text_shaping
选项,需要使用--enable-libfribidi
配置FFmpeg
。
29.45.1 语法
它接受以下参数:
box
用于使用背景颜色在文本周围绘制一个框。该值必须为1
(启用)或0
(禁用)。 box
的默认值为0
。
boxborderw
使用boxcolor
设置要在框周围绘制的边框宽度。 boxborderw
的默认值为0
。
boxcolor
用于在文本周围绘制框的颜色。有关此选项的语法,请检查(ffmpeg-utils)颜色语法
。
boxcolor
的默认值为white
。
line_spacing
使用框设置要在框周围绘制的边框的行间距(以像素为单位)。 line_spacing
的默认值为0
。
borderw
使用bordercolor
设置要在文本周围绘制的边框宽度。 borderw
的默认值为0
。
bordercolor
设置用于在文本周围绘制边框的颜色。有关此选项的语法,请检查(ffmpeg-utils)颜色语法
。
bordercolor
的默认值为black
。
expansion
选择文本的展开方式。可以是none
,strftime
(不建议使用)或normal
(默认)。有关详情,请参阅下面的文本扩展部分。
basetime
设置计数的开始时间。值以微秒为单位。仅适用于弃用的strftime
扩展模式。要在正常扩展模式下模拟,请使用pts
函数,以第二个参数的形式提供开始时间(以秒为单位)。
fix_bounds
如果为true
,请检查并修复文本坐标以避免剪裁。
fontcolor
用于绘制字体的颜色。有关此选项的语法,请检查(ffmpeg-utils)颜色语法
。
fontcolor
的默认值为black
。
fontcolor_expr
以与文本相同的方式展开的字符串,以获取动态fontcolor
值。默认情况下,此选项具有空值,不会被处理。设置此选项后,它将覆盖fontcolor
选项。
font
用于绘制文本的字体系列。默认为Sans
。
fontfile
用于绘制文本的字体文件。必须包含路径。如果禁用了fontconfig
支持,则此参数是必需的。
alpha
绘制应用alpha
混合的文本。该值可以是介于0.0
和1.0
之间的数字。表达式也接受相同的变量x
,y
。默认值为1
。请参阅fontcolor_expr
。
fontsize
用于绘制文本的字体大小。 fontsize
的默认值为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
。
有关更多信息,请参阅FT_LOAD_ * libfreetype
标志的文档。
shadowcolor
用于在绘制文本后面绘制阴影的颜色。有关此选项的语法,请检查(ffmpeg-utils)颜色语法
。
shadowcolor
的默认值为black
。
shadowx
shadowy
文本阴影位置相对于文本位置的x
和y
偏移量。它们可以是正值或负值。两者的默认值均为0
。
start_number
n/frame_num
变量的起始帧号。默认值为0
。
tabsize
用于呈现选项卡的空格数量的大小。默认值为4
。
timecode
将初始时间码表示设置为hh:mm:ss[:;.]ff
格式。它可以与或不与文本参数一起使用。必须指定timecode_rate
选项。
timecode_rate,rate,r
设置时间码帧速率(仅限时间码)。值将四舍五入为最接近的整数。最小值为1
。帧速率30
和60
支持丢帧时间码。
tc24hmax
如果设置为1
,则时间码选项的输出将在24
小时后回滚。默认值为0
(禁用)。
text
要绘制的文本字符串。文本必须是UTF-8
编码字符序列。如果未使用参数textfile
指定文件,则此参数是必需的。
textfile
包含要绘制的文本的文本文件。文本必须是UTF-8
编码字符序列。
如果未使用参数文本指定文本字符串,则此参数是必需的。
如果同时指定了text
和textfile
,则会引发错误。
reload
如果设置为1
,则将在每个帧之前重新加载文本文件。请务必以原子方式更新,或者可以部分读取,甚至失败。
x
y
用于指定在视频帧内绘制文本的偏移的表达式。它们相对于输出图像的顶部/左侧边框。
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
。
29.45.2 文字扩展
如果expansion
设置为strftime
,则过滤器会识别提供的文本中的strftime()
序列并相应地展开它们。查看strftime()
的文档。此功能已弃用。
如果expansion
设置为none
,则逐字打印文本。
如果expansion
设置为normal
(默认值),则使用以下扩展机制。
反斜杠字符'\'
,后跟任何字符,始终扩展为第二个字符。
形式%{...}
的序列被扩展。大括号之间的文本是函数名称,可能后跟以':'
分隔的参数。如果参数包含特殊字符或分隔符(':'或'}')
,则应对其进行转义。
请注意,它们可能也必须作为filter
参数字符串中'text'
选项的值进行转义,并作为filtergraph
描述中的filter
参数进行转义,也可能对shell
进行转义,最多可以转义为四个级别;使用文本文件可以避免这些问题。
可以使用以下功能:
expr, e
表达评估结果。
它必须使用一个参数来指定要计算的表达式,它接受与x
和y
值相同的常量和函数。请注意,并非所有常量都应该使用,例如,在计算表达式时,文本大小是未知的,因此常量text_w
和text_h
将具有未定义的值。
expr_int_format,eif
将表达式的值和输出计算为格式化整数。
第一个参数是要计算的表达式,就像expr函数一样。第二个参数指定输出格式。允许的值为x
,X
,d
和u
。它们的处理方式与printf
函数完全相同。第三个参数是可选的,它设置输出所占的位置数。它可用于从左侧添加带零的填充。
gmtime
过滤器运行的时间,以UTC表示。它可以接受一个参数:strftime()
格式字符串。
localtime
过滤器运行的时间,以本地时区表示。它可以接受一个参数:strftime()
格式字符串。
metadata
帧元数据。需要一个或两个参数。
第一个参数是必需的,并指定元数据键。
第二个参数是可选的,它指定一个默认值,在找不到元数据键或空时使用。
n,frame_num
帧号,从0
开始。
pict_type
当前图片类型的1
个字符描述。
pts
当前帧的时间戳。它最多可能需要三个参数。
第一个参数是时间戳的格式;它默认以十进制数表示为十进制数,精确到微秒; hms
代表格式化的[-]HH:MM:SS.mmm
时间戳,精度为毫秒。 gmtime
代表格式化为UTC
时间的帧的时间戳; localtime
代表格式化为本地时区时间的帧的时间戳。
第二个参数是添加到时间戳的偏移量。
如果格式设置为localtime
或gmtime
,则可以提供第三个参数:strftime()
格式字符串。默认情况下,将使用YYYY-MM-DD HH:MM:SS
格式。
29.45.3 示例
-
使用
FreeSerif
字体绘制Test Text
,使用可选参数的默认值。drawtext="fontfile=/usr/share/fonts/truetype/freefont/FreeSerif.ttf: text='Test Text'"
-
使用大小为
24
的字体FreeSerif
在位置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)/2"
-
在随机位置显示文本,每
30
秒切换到一个新位置:drawtext="fontsize=30:fontfile=FreeSerif.ttf:text='hello world':x=if(eq(mod(t\,30)\,0)\,rand(0\,(w-text_w))\,x):y=if(eq(mod(t\,30)\,0)\,rand(0\,(h-text_h))\,y)"
-
在视频帧的最后一行显示从右到左滑动的文本行。 假设文件
'LONG_LINE'
包含一行而没有换行符。drawtext="fontsize=15:fontfile=FreeSerif.ttf:text=LONG_LINE:y=h-line_h:x=-50*t"
-
在框架底部显示文件
“CREDITS”
的内容并向上滚动。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 }"
-
水平对齐多个单独的文本。 请注意,
'max_glyph_a'
和'fontsize'
值包含在'y'
偏移中。drawtext=fontfile=FreeSans.ttf:text=DOG:fontsize=24:x=10:y=20+24-max_glyph_a, drawtext=fontfile=FreeSans.ttf:text=cow:fontsize=24:x=80:y=20+24-max_glyph_a
有关libfreetype
的更多信息,请访问:http://www.freetype.org/。
有关fontconfig
的更多信息,请访问:http://freedesktop.org/software/fontconfig/fontconfig-user.html。
有关libfribidi
的更多信息,请访问:http://fribidi.org/。
29.46 edgedetect
检测并绘制边缘。 过滤器使用Canny
边缘检测算法。
过滤器接受以下选项:
low
high
设置Canny
阈值算法使用的低和高阈值。
高阈值选择"strong"
边缘像素,然后通过8连接与由低阈值选择的"weak"
边缘像素连接。
必须在[0,1]
范围内选择低阈值和高阈值,低值应小于或等于高。
low
的默认值是20/255
,high
的默认值是50/255
。
mode
定义绘图模式。
绘图模式 | 解释 |
---|---|
wires | 在黑背景画白色/灰色导线 |
colormix | 混合颜色以创建油漆/卡通效果 |
默认值是:wires
。
29.46.1 示例
-
使用滞后阈值的自定义值进行标准边沿检测:
edgedetect=low=0.1:high=0.4
-
没有阈值的绘画效果:
edgedetect=mode=colormix:high=0
29.47 eq
设置亮度,对比度,饱和度和近似伽玛调整。
过滤器接受以下选项:
contrast
设置对比度表达式。该值必须是-2.0
到2.0
范围内的浮点值。默认值为1
。
brightness
设置亮度表达式。该值必须是-1.0
到1.0
范围内的浮点值。默认值为0
。
saturation
设置饱和度表达式。该值必须是0.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
将gamma
校正完全降低,而1.0
使其保持全部强度。默认值为1
。
eval
设置亮度,对比度,饱和度和gamma
表达式的表达式时进行设置。
它接受以下值:
值 | 解释 |
---|---|
init | 仅在过滤器初始化期间或处理命令时评估表达式 |
frame | 计算每个传入帧的表达式 |
默认值是:init
。
表达式接受以下参数:
n
从0
开始的输入帧的帧数。
pos
输入文件中相应数据包的字节位置,如果未指定则为NAN
。
r
输入视频的帧速率,如果输入帧速率未知,则为NAN
。
t
时间戳以秒表示,如果输入时间戳未知,则为NAN
。
29.47.1 命令行
该过滤器支持以下命令:
contrast
设置对比度表达式。
brightness
设置亮度表达式。
saturation
设置饱和度表达式。
gamma
设置gamma
表达式。
gamma_r
设置gamma_r
表达式。
gamma_g
设置gamma_g
表达式。
gamma_b
设置gamma_b
表达式。
gamma_weight
设置gamma_weight
表达式。
该命令接受相应选项的相同语法。
如果指定的表达式无效,则保持其当前值。
29.48 erosion
对视频应用侵蚀效果。
此过滤器将像素替换为本地(3x3
)最小值。
它接受以下选项:
threshold0
threshold1
threshold2
threshold3
限制每个平面的最大变化,默认为65535
。如果为0
,则平面将保持不变。
coordinates
指定要参考的像素的标志。 默认值为255
,即使用所有八个像素。
标志到本地3x3
坐标映射如下:
1 2 3 4 5 6 7 8
29.49 extractplanes
将输入视频流中的颜色通道组件提取到单独的灰度视频流中。
过滤器接受以下选项:
planes
设置要提取的平面。
planes
的可用值为:
‘y’
‘u’
‘v’
‘a’
‘r’
‘g’
‘b’
选择输入中不可用的平面将导致错误。 这意味着无法同时选择具有y
,u
,v
平面的r
,g
,b
平面。
29.49.1 示例
-
将输入视频帧中的
luma
,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