前言
Github
地址:Github
简书地址:简书
专辑地址:FFplay专辑
29.130 prewitt
应用prewitt
运算符输入视频流。
过滤器接受以下选项:
planes
设置要处理的平面,将复制未处理的平面。 默认值为0xf
,将处理所有平面。
scale
设定值将与过滤结果相乘。
delta
设置将添加到筛选结果的值。
29.131 program_opencl
使用OpenCL
程序过滤视频。
source
OpenCL
程序源文件。
kernel
程序中的内核名称。
inputs
过滤器的输入数量。 默认为1
。
size, s
输出帧的大小。 默认值与第一个输入相同。
程序源文件必须包含具有给定名称的内核函数,该函数将针对输出的每个平面运行一次。 平面上的每次运行都会作为单独的2D
全局NDRange
排队,每个像素都会生成一个工作项。 因此,每个工作项的全局ID
偏移量是目标图像中像素的坐标。
内核函数需要采用以下参数:
- 目标图像,
__ write_only image2d_t
。
这个图像将成为输出; 内核应该写出所有内容。
- 帧索引,
unsigned int
。
这是一个从零开始的计数器,每帧增加一个。
- 源图像,
__ read_only image2d_t
。
这些是每个输入的最新图像。 内核可以从它们读取以生成输出,但是它们无法写入。
示例程序如下:
-
将输入复制到输出(输出必须与输入的大小相同)。
__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); }
-
应用简单的转换,使用索引计数器增加一个量的输入。 采样器对像素值进行线性插值,输出的尺寸不必与输入相同。
__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)); }
-
将两个输入混合在一起,每个输入的使用量随索引计数器而变化。
__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
用伪彩色改变视频中的帧颜色。
此过滤器接受以下选项:
c0
设置像素第一组件表达式。
c1
设置像素第二组件表达式。
c2
设置像素第三组件表达式。
c3
设置像素第四个组件表达式,对应于alpha
组件。
i
设置组件以用作改变颜色的基础。
它们中的每一个都指定用于计算相应像素分量值的查找表的表达式。
表达式可以包含以下常量和函数:
w
h
输入的宽度和高度。
val
像素组件的输入值。
ymin,umin,vmin,amin
允许的最小组件值。
ymax,umax,vmax,amax
允许的最大组件值。
所有表达式默认为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
获取两个输入视频之间的平均,最大和最小PSNR
(峰值信噪比)。
此过滤器输入两个输入视频,第一个输入被视为"main"
源,并且不变地传递到输出。 第二输入用作用于计算PSNR
的"reference"
视频。
两个视频输入必须具有相同的分辨率和像素格式才能使此滤镜正常工作。 此外,它假设两个输入具有相同的帧数,逐个进行比较。
通过测井系统打印获得的平均PSNR
。
滤波器存储每帧的累积MSE
(均方误差),并且在处理结束时,它在所有帧上均等地平均,并且应用以下公式来获得PSNR
:
PSNR = 10*log10(MAX^2/MSE)
其中MAX
是图像每个分量的最大值的平均值。
接下来的参数的描述如下。
stats_file,f
如果指定,则过滤器将使用指定的文件来保存每个帧的PSNR
。当filename
等于-
时,数据被发送到标准输出。
stats_version
指定要使用的stats
文件格式的版本。每种格式的详细信息如下。默认值为1
。
stats_add_max
确定是否将最大值输出到统计日志。默认值为0
。需要stats_version> = 2
。如果设置且stats_version <2
,则过滤器将返回错误。
此过滤器还支持framesync
选项。
如果选择了stats_file
,则打印的文件包含表单键的键/值对序列:每个比较的帧对的值。
如果指定了stats_version
大于1
,则标题行位于每帧对统计数据列表之前,其中键值对遵循帧格式,并带有以下参数:
psnr_log_version
日志文件格式的版本。将匹配stats_version
。
fields
日志中包含的每帧对参数的逗号分隔列表。
每个所示的每帧对参数的描述如下:
n
输入帧的序号,从1开始
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
每个通道的最大允许值,以及所有通道的平均值。
例如:
movie = ref_movie.mpg,setpts = PTS-STARTPTS [main];
[main] [ref] psnr =“stats_file = stats.log”[out]
在此示例中,正在处理的输入文件与参考文件ref_movie.mpg
进行比较。每个帧的PSNR
存储在stats.log
中。
29.134 pullup
下拉式反转(反转电视电影)过滤器,能够处理混合的硬电视电影,24000/1001 fps
渐进和30000/1001 fps
渐进内容。
上拉滤波器旨在利用未来的背景来做出决策。 此过滤器在没有锁定到要跟随的模式的意义上是无状态的,但它反过来期待以下字段以识别匹配并重建渐进帧。
要生成具有均匀帧率的内容,请在上拉后插入fps
滤波器,如果输入帧速率为29.97fps
,则使用fps = 24000/1001
,对于30fps
使用fps = 24
,使用(稀有)电视电影25fps
输入。
过滤器接受以下选项:
jl
jr
jt
jb
这些选项分别在图像的左侧,右侧,顶部和底部设置要忽略的"junk"
量。 左和右以8
像素为单位,而顶部和底部以2
行为单位。 默认值是每边8
像素。
sb
设置严格的休息时间。 将此选项设置为1
将减少滤波器生成偶然不匹配帧的机会,但也可能导致在高运动序列期间丢弃过多帧。 相反,将其设置为-1
将使过滤器匹配字段更容易。 这可以帮助处理视频,其中字段之间存在轻微模糊,但是也可能导致输出中存在交错帧。 默认值为0
。
mp
设置要使用的度量标准平面。 它接受以下值:
值 | 解释 |
---|---|
l | 使用luma plane
|
u | 使用chroma blue plane
|
v | 使用chroma red plane
|
可以将此选项设置为使用色度平面而不是默认亮度平面来进行滤波器的计算。 这可以提高非常干净的源材料的准确度,但更有可能降低精度,尤其是在存在色度噪声(彩虹效应)或任何灰度视频的情况下。 将'mp'
设置为色度平面的主要目的是减少CPU
负载并使上拉在慢速机器上实时可用。
为获得最佳结果(输出文件中没有重复的帧),必须更改输出帧速率。 例如,要反转电视电影NTSC
输入:
ffmpeg -i input -vf pullup -r 24000/1001 ...
29.135 qp
更改视频量化参数(QP
)。
过滤器接受以下选项:
qp
设置量化参数的表达式。
表达式通过eval API
进行评估,并且可以包含以下常量:
known
如果index
不是129
则为1
,否则为0
。
qp
顺序索引从-129
到128
。
29.135.1 示例
-
一些方程如下:
qp=2+2sin(PIqp)
29.136 random
将帧内部缓存中的视频帧刷新为随机顺序。 没有帧被丢弃。 灵感来自frei0r神经过滤器。
frames
设置内部缓存帧数的大小,范围为2
到512
。默认值为30
。
seed
为随机数生成器设置种子,必须是0
到UINT32_MAX
之间的整数。 如果未指定,或者显式设置为小于0
,则过滤器将尝试在尽力而为的基础上使用良好的随机种子。
29.137 readeia608
从视频帧的顶行读取隐藏式字幕(EIA-608)
信息。
此过滤器为lavfi.readeia608.X.cc
和lavfi.readeia608.X.line
添加帧元数据,其中X
是具有EIA-608
数据的标识行的编号(从0
开始)。每个元数据值的描述如下:
lavfi.readeia608.X.cc
这两个字节存储为EIA-608
数据(以十六进制打印)。
lavfi.readeia608.X.line
识别和读取EIA-608
数据的行号。
此过滤器接受以下选项:
scan_min
设置该行以开始扫描EIA-608
数据。默认值为0
。
scan_max
将行设置为结束扫描EIA-608
数据。默认值为29
。
mac
设置同步码检测的最小可接受幅度变化。默认值为0.2
。允许范围为[0.001 - 1]
。
spw
设置为同步代码检测保留的宽度比率。默认值为0.27
。允许范围为[0.01 - 0.7]
。
mhd
设置同步代码检测的最大峰高差。默认值为0.1
。允许范围是[0.0 - 0.5]
。
mpd
设置同步代码检测的最大峰值周期差。默认值为0.1
。允许范围是[0.0 - 0.5]
。
msd
设置前两个最大起始码位差异。默认值为0.02
。允许范围是[0.0 - 0.5]
。
bhd
设置与第3
个起始码位相比的位高度的最小比率。默认值为0.75
。允许范围为[0.01 - 1]
。
th_w
设置白色阈值。默认值为0.35
。允许范围是[0.1 - 1]
。
th_b
设置黑色阈值。默认值为0.15
。允许范围是[0.0 - 0.5]
。
chp
启用检查奇偶校验位。如果出现奇偶校验错误,则过滤器将为该字符输出0x00
。默认值为false
。
29.137.1 示例
-
输出具有显示时间的
csv
和识别的EIA-608
字幕数据的前两行。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
从视频帧的顶行读取垂直间隔时间码(VITC
)信息。
如果检测到有效时间码,则过滤器将帧元数据密钥lavfi.readvitc.tc_str
与时间码值相加。 根据是否已找到时间码数据,将进一步的元数据键lavfi.readvitc.found
设置为0/1
。
此过滤器接受以下选项:
scan_max
设置要扫描VITC
数据的最大行数。 如果该值设置为-1
,则扫描完整的视频帧。 默认值为45
。
thr_b
设置黑色的亮度阈值。 接受[0.0,1.0]
范围内的浮点数,默认值为0.2
。 该值必须等于或小于thr_w
。
thr_w
设置白色的亮度阈值。 接受[0.0,1.0]
范围内的浮点数,默认值为0.6
。 该值必须等于或大于thr_b
。
29.138.1 示例
-
检测
VITC
数据并将其绘制到视频帧上; 如果没有检测到有效的VITC
,请绘制--:--:--:--
作为占位符: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)
处的目标像素,其中x = Xmap(X,Y)
并且y = Ymap(X,Y)
。 如果映射值超出范围,则像素的零值将用于目标像素。
Xmap
和Ymap
输入视频流必须具有相同的尺寸。 输出视频流将具有Xmap / Ymap
视频流尺寸。 Xmap
和Ymap
输入视频流是16bit
深度,单通道。