40 多媒体滤镜

下面介绍当前有效的多媒体滤镜

avectorscope

转换输入音频到视频输出以代表音频矢量范围(一种图形化音频处理)

这个滤镜用来测量立体声音频中两路音频间的区别。如果是单声道信号做成的2个声道(左右耳声道),因为两路完全相同(其实只有1路),所以输出是一个垂直的直线(表示二者无差别)。如果是立体声信号(两路肯定或多或少有差别),则创建一个利萨如(Lissajous)图形,其水平看,线长度与相位等表征了两个声道差异情况。

滤镜接受如下选项:

  • mode, m

    设置矢量显示模式,有效值为:

    ‘lissajous’

    1. 利萨如(Lissajous)旋转45度.

    ‘lissajous_xy’

    1. 同上,但不旋转.

    默认‘lissajous’.

  • size, s

    设置输出视频尺寸。语法同于ffmpeg-utils手册中的视频尺寸章节。默认400x400.

  • rate, r

    设置输出帧率,默认25.

  • rc
  • gc
  • bc

    分别用于指定红、绿、蓝颜色(表征对比图形的颜色)。分别默认为 40, 160 和80. 各个值的范围在 [0, 255].

  • rf
  • gf
  • bf

    分别指定淡入淡出时红、绿、蓝颜色, 分别默认值为15, 10和5.分别值范围为[0, 255].

  • zoom

    设置缩放因子,默认为1,允许[1, 10].

avectorscope例子

  • 利用ffplayer播放

    ffplay -f lavfi ‘amovie=input.mp3, asplit [a][out1];

    1. [a] avectorscope=zoom=1.3:rc=2:gc=200:bc=10:rf=1:gf=8:bf=7 [out0]'

concat

连接音频和视频流,把加入的一个接一个的在一起

这个滤镜用于按段同步视频和音频流。所有的段都必须有相同的流(类型和个数),输出也是相同流(类型和个数)

滤镜支持如下选项:

  • n

    设置段的数量,默认为2

  • v

    设置输出中视频流数量,则每个段中必须有输入视频流的数量。默认为1

  • a

    设置输出中音频流数量,则每个段中必须有输入音频流的数量,默认为0

  • unsafe

    激活不安全模式,这时如果段中有不同格式不会失败

滤镜有 v+a的输出:先是一个视频输出,然后是音频输出。

n x (v+a):有n段输出,每段都是v+a

相关的流并不总是有相同的时间,由于各种原因还包括不同的编解码帧大小或创作草稿。因此相关同步流(视频和对应音频)要连接,concat滤镜将选择持续最长的流(视频的)为基准(除最后段的流),在每个流播放时通过让音频流垫长(重复部分)或者静默(截断)来实现视频流连续。

为了让滤镜工作正常,所有段都必须以0为时间戳开始。

所有应用的流在所有共同的领域必须有相同的参数,滤镜会自动选择一个通用的像素格式(色彩标注、编码颜色的标准和位深等),以及音频采样率和通道布局。但其他设置如视频分辨率必须由用户显式转换。

不同的帧率是可以接受的,但会导致输出帧率的变化,一定要配置输出文件来处理。

concat例子

  • 连接一个有双语版的多段视频成为整体(视频中0号流,音频在1号和2号流)

    ffmpeg -i opening.mkv -i episode.mkv -i ending.mkv -filter_complex \
    ‘[0:0] [0:1] [0:2] [1:0] [1:1] [1:2] [2:0] [2:1] [2:2] concat=n=3:v=1:a=2 [v] [a1] [a2]’ \
    -map ‘[v]’ -map ‘[a1]’ -map ‘[a2]’ output.mkv

  • 连接2个部分,分别处理音频和视频,使用电影来源标准调整分辨率。

    movie=part1.mp4, scale=512:288 [v1] ; amovie=part1.mp4 [a1] ;movie=part2.mp4, scale=512:288 [v2] ;movie=part2.mp4 [a2] ;[v1] [v2] concat [outv] ; [a1] [a2] concat=v=0:a=1 [outa]

    注意在开始的不同步现象会发生在音频和视频没有完全相同持续时间情况下。

ebur128

