ffmpeg文档37-视频滤镜

37 视频滤镜

在配置编译FFmpeg时可以通过--disable-filters来禁止所有滤镜的编译。也可以配置编译脚本来输出所有包含进编译的滤镜信息。

下面是当前可用的视频滤镜介绍。

alphaextract

把输入视频作为灰度视频来提取透明通道,它通常和alphamerge滤镜联用。

alphamerge

通过添加或者替换透明通道,让主要视频与另外一路视频混合。这里主要是使用alphaextract来让不支持透明通道的视频成为允许传输或存储帧透明的帧序列

例如:为了重建完整的帧,让一个普通的YUV编码视频和利用了alphaextract的一个单独的视频混合:

movie=in_alpha.mkv [alpha]; [in][alpha] alphamerge [out]

因为这个滤镜专为重建帧设计,所以它的运行过程中没有考虑时间戳,而是在输入达到流结束时终止。这可能将导致编码管道丢帧,如果你仅想实现一个图像叠加到视频,建议采用overlay滤镜。

ass

类似subtitles,除了它不需要libavcodeclibavformat。另一方面,它受限于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_radiusalpha_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_poweralpha_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_wout_hxy参数都可以是表达式,包含下述意义:

  • x

  • y

    计算x和y,通常每帧计算

  • in_w

  • in_h

    输入的宽和高

  • iw

  • ih

    同于in_win_h

  • out_w

  • out_h

    输出的(裁剪后的)宽和高

  • ow

  • oh

    同于out_wout_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’.

通过一个简单的插值周围像素来抑制台标。仅需要在台标周围设置一个矩形遮盖就可以消除台标(有时会出现莫名的东西)

它接受下面的参数:

  • 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

    设置文本扩展模式。可以为nonestrftime (已弃用了) 或 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选项,则必须设定。

    如果同时设定了texttextfile将引发一个错误

  • 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坐标。

    所有参数都允许xy被引用,例如y=x/dar

文本扩展

如果expansion设置为strftime,则滤镜会接受strftime()序列提供的文本并进行相应扩展。检查strftime()的文档。这个特性现在是弃用的。

如果expansion设置为none,则文本都是直接打印文本(即直接以文本内容不扩展进行输出)

如果expansion设置为normal(它是默认值),将应用下面的扩展规则。

序列形式${...}的内容将被扩展。大括号之间的文本是一个函数的名字,可能紧随其后是一些用隔开的参数。如果包含特殊字符或分隔符(这里是:或者}),它们应该被转义。

注意对于在作为滤镜参数的text选项值,或者滤镜链图中的参数(多个滤镜连接时)以及是在shell环境中使用,则可能需要4层转义。使用文本文件可以避免这些问题(减少转义的使用)。

下面是有效的函数(功能):

  • expr, e

    计算结果的表达式

    它必须有一个参数来计算,接受计算x和y相同的常数和函数。注意并不是所有的常数都适合,例如text_wtext_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阀值,从而标注出边缘

    lowhigh的值范围为[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例子
  • 提取亮度和uv颜色分量到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_framestart_time都被设置,则效果会在更后的时间开始,默认为0

  • duration, d

    按秒的效果持续时间。对于淡入,在此时后将以本身的视频输出,对于淡出此时后将以设定的颜色输出。如果durationnb_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滤镜不足以分离出交错内容,所以需要一个诸如

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值