FFplay文档解读-39-视频过滤器十四

前言

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

顺序索引从-129128

29.135.1 示例

  • 一些方程如下:

    qp=2+2sin(PIqp)

29.136 random

将帧内部缓存中的视频帧刷新为随机顺序。 没有帧被丢弃。 灵感来自frei0r神经过滤器。

frames

设置内部缓存帧数的大小,范围为2512。默认值为30

seed

为随机数生成器设置种子,必须是0UINT32_MAX之间的整数。 如果未指定,或者显式设置为小于0,则过滤器将尝试在尽力而为的基础上使用良好的随机种子。

29.137 readeia608

从视频帧的顶行读取隐藏式字幕(EIA-608)信息。

此过滤器为lavfi.readeia608.X.cclavfi.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:Xmap3rd:Ymap输入视频流重新映射像素。

将从源(x,y)位置拾取位置(X,Y)处的目标像素,其中x = Xmap(X,Y)并且y = Ymap(X,Y)。 如果映射值超出范围,则像素的零值将用于目标像素。

XmapYmap输入视频流必须具有相同的尺寸。 输出视频流将具有Xmap / Ymap视频流尺寸。 XmapYmap输入视频流是16bit深度,单通道。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,392评论 5 470
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,258评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,417评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,992评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,930评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,199评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,652评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,327评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,463评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,382评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,432评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,118评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,704评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,787评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,999评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,476评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,057评论 2 341

推荐阅读更多精彩内容