EBU R128 扫描滤镜,这个滤镜需要一个音频流,但会原样输出。默认情况下,会显示10H更新频率下,的瞬时响度(M)、短期响度(S)、集成响度(I)和响度范围(LRA)

滤镜有一个实时视频输出,展示响度变化。因为上述图像不停更新,所以它不可打印化输出,除非详细日志被设置。主要的绘图区域包含短期响度(3秒分析),以及其后的瞬时响度(400毫秒)

关于EBU R128响度滤镜的更多信息参考http://tech.ebu.ch/loudness

滤镜介绍如下选项:

  • video

    激活视频输出。无论怎么设置,音频流在过程中都不会变化(从输入到输出),如果激活,则视频将作为第一个输出流。默认为0

  • size

    设置视频尺寸。语法同于ffmpeg-utils手册中的视频尺寸章节。默认640x480.

  • meter

    设置EBU的规模计。默认为9,通用值是9和18,对应于规模计+9和+18.任何非负整数是可以的。

  • metadata

    设置添加的元数据。如果为1,音频输入将被划分为100毫秒的输出帧。他们每个都包含各种响应信息元数据。所有的元数据键前又缀有lavfi.r128..

    默认为0.

  • framelog

    强制帧日志层次,允许值:

    ‘info’

    1. 信息日志层次

    ‘verbose’

    1. 冗长日志层次

    默认为info,如果设置视频或者元数据则选择verbose

  • peak

    设置峰顶模式

    有效的模式可以累积(可选标志类型),可能的值:

    ‘none’

    1. 没有任何峰顶模式(默认)

    ‘sample’

    1. 允许sample-peak模式 mode.
    2. 简单的峰值模式,其只寻找高样本值. 在日志中有一个`sample-peak`消息 (标记有SPK).

    ‘true’

    1. 允许true-peak模式
    2. 如果启用,峰值查找是一个over-sampled版本的输入流,其峰值精度更佳,在日志中有一个`true-peak`消息 (标记有TPK),且每个帧有一个`true-peak` (标记有FTPK)。这种模式需要与libswresample构建。

ebur128例子

  • 利用EBU 放缩规模计+18d 的实时图像

    ffplay -f lavfi -i “amovie=input.mp3,ebur128=video=1:meter=18 [out0][out1]”

  • 在ffmpeg中分析

    ffmpeg -nostats -i input.mp3 -filter_complex ebur128 -f null -

interleave和ainterleave

从多个输入中暂时交错帧,interleave用于视频输入,ainterleave用于音频输入。

这个滤镜从多个输入读取帧,然后然后按一定顺序(最老的先发送)发送给输出。

输入流必须有定义良好的、递增的帧时间戳。

为了提交一帧输出,滤镜需至少在一个框架内为每个输入排序,所以不能工作在一个输入还没有终止情况,也不会接收传入帧(持续生存的)

例如考虑一个输入是select滤镜其可以按帧丢弃,interleave滤镜会保持从输入读取,但不发送任何帧到输出直到输入发送来end-of-stream信号。

另外,根据输入同步,滤镜将丢帧,以防止一个输入收到比其他帧(时间戳)偏离太多,和队列满时

滤镜接受下面选项:

  • nb_inputs, n

    设置不同数量的输入,默认为2

    interleave和ainterleave例子

  • 使用ffmpeg交错不同的流:

    ffmpeg -i bambi.avi -i pr0n.mkv -filter_complex “[0:v][1:v] interleave” out.avi

  • 添加闪烁模糊效果:

    select=’if(gt(random(0), 0.2), 1, 2)’:n=2 [tmp], boxblur=2:2, [tmp] interleave

perms和aperms

为输出帧设置读/写权限

这些滤镜主要针对开发人员测试下面的滤镜链图的直接路径滤镜

这个滤镜接受下面选项:

  • mode

    选择权限模式,接受下面的值:

    ‘none’

    1. 什么都不做,是默认值

    ‘ro’

    1. 设置所有输出只读

    ‘rw’

    1. 设置所有输出可读写

    ‘toggle’

    1. 翻转,即原来是只读则为可读写,如果原来是可读写则为只读

    ‘random’

    1. 随机为只读或者可读写
  • seed

    设置moderandom时的随机种子。必须为0-UINT32_MAX间的整数。如果不指定,或者指定为-1,则滤镜尝试自动选择一个好的随机种子。

