FFplay文档解读-49-多媒体过滤器三
前言
Github
地址:Github
简书地址:简书
专辑地址:FFplay专辑
32.14 sendcmd, asendcmd
将命令发送到filtergraph
中的过滤器。
这些过滤器读取要发送到filtergraph
中其他过滤器的命令。
必须在两个视频滤镜之间插入sendcmd
,必须在两个音频滤镜之间插入asendcmd
,但除此之外,它们的行为方式相同。
可以使用commands
选项在filter
参数中提供命令规范,也可以在filename
选项指定的文件中提供命令规范。
这些过滤器接受以下选项:
commands, c
设置要读取的命令并将其发送到其他过滤器。
filename,f
设置要读取的命令的文件名并将其发送到其他过滤器。
32.14.1 命令语法
命令描述由一系列间隔规范组成,包括当与该间隔相关的特定事件发生时要执行的命令列表。 发生的事件通常是进入或离开给定时间间隔的当前帧时间。
间隔由以下语法指定:
START[-END] COMMANDS;
时间间隔由START
和END
时间指定。 END
是可选的,默认为最长时间。
如果当前帧时间包含在间隔[START,END]
中,即当时间大于或等于START
且小于END
时,则认为当前帧时间在指定的时间间隔内。
命令由一个或多个命令规范的序列组成,由","
分隔,与该间隔有关。 命令规范的语法由下式给出:
[FLAGS] TARGET COMMAND ARG
FLAGS
是可选的,它指定与发送指定命令的时间间隔相关的事件类型,并且必须是由"+"
或"|"
分隔的非空序列标识符标志。 并包含在"["and"]"
之间。
识别以下标志:
标志 | 解释 |
---|---|
enter | 当前帧时间戳进入指定的时间间隔时发送该命令。 换句话说,当前一帧时间戳不在给定的时间间隔内时,发送命令,并且当前是 |
leave | 当前帧时间戳离开指定的时间间隔时发送该命令。 换句话说,当前一帧时间戳在给定间隔内时发送命令,而当前帧时间戳不在给定间隔内 |
如果未指定FLAGS
,则假定为[enter]
的默认值。
TARGET
指定命令的目标,通常是过滤器类的名称或特定的过滤器实例名称。
COMMAND
指定目标过滤器的命令名称。
ARG
是可选的,它指定给定COMMAND
的可选参数列表。
在一个间隔规范和另一个间隔规范之间,空格或以#开头直到行尾的字符序列将被忽略,并可用于注释注释。
命令规范语法的简化BNF
描述如下:
COMMAND_FLAG ::= "enter" | "leave"
COMMAND_FLAGS ::= COMMAND_FLAG [(+|"|")COMMAND_FLAG]
COMMAND ::= ["[" COMMAND_FLAGS "]"] TARGET COMMAND [ARG]
COMMANDS ::= COMMAND [,COMMANDS]
INTERVAL ::= START[-END] COMMANDS
INTERVALS ::= INTERVAL[;INTERVALS]
32.14.2 示例
-
在第二个
4
指定音频速度变化:asendcmd=c='4.0 atempo tempo 1.5',atempo
-
定位特定的过滤器实例:
asendcmd=c='4.0 atempo@my tempo 1.5',atempo@my
-
在文件中指定
drawtext
和hue
命令的列表。# show text in the interval 5-10 5.0-10.0 [enter] drawtext reinit 'fontfile=FreeSerif.ttf:text=hello world', [leave] drawtext reinit 'fontfile=FreeSerif.ttf:text='; # desaturate the image in the interval 15-20 15.0-20.0 [enter] hue s 0, [enter] drawtext reinit 'fontfile=FreeSerif.ttf:text=nocolor', [leave] hue s 1, [leave] drawtext reinit 'fontfile=FreeSerif.ttf:text=color'; # apply an exponential saturation fade-out effect, starting from time 25 25 [enter] hue s exp(25-t)
允许读取和处理存储在文件'test.cmd'
中的上述命令列表的过滤器图可以用以下内容指定:
sendcmd=f=test.cmd,drawtext=fontfile=FreeSerif.ttf:text='',hue
32.15 setpts, asetpts
更改输入帧的PTS
(演示时间戳)。
setpts
适用于视频帧,音频帧上的设置。
此过滤器接受以下选项:
expr
为每个帧计算的表达式,以构造其时间戳。
表达式通过eval API
进行评估,并且可以包含以下常量:
FRAME_RATE
帧速率,仅针对恒定帧速率视频定义
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
wallclock
(RTC
)时间,以微秒为单位。这是不推荐使用的,而是使用时间(0
)。
RTCSTART
电影开始时的wallclock
(RTC
)时间,以微秒为单位。
TB
输入时间戳的时基。
32.15.1 示例
-
从零开始计算
PTS
setpts=PTS-STARTPTS
-
应用快动作效果:
setpts=0.5*PTS
-
应用慢动作效果:
setpts=2.0*PTS
-
设置固定速率为每秒
25
帧:setpts=N/(25*TB)
-
设置固定速率
25 fps
并产生一些抖动:setpts ='1 /(25 * TB)*(N + 0.05 * sin(N * 2 * PI / 25))'
-
对输入PTS应用10秒的偏移量:
setpts=PTS+10/TB
-
从
"live source"
(实时源)生成时间戳并将其重新绑定到当前时基:setpts ='(RTCTIME - RTCSTART)/(TB * 1000000)'
-
通过计算样本生成时间戳:
asetpts=N/SR/TB
32.16 setrange
强制输出视频帧的颜色范围。
setrange
过滤器标记输出帧的颜色范围属性。 它不会更改输入框架,但只会设置相应的属性,这会影响后续过滤器对框架的处理方式。
过滤器接受以下选项:
range
可用值如下:
值 | 解释 |
---|---|
unspecified, unknown | 将颜色范围设置为未指定 |
limited, tv, mpeg | 将颜色范围设置为有限 |
full, pc, jpeg | 将颜色范围设置为已满 |
32.17 settb, asettb
设置用于输出帧时间戳的时基。 它主要用于测试时基配置。
它接受以下参数:
expr,tb
表达式,计算到输出时基。
'tb'
的值是表示理性的算术表达式。 表达式可以包含常量AVTB
(默认时基),intb
(输入时基)和sr
(采样率,仅音频)。 默认值为intb
。
32.17.1 示例
-
将时基设置为
1/25
:settb= EXPR=25分之1
-
将时基设置为
1/10
:settb= EXPR= 0.1
-
将时基设置为
1001/1000
:settb= 1 +0.001
-
将时基设置为
2*intb
:settb= 2 * INTB
-
设置默认时基值:
settb= AVTB
32.18 showcqt
使用具有直接频域系数计算的Brown-Puckette
常数Q
变换算法将输入音频转换为表示频谱的视频输出(但变换本身不是真正的常数Q
,而Q
因子实际上是variable/clamped
(可变/钳位)的),具有音调比例,从E0
到D#10
。
过滤器接受以下选项:
size,s
指定输出的视频大小。它必须是均匀的。有关此选项的语法,请参阅(ffmpeg-utils)视频大小语法
。默认值为1920x1080
。
fps,rate,r
设置输出帧速率。默认值为25
。
bar_h
设置条形图高度。它必须是均匀的。默认值为-1
,自动计算条形图高度。
axis_h
设置轴高度。它必须是均匀的。默认值为-1
,它自动计算轴高度。
sono_h
设置声像图高度。它必须是均匀的。默认值为-1
,自动计算声谱图高度。
fullhd
设置fullhd
分辨率。不推荐使用此选项,而是使用size
。默认值为1
。
sono_v, volume
指定超声波体积表达式。它可以包含如下的变量:
变量 | 解释 |
---|---|
bar_v |
bar_v 评估了表达式 |
frequency, freq, f | 评估的频率 |
timeclamp, tc |
timeclamp 选项的值 |
和如下所示的功能:
功能 | 解释 |
---|---|
a_weighting(f) | 等于响度的A-weighting
|
b_weighting(f) | 等于响度B-weighting
|
c_weighting(f) | 等于响度C-weighting
|
默认值是:16
。
bar_v, volume2
指定条形图卷表达式。 它可以包含如下变量:
变量 | 解释 |
---|---|
sono_v |
sono_v 评估表达式 |
frequency, freq, f | 评估的频率 |
timeclamp, tc |
timeclamp 选项的值 |
和如下功能:
功能 | 解释 |
---|---|
a_weighting(f) | 等于响度的A-weighting
|
b_weighting(f) | 等于响度B-weighting
|
c_weighting(f) | 等于响度C-weighting
|
默认值是:sono_v
。
sono_g, gamma
指定超声波伽玛。 较低的伽玛使光谱对比度更高,更高的伽玛使光谱具有更大的范围。 默认值为3
。可接受范围为[1,7]
。
bar_g,gamma2
指定条形图伽玛。默认值为1
。可接受的范围是[1,7]
。
bar_t
指定条形图透明度级别。较低的值使条形图更清晰。默认值为1
。可接受的范围是[0,1]
。
timeclamp,tc
指定转换timeclamp
。在低频率下,在时域精度和频域精度之间存在折衷。如果timeclamp
较低,则更准确地表示时域中的事件(例如快速低音鼓),否则更准确地表示频域中的事件(例如低音吉他)。可接受的范围是[0.002,1]
。默认值为0.17
。
attack
以秒为单位设置攻击时间。默认值为0
(禁用)。否则,它通过在时域中应用非对称窗口来限制未来样本,在需要低延迟时非常有用。可接受的范围是[0,1]
。
basefreq
指定变换基频。默认值为20.01523126408007475
,比E0
低50 cents
。可接受的范围是[10,100000]
。
endfreq
指定变换结束频率。默认值为20495.59681441799654
,频率比D#10
高50 cents
。可接受的范围是[10,100000]
。
coeffclamp
不推荐使用此选项并将其忽略。
tlength
在时域中指定变换长度。使用此选项可控制每个频率样本的时域和频域之间的准确性折衷。它可以包含如下变量:
变量 | 解释 |
---|---|
frequency, freq, f | 评估的频率 |
timeclamp, tc | timeclamp选项的值 |
默认值是:384*tc/(384+tc*f)
。
count
指定每个视频帧的变换计数。 默认值为6
。可接受的范围是[1,30]
。
fcount
指定每个像素的变换计数。 默认值为0
,这使其自动计算。 可接受的范围是[0,10]
。
fontfile
指定用于freetype
的字体文件以绘制轴。 如果未指定,请使用嵌入字体。 请注意,使用自定义basefreq
和endfreq
不会使用字体文件或嵌入字体绘制,而是使用axisfile
选项。
font
指定fontconfig
模式。 它的优先级低于fontfile
。:
在模式中可以用|
替换 避免不必要的逃避。
fontcolor
指定字体颜色表达式。 这是算术表达式,应该返回整数值0xRRGGBB
。 它可以包含如下变量:
变量 | 解释 |
---|---|
frequency, freq, f | 评估的频率 |
timeclamp, tc |
timeclamp 选项的值 |
和如下功能:
功能 | 解释 |
---|---|
midi(f) |
midi 频率f ,一些midi 数:E0(16),C1(24),C2(36),A4(69)
|
r(x), g(x), b(x) | 强度x 的红色,绿色和蓝色值 |
默认值是:st(0, (midi(f)-59.5)/12); st(1, if(between(ld(0),0,1), 0.5-0.5*cos(2*PI*ld(0)), 0)); r(1-ld(1)) + b(ld(1))
。
axisfile
指定图像文件以绘制轴。 此选项会覆盖fontfile
和fontcolor
选项。
axis, text
启用/禁用绘图文本到轴。 如果设置为0
,则禁用绘制到轴,忽略fontfile
和axisfile
选项。 默认值为1
。
csp
设置颜色空间。 接受的值如下所示:
值 | 解释 |
---|---|
unspecified |
Unspecified (默认值) |
bt709 | BT.709 |
fcc | FCC |
bt470bg |
BT.470BG 或者 BT.601-6 625
|
smpte170m |
SMPTE-170M 或者 BT.601-6 525
|
smpte240m | SMPTE-240M |
bt2020ncl |
BT.2020 具有非恒定亮度 |
cscheme
设置频谱图配色方案。 这是浮点值列表,格式为left_r|left_g|left_b|right_r|right_g|right_b
。 默认值为1|0.5|0|0|0.5|1
。
32.18.1 示例
-
在显示频谱时播放音频:
ffplay -f lavfi'amovie = a.mp3,asplit [a] [out1]; [a] showcqt [out0]'
-
与上面相同,但帧速率为
30 fps
:ffplay -f lavfi'amovie = a.mp3,asplit [a] [out1]; [a] showcqt = fps = 30:count = 5 [out0]'
-
以1280x720进行播放:
ffplay -f lavfi'amovie = a.mp3,asplit [a] [out1]; [a] showcqt = s = 1280x720:count = 4 [out0]'
-
禁用超声波显示:
sono_h = 0
-
A1
及其谐波:A1
,A2
,(near)E3
,A3
:ffplay -f lavfi 'aevalsrc=0.1*sin(2*PI*55*t)+0.1*sin(4*PI*55*t)+0.1*sin(6*PI*55*t)+0.1*sin(8*PI*55*t), asplit[a][out1]; [a] showcqt [out0]'
-
下一个语法与上述相同,但在频域中具有更高的准确性:
ffplay -f lavfi 'aevalsrc=0.1*sin(2*PI*55*t)+0.1*sin(4*PI*55*t)+0.1*sin(6*PI*55*t)+0.1*sin(8*PI*55*t), asplit[a][out1]; [a] showcqt=timeclamp=0.5 [out0]'
-
自定义量:
bar_v=10:sono_v=bar_v*a_weighting(f)
-
自定义伽马,现在频谱与幅度成线性关系。
bar_g=2:sono_g=2
-
自定义
tlength
方程:tc=0.33:tlength='st(0,0.17); 384*tc / (384 / ld(0) + tc*f /(1-ld(0))) + 384*tc / (tc*f / ld(0) + 384 /(1-ld(0)))'
-
自定义
fontcolor
和fontfile
,C-note
为绿色,其他为蓝色:fontcolor='if(mod(floor(midi(f)+0.5),12), 0x0000FF, g(1))':fontfile=myfont.ttf
-
使用
fontconfig
自定义字体:font='Courier New,Monospace,mono|bold'
-
自定义频率范围与使用图像文件的自定义轴:
axisfile=myaxis.png:basefreq=40:endfreq=10000
32.19 showfreqs
将输入音频转换为表示音频功率谱的视频输出。 音频幅度在Y
轴上,而频率在X
轴上。
过滤器接受以下选项:
size, s
指定视频大小。 有关此选项的语法,请查阅(ffmpeg-utils)视频大小语法
。 默认值为1024x512
。
mode
设置显示模式。 这设置了每个频率仓的表示方式。
它接受以下值:
值 |
---|
line |
bar |
dot |
默认值是:bar
。
ascale
设置幅度标度。
它接受以下值:
值 | 解释 |
---|---|
lin | 线性刻度 |
sqrt | 平方根尺度 |
cbrt | 立方根尺度 |
log | 对数刻度 |
默认值是:log
。
fscale
设定频率刻度。
它接受以下值:
值 | 解释 |
---|---|
lin | 线性刻度 |
log | 对数刻度 |
rlog | 反向对数刻度 |
默认值是:lin
。
win_size
设置窗口大小。
它接受以下值:
值 |
---|
w16 |
w32 |
w64 |
w128 |
w256 |
w512 |
w1024 |
w2048 |
w4096 |
w8192 |
w16384 |
w32768 |
w65536 |
默认值是:w2048
。
win_func
设置窗口功能。
它接受以下值:
值 |
---|
rect |
bartlett |
hanning |
hamming |
blackman |
welch |
flattop |
bharris |
bnuttall |
bhann |
sine |
nuttall |
lanczos |
gauss |
tukey |
dolph |
cauchy |
parzen |
poisson |
默认值是:hanning
。
overlap
设置窗口重叠。 在[0,1]
范围内。 默认值为1
,表示将选择所选窗口函数的最佳重叠。
averaging
设定时间平均值。 将其设置为0
将显示当前的最大峰值。 默认值为1
,表示禁用时间平均。
colors
指定由空格或|
分隔的颜色列表,用于绘制通道频率。 未识别或缺失的颜色将被白色替换。
cmode
设置频道显示模式。
它接受以下值:
值 |
---|
combined |
separate |
默认值是:combined
。
minamp
设置log
(对数)幅度定标器中使用的最小幅度。
32.20 showspectrum
将输入音频转换为视频输出,表示音频频谱。
过滤器接受以下选项:
size,s
指定输出的视频大小。 有关此选项的语法,请查阅(ffmpeg-utils)视频大小语法
。 默认值为640x512
。
slide
指定光谱应如何沿窗口滑动。
它接受以下值:
值 | 解释 |
---|---|
replace | 当样品到达右侧时,样品再次从左侧开始 |
scroll | 样本从右向左滚动 |
fullframe | 帧仅在样本到达右侧时生成 |
rscroll | 样本从左向右滚动 |
默认值是:replace
。
mode
指定显示模式。
它接受以下值:
值 | 解释 |
---|---|
combined | 所有通道都显示在同一行中 |
separate | 所有通道都显示在单独的行中 |
默认值是:‘combined’
。
color
指定显示颜色模式。
它接受以下值:
值 | 解释 |
---|---|
channel | 每个通道都以单独的颜色显示 |
intensity | 每个通道使用相同的颜色方案显示 |
rainbow | 使用彩虹配色方案显示每个通道 |
moreland | 每个通道都使用更多的颜色方案显示 |
nebulae | 使用星云颜色方案显示每个通道 |
fire | 使用火色方案显示每个通道 |
fiery | 每个通道都使用火热的配色方案显示 |
fruit | 使用水果配色方案显示每个通道 |
cool | 每个通道都使用炫酷的配色方案显示 |
默认值是:‘channel’
。
scale
指定用于计算强度颜色值的比例。
它接受以下值:
值 | 解释 |
---|---|
lin | 线性 |
sqrt | 平方根,默认 |
cbrt | 立方根 |
log | 对数的 |
4thrt | 第4根 |
5thrt | 第5根 |
默认值是:‘sqrt’
。
saturation
为显示的颜色设置饱和度修改器。 负值提供替代配色方案。 0
根本没有饱和。 饱和度必须在[-10.0,10.0]
范围内。 默认值为1
。
win_func
设置窗口功能。
它接受以下值:
值 |
---|
rect |
bartlett |
hann |
hanning |
hamming |
blackman |
welch |
flattop |
bharris |
bnuttall |
bhann |
sine |
nuttall |
lanczos |
gauss |
tukey |
dolph |
cauchy |
parzen |
poisson |
默认值是:hann
。
orientation
设置时间与频率轴的方向。 可以是vertical
(垂直)的或horizontal
(水平)的。 默认为vertical
(垂直)。
overlap
设置重叠窗口的比例。 默认值为0
。当值为1
时,将重叠设置为当前使用的特定窗口功能的建议大小。
gain
设置用于计算强度颜色值的比例增益。 默认值为1
。
data
设置要显示的数据。 可以是幅度,默认或阶段。
rotation
设置颜色旋转,必须在[-1.0,1.0]
范围内。 默认值为0
。
用法与showwaves
过滤器非常相似; 请参阅该部分中的示例。
32.20.1 示例
-
具有对数颜色缩放的大窗口:
showspectrum=s=1280x480:scale=log
-
使用
ffplay
对每个通道的彩色和滑动频谱的完整示例:ffplay -f lavfi 'amovie=input.mp3, asplit [a][out1]; [a] showspectrum=mode=separate:color=intensity:slide=1:scale=cbrt [out0]'