注意实际在许可-permission滤镜和其跟随的滤镜之间可能会自动插入滤镜,则许可滤镜可能不会有预期的效果给随后的滤镜,要避免这样的问题,可以在许可滤镜之前插入format或者aformat滤镜(分别针对perms/aperms)。

select和aselect

选择一些帧来输出

滤镜接受下面的选项:

  • expr, e

    设置一个表达式,它拥有对每个输入帧进行评估(计算)

    如果表达式计算结果为0,则该帧被丢弃

    如果计算结果为负或者NaN,则帧被发送给第一个输出,否则发送给指定数 ceil(val)-1 的输出,假设输入索引从0开始。

    例如 值为1.2会被发送给 ceil(1.2)-1 = 2-1 = 1, 即第2路输出.

  • outputs, n

    设置输出路数。输出对应于选择帧输出的结果,默认为1

表达式允许下面的内容:

  • n

    顺序化的滤镜帧,从0开始

  • selected_n

    被选择的(顺序化)帧,从0开始计数

  • prev_selected_n

    前一选择(顺序)帧,如果未定义则为NAN.

  • TB

    输入时间戳的时间基准

  • pts

    PTS,滤镜后视频帧(表示时间戳)分,采用TB为单位,如果未定义则为NAN

  • t

    PTS按秒为单位,滤镜后视频帧(时间戳),如果为定义则为NAN

  • prev_pts

    前一滤镜后视频帧PTS, 如果为定义则为NAN

  • prev_selected_pts

    前面最后的滤镜视频帧的PTS, 如果为定义则为NAN

  • prev_selected_t

    前面最后被选择的滤镜后视频帧的PTS, 如果为定义则为NAN

  • start_pts

    视频中第一个视频帧的PTS, 如果为定义则为NAN

  • start_t

    视频的开始时间. 如果为定义则为NAN

  • pict_type (video only)

    滤镜帧的类型,它可以是下面的值:

    I
    P
    B
    S
    SI
    SP
    BI

  • interlace_type (video only)

    帧交错类型,可以是下面的值:

    PROGRESSIVE

    1. 逐行 (非交错).

    TOPFIRST

    1. top-field-first类型帧

    BOTTOMFIRST

    1. bottom-field-first类型帧
  • consumed_sample_n (audio only)

    当前帧之前选定的样本的数量

  • samples_n (audio only)

    样品在当前帧的数量

  • sample_rate (audio only)

    输入样本率

  • key

    为1则滤镜框架是一个帧,否则为0

  • pos

    滤镜帧在文件中的偏移位置,-1为不可用(如合成视频)

  • scene (video only)

    值在0-1间,表面一个新场景。较低的值反映当前帧的低概率引入一个新场景,更高的值意味着更可能是同一个(场景,见下面的例子)

表达式的默认值是1

select和aselect例子

  • 选择所有的输入

    select

    这个例子等效于:

    select=1

  • 跳过所有的帧:

    select=0

  • 仅选择I帧:

    select=’eq(pict_type\,I)’

  • 每100帧选择1帧:

    select=’not(mod(n\,100))’

  • 只选择10-20时间间隔的帧:

    select=between(t\,10\,20)

  • 只选择10-20时间间隔的I帧:

    select=between(t\,10\,20)*eq(pict_type\,I)

  • 选择帧的最小距离为10秒:

    select=’isnan(prev_selected_t)+gte(t-prev_selected_t\,10)’

  • 使用aselect选择包含采样大于100的音频帧:

    aselect=’gt(samples_n\,100)’

  • 创建一个马赛克开始场景:

    ffmpeg -i video.avi -vf select=’gt(scene\,0.4)’,scale=160:120,tile -frames:v 1 preview.png

    对比场景对一个值在0.3和0.5之间通常是一个合理的选择

  • 奇数和偶数帧分别发送给不同的输出,并组合:

    select=n=2:e=’mod(n, 2)+1’ [odd][even]; [odd] pad=h=2*ih [tmp]; [tmp][even] overlay=y=h

sendcmd和asendcmd

在滤镜链图中向滤镜发送命令

这个滤镜读取命令来发送给滤镜链图中的滤镜

其中sendcmd用于两个视频滤镜间,asendcmd用于两个音频滤镜间。除此之外它们采用相同方式。

命令可以是规范的滤镜commands选项的参数或者指定在filename文件选项所指文件中。

它接受如下选项:

  • command, c

    设置要发送的命令

  • filename, f

    指定一个文件,读取其中命令进行发送

sendcmd和asendcmd命令语法

命令是一个序列间隔规则(由分隔),包括一个特定事件时段执行的命令列表。触发事件通常是当前帧的时间达到或者离开一个给定的时间段。

一个时间段命令由以下语法描述:

  1. START[-END] COMMANDS;

时间段描述由STARTEND(可选,默认为最大时间)指定

判断当前帧是否在指定时间段[START,END),既判断当前帧的时间是否大于等于START,且小于END

这里COMMANDS是对应于时间段的一个或者由分隔的多个命令序列。一个命令的语法规范是:

  1. [FLAGS] TARGET COMMAND ARG

这里FLAGS是可选的,用于指定事件类型与指定时间段关系的(命令发生发送频次),必须由非空标识符,以及+|[]封闭的字符,标志有:

  • enter

    命令在当前时间戳达到时间段时发送,换句话说命令发送的前一帧时间戳还不满足时间段要求,而当前已经是满足要求的

  • leave

    命令在当前时间戳离开时间段时发送,换句话说,命令发送时的前一帧还满足时间段要求,而当前已经不满足了

如果FLAGS没有指定,则默认为[enter]

这里TARGET是指定命令发送的目标,通常为滤镜类型名字或者滤镜实例名字。而COMMAND是发送给目标的命令名字,ARG是对应的选项参数。

一个简单的BNF 规格的命令描述语法如下:

  1. COMMAND_FLAG ::= "enter" | "leave"
  2. COMMAND_FLAGS ::= COMMAND_FLAG [(+|"|")COMMAND_FLAG]
  3. COMMAND ::= ["[" COMMAND_FLAGS "]"] TARGET COMMAND [ARG]
  4. COMMANDS ::= COMMAND [,COMMANDS]
  5. INTERVAL ::= START[-END] COMMANDS
  6. INTERVALS ::= INTERVAL[;INTERVALS]

sendcmd和asendcmd例子

  • 指定音频节奏(tempo)变化从4秒开始:

    asendcmd=c=’4.0 atempo tempo 1.5’,atempo

  • 帧文件中指定一个drawtexthue命令

    # 在时间5-10间显示一个文字
    5.0-10.0 [enter] drawtext reinit ‘fontfile=FreeSerif.ttf:text=hello world’,

    1. [leave] drawtext reinit 'fontfile=FreeSerif.ttf:text=';

    # 在时间15-20淡化图像
    15.0-20.0 [enter] hue s 0,

    1. [enter] drawtext reinit 'fontfile=FreeSerif.ttf:text=nocolor',
    2. [leave] hue s 1,
    3. [leave] drawtext reinit 'fontfile=FreeSerif.ttf:text=color';

    # 从时间25开始应用指数饱和渐变效果
    25 [enter] hue s exp(25-t)

    滤镜链图中读取然后处理前面的命令列表(存在test.cmd文件中),可以是如下处理:

    sendcmd=f=test.cmd,drawtext=fontfile=FreeSerif.ttf:text=’’,hue

setpts和asetpts

修改发布时间戳(PTS-presentation timestamp),对于输入帧。

其中setpts对于视频帧,asetpts对于音频帧

滤镜允许如下选项:

  • expr

    指定用于计算时间戳的表达式

表达式通过evalAPI和下面一些常量来计算:

  • FRAME_RATE

    帧率,仅对于指定了帧率的视频

  • PTS

    输入的PTS

  • N

    对输入视频帧计数或已经消耗的样本计数,不包括音频的当前帧,从0开始

  • NB_CONSUMED_SAMPLES

    采样数(因为音频是按固定频率采样,则一个采样其实就是自然的计时单位——类似帧率),不包括当前帧(仅对音频)

  • NB_SAMPLES, S

    当前帧中的采样数 (仅音频)

  • SAMPLE_RATE, SR

    音频采样率

  • STARTPTS

    第一帧的PTS

  • STARTT

    第一帧的按秒时间

  • INTERLACED

    指示当前帧是否交错

  • T

    当前帧的按秒时间

  • POS

    初始位置在文件中的偏移,为当前帧,如果为定义则本值也为定义

  • PREV_INPTS

    前一个帧的PTS.

  • PREV_INT

    前一帧按秒时间

  • PREV_OUTPTS

    前一帧的输出PTS.

  • PREV_OUTT

    前一帧按秒输出时间

  • RTCTIME

    时间单位为微秒-microseconds. 现在被弃用,使用time(0)时

  • RTCSTART

    影片开始时间以微秒为单位

  • TB

    输入时间戳时基

setpts和asetpts例子

  • 从0开始计数PTS

    setpts=PTS-STARTPTS

  • 应用快速监看效果

    setpts=0.5*PTS

  • 应用慢速监看效果

    setpts=2.0*PTS

  • 强制为25的帧率:

    setpts=N/(25*TB)

  • 设置有抖动的25帧率:

    setpts=’1/(25TB) (N + 0.05 sin(N2*PI/25))’

  • 应用一个10秒的输入偏置:

    setpts=PTS+10/TB

  • 直播源和变基生成时间戳转换到当前时基时间戳:

    setpts=’(RTCTIME - RTCSTART) / (TB * 1000000)’

  • 按当前采样率生成时间戳:

    asetpts=N/SR/TB

settb和asettb

设置输出帧时间戳的时基。它主要用于测试时基配置。

其可以接受如下选项:

  • expr, tb

    用于计算输出时基的表达式或者值

这里的tb值是一个可得出有理数值的表达式或者值。常数可以包含“AVTB”(默认时基),“intb”(输入时基)和“sr”(采样率,只音频)。默认值是“intb”

settb和asettb例子

  • 设置时基为1/25

    settb=expr=1/25

  • 设置时基为1/10

    settb=expr=0.1

  • 设置时基为1001/1000

    settb=1+0.001

  • 设置时间为2倍intb

    settb=2*intb

  • 设置为默认值

    settb=AVTB

showcqt

转换音频输入为一个频谱视频输出(用恒Q变换Brown-Puckette算法),乐音的规模从E0D#10(10个8度)

滤镜接受如下选项:

  • volume

    指定转换表达式(对音量的乘数),可含如下变量:

    frequency, freq, f

    1. 转换中评估的频率

    timeclamp, tc

    1. timeclamp选项值

    和下面的函数:

    a_weighting(f)

    1. 一个权重等响度A-weighting

    b_weighting(f)

    1. 一个权重等响度B-weighting

    c_weighting(f)

    1. 一个权重等响度C-weighting

    默认值16

  • tlength

    指定转换长度表达式,表达式可包含如下变量:

    frequency, freq, f

    1. 转换中评估的频率

    timeclamp, tc

    1. timeclamp选项值

    默认值384/f*tc/(384/f+tc).

  • timeclamp

    指定转换timeclamp,对于低频,精度在时间域和频率域间权衡,如果timeclamp较低,在时间域表示更准确(如快速低音鼓),否则在频域表示(如低音吉他)更准确。可接受的值是[0.1,1.0]。默认值是0.17。

  • coeffclamp

    指定转换coeffclamp. 如果coeffclamp低,转换更准确,否则转换速度更快。可接受的值是[0.1,10.0]。默认值是1.0。

  • gamma

    指定gamma。低的gamma值有更多比较细节高的则有更大的比较范围,可接受值范围 [1.0, 7.0]默认为3.0.

  • gamma2

    指定采用柱状图像gamma,接受值范围 [1.0, 7.0]. 默认为 1.0.

  • fontfile

    指定freetype字体文件,如果不知道则采用嵌入的字体

  • fontcolor

    指定文字颜色。是一个返回整数的算术表达式值-0xRRGGBB可以包含下面的变量:

    frequency, freq, f

    1. 转换中评估的频率

    timeclamp, tc

    1. timeclamp选项值

    和函数:

    midi(f)

    1. midi数频率,一些midi数为: E0(16), C1(24), C2(36), A4(69)

    r(x), g(x), b(x)

    1. 红、绿、蓝的值

    默认值为 st(0, (midi(f)-59.5)/12); st(1, if(between(ld(0),0,1), 0.5-0.5cos(2PI*ld(0)), 0)); r(1-ld(1)) + b(ld(1))

  • fullhd

    如果为1 (默认值),视频分辨率为1920x1080 (full HD),如果设置为0,则视频分辨率为960x540,使用这个值可以降低CPU使用

  • fps

    指定视频帧率——fps,默认25.

  • count

    指定每帧中的转换数,fpscount是1秒中的转换数。注意音频数据率必须是fpscount的整数倍。默认为6

showcqt例子

  • 播放音频显示频谱:

    ffplay -f lavfi ‘amovie=a.mp3, asplit [a][out1]; [a] showcqt [out0]’

  • 同上,但使用30的帧率:

    ffplay -f lavfi ‘amovie=a.mp3, asplit [a][out1]; [a] showcqt=fps=30:count=5 [out0]’

  • 频谱为960x540和降低CPU使用率:

    ffplay -f lavfi ‘amovie=a.mp3, asplit [a][out1]; [a] showcqt=fullhd=0:count=3 [out0]’

  • A1 和其谐波: A1, A2, (near)E3, A3:

    ffplay -f lavfi ‘aevalsrc=0.1sin(2PI55t)+0.1sin(4PI55t)+0.1sin(6PI55t)+0.1sin(8PI55t),

    1. asplit[a][out1]; [a] showcqt [out0]'
  • 类似上面,但帧频域更准确(更慢):

    ffplay -f lavfi ‘aevalsrc=0.1sin(2PI55t)+0.1sin(4PI55t)+0.1sin(6PI55t)+0.1sin(8PI55t),

    1. asplit[a][out1]; [a] showcqt=timeclamp=0.5 [out0]'
  • B-weighting等响度

    volume=16*b_weighting(f)

  • 低的Q因子

    tlength=100/f*tc/(100/f+tc)

  • 定制字体颜色,C-note为green,其他为blue

    fontcolor=’if(mod(floor(midi(f)+0.5),12), 0x0000FF, g(1))’

  • 定制gamma,现在有光谱线性振幅

    gamma=2:gamma2=2

showspectrum

转换音频输入为一个视频频谱

滤镜接受如下选项:

  • size, s

    指定视频尺寸。语法同于ffmpeg-utils手册中的视频尺寸章节。默认为640x512.

  • slide

    指定窗口中光谱如何滑动,有如下可能值:

    ‘replace’

    1. 当滑动到最右边后又从左开始 reach the right

    ‘scroll’

    1. 向左滚动

    ‘fullframe’

    1. 帧在时间到达时正确生成

    默认为replace.

  • mode

    指定显示模式,接受如下值

    ‘combined’

    1. 所有的通道在一个行中显示

    ‘separate’

    1. 通道显示在各自行中

    默认为‘combined’.

  • color

    指定显示的颜色模式,接受下面的值:

    ‘channel’

    1. 每个通道采样指定的颜色显示

    ‘intensity’

    1. 每个通道采样相同的配色方案

    默认为‘channel’.

  • scale

    指定用于计算强度的颜色值,允许如下的值:

    ‘lin’

    1. 线性

    ‘sqrt’

    1. 平方根,默认

    ‘cbrt’

    1. 立方根

    ‘log’

    1. 对数

    默认‘sqrt’.

  • saturation

    设置显示颜色饱和度修饰符,负值提供可供选择的配色方案,0没有饱和,值范围为[-10.0, 10.0],默认为1.

  • win_func

    设置窗口函数,接受如下值:

    ‘none’

    1. 没有预处理 (这时最快的了)

    ‘hann’

    1. Hann窗口

    ‘hamming’

    1. Hamming窗口

    ‘blackman’

    1. Blackman窗口

    默认为hann

它类似于showwaves滤镜,看下面的例子

showspectrum例子

  • 采样对数颜色放缩的大窗口

    showspectrum=s=1280x480:scale=log

  • 使用ffplay每通道颜色和滑动频谱的完整示例

    ffplay -f lavfi ‘amovie=input.mp3, asplit [a][out1];

    1. [a] showspectrum=mode=separate:color=intensity:slide=1:scale=cbrt [out0]'

showwaves

转换音频输入为视频输出(代表采样波形),接受如下选项:

  • size, s

    指定视频尺寸,语法同于ffmpeg-utils手册中的视频尺寸章节。默认为600x240.

  • mode

    设置显示模式,允许下面的值:

    ‘point’

    1. 每个采样画一个点.

    ‘line’

    1. 每个采样画一条直线

    ‘p2p’

    1. 每个采样画一个点,且用直线连起来。

    ‘cline’

    1. 每个采样画一个中垂直线

    默认为point

  • n

    设置一列中采样数量。一个更大的值将降低帧率。必须是正整数。它可以根据帧率计算而不用显式指定

  • rate, r

    设置输出帧率(近视),其可以起到n选项左右,默认为25

  • split_channels

    是否分别通道或者覆盖,默认为0

showwaves例子

  • 同时输出音频和其对应视频表示:

    amovie=a.mp3,asplit[out0],showwaves[out1]

  • 利用showwaves创建一个同步信号并显示,帧率为30:

    aevalsrc=sin(12PIt)sin(8802PIt):cos(2PI200t),asplit[out0],showwaves=r=30[out1]

showwavespic

转换音频输入为视频输出(代表采样波形),接受如下选项:

  • size, s

    指定视频尺寸,语法同于ffmpeg-utils手册中的视频尺寸章节。默认为600x240.

  • split_channels

    是否分别通道或者覆盖,默认为0

    showwavespic例子

  • 利用ffmpeg按通道提取波形,并展示在1024x800图片中

    ffmpeg -i audio.flac -lavfi showwavespic=split_channels=1:s=1024x800 waveform.png

    split和asplit

    从输入中选择一些来输出

其中asplit对于音频工作,split对于视频工作

这个滤镜接受单个指定输出个数的参数,如果不指定,默认为2

split和asplit例子

  • 对一个输入创建2给相同的输出:

    [in] split [out0][out1]

  • 创建3给或者更多的输出,你需要为每个输出指定标签,如下:

    [in] asplit=3 [out0][out1][out2]

  • 创建2个输出,其中一个作为cropped的输入,一个作为pad的输入:

    [in] split [splitout1][splitout2];
    [splitout1] crop=100:100:0:0 [cropout];
    [splitout2] pad=200:200:100:100 [padout];

  • 对输入音频制作5份拷贝:

    ffmpeg -i INPUT -filter_complex asplit=5 OUTPUT

zmq和azmq

接受从libzmq客户端发送来的命令,并将它们发送给滤镜链图中的滤镜。

这里zmqazmq都是直通滤镜,只是zmq工作于两个视频滤镜间,而azmq工作于两个音频滤镜间。

编译需要libzmq库以及头文件,并采样--enable-libzmq配置

关于libzmq的更多信息参考http://www.zeromq.org/

滤镜zmqazmq都需要libzmq服务,它通过网络来发送定义于bind_address选项的接收消息接口

接收的消息必须有如下格式:

  1. TARGET COMMAND [ARG]

这里TARGET指定命令目标,通常是滤镜类名或者滤镜实例名,COMMAND为命令,ARG为可选的参数列表(对于COMMAND)。

在接收,处理信息和相应的命令,并注入滤镜链图,根据结果,滤镜发送一个返回信息给客户端,采样的格式为:

  1. ERROR_CODE ERROR_REASON
  2. MESSAGE

其中MESSAGE是可选的。

zmq和azmq例子

参考tools/zmsend中的一个zmq客户端例子,它被用来向这些的滤镜发送命令

考虑以下用于ffplay的滤镜链图:

  1. ffplay -dumpgraph 1 -f lavfi "
  2. color=s=100x100:c=red [l];
  3. color=s=100x100:c=blue [r];
  4. nullsrc=s=200x100, zmq [bg];
  5. [bg][l] overlay [bg+l];
  6. [bg+l][r] overlay=x=100 "

为了改变视频左边的颜色,下面的命令被使用:

  1. echo Parsed_color_0 c yellow | tools/zmqsend

如果要改变右边:

  1. echo Parsed_color_1 c pink | tools/zmqsend