FFplay文档解读-48-多媒体过滤器二
前言
Github
地址:Github
简书地址:简书
专辑地址:FFplay专辑
32.8 ebur128
EBU R128
扫描仪滤光片。此过滤器将音频流作为输入并以不变的方式输出。默认情况下,它以10Hz
的频率记录消息,具有瞬时响度(由M
标识),短期响度(S
),集成响度(I
)和响度范围(LRA
)。
该滤波器还具有视频输出(请参阅视频选项),其中包含实时图表以观察响度演变。图形包含上面提到的已记录消息,因此在设置此选项时不再打印,除非设置了详细日志记录。主图形区域包含短期响度(3
秒分析),右侧的仪表用于瞬时响度(400
毫秒)。
有关Loudness Recommendation EBU R128
的更多信息,请访问http://tech.ebu.ch/loudness。
过滤器接受以下选项:
video
激活视频输出。无论此选项是否设置,音频流都将保持不变。如果激活,视频流将是第一个输出流。默认值为0
。
size
设置视频大小。此选项仅适用于视频。有关此选项的语法,请检查(ffmpeg-utils)视频大小语法
。默认和最小分辨率为640x480
。
meter
设置EBU
比例计。默认值为9
。对于EBU
刻度表+9
和EBU
刻度表+18
,常用值分别为9
和18
。允许此范围之间的任何其他整数值。
metadata
设置元数据注入。如果设置为1,则音频输入将被分段为100ms
输出帧,每个输出帧包含元数据中的各种响度信息。所有元数据键都以lavfi.r128
为前缀。
默认值为0
。
framelog
强制帧日志记录级别。
可用值如下所示:
值 | 解释 |
---|---|
info | 信息记录水平 |
verbose | 详细的日志记录级别 |
默认情况下,日志记录级别设置为info
。 如果设置了‘video’
或‘metadata’
选项,则会切换到详细信息。
peak
设置峰值模式。
可以累积可用模式(选项是标志类型)。 可能的值如下所示:
值 | 解释 |
---|---|
none | 禁用任何峰值模式(默认) |
sample | 启用采样峰值模式。 简单的峰值模式寻找更高的样本值。 它记录样本峰值的消息(由 SPK 标识) |
true | 启用真峰值模式 如果启用,峰值查找将在输入流的过采样版本上完成,以获得更好的峰值精度。 它记录了一个真正的峰值消息。 (由 TPK 标识)和每帧的真峰值(由FTPK 识别)。 此模式需要使用libswresample 构建 |
dualmono
将单声道输入文件视为"dual mono"
(双单声道)。 如果单声道文件用于在立体声系统上播放,则其EBU R128
测量将在感知上不正确。 如果设置为true
,则此选项将补偿此效果。 多通道输入文件不受此选项的影响。
panlaw
设置用于测量双单声道文件的特定pan
定律。 此参数是可选的,默认值为-3.01dB
。
32.8.1 示例
-
使用
ffplay
的实时图表,EBU
刻度表+18
: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 -
32.9 interleave, ainterleave
从几个输入暂时交错帧。
interleave
用于视频输入,带有音频的交错。
这些过滤器从多个输入读取帧,并将最旧的排队帧发送到输出。
输入流必须具有明确定义的,单调递增的帧时间戳值。
为了将一个帧提交到输出,这些过滤器需要为每个输入排队至少一个帧,因此如果一个输入尚未终止且不接收传入帧,则它们不能工作。
例如,考虑一个输入是总是丢弃输入帧的选择过滤器的情况。交错滤波器将继续从该输入读取,但在输入发送流末端信号之前,它将永远无法发送新帧。
此外,根据输入同步,如果一个输入接收的帧数多于其他输入,则过滤器将丢弃帧,并且队列已经填满。
这些过滤器接受以下选项:
nb_inputs,n
设置不同输入的数量,默认为2
。
32.9.1 示例
-
使用
fmpeg
交织属于不同流的帧: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
32.10 metadata, ametadata
处理帧元数据。
此过滤器接受以下选项:
mode
设置过滤器的操作模式。
具体地址如下所示:
值 | 解释 |
---|---|
select | 如果同时设置了值和键,则选择具有此类元数据的帧。 如果仅设置了密钥,请选择元数据中具有此密钥的每个帧 |
add | 添加新的元数据键和值。 如果密钥已经可用则什么也不做 |
modify | 修改已存在的密钥的值 |
delete | 如果设置了值,则仅删除具有此值的键。 否则,删除密钥。 如果未设置密钥,则删除框架中的所有元数据值 |
如果找到元数据,则打印密钥及其值。 如果未设置密钥,则打印框架中可用的所有元数据值 |
key
设置所有模式使用的密钥。 必须为除打印和删除之外的所有模式设置。
value
设置将使用的元数据值。 此选项对于修改和添加模式是必需的。
function
比较元数据值和值时使用哪个函数。
可以是以下之一:
值 | 解释 |
---|---|
same_str | 值被解释为字符串,如果元数据值与value 相同则返回true
|
starts_with | 值被解释为字符串,如果元数据值以值选项字符串开头,则返回true
|
less | 值被解释为浮点数,如果元数据值小于值,则返回true
|
equal | 值被解释为浮点数,如果值等于元数据值,则返回true
|
greater | 值被解释为浮点数,如果元数据值大于值,则返回true
|
expr | 值被解释为浮点数,如果选项expr 的表达式求值为true ,则返回true
|
expr
设置函数设置为expr
时使用的表达式。 表达式通过eval API
进行评估,并且可以包含以下常量:
常量 | 解释 |
---|---|
VALUE1 | 从元数据键浮动表示值 |
VALUE2 | 用户在值选项中提供的值的浮点表示 |
file
如果在打印模式下指定,则输出将写入指定的文件。 可以指定任何可写URL而不是纯文件名。 文件名-
是标准输出的简写。 如果未设置file
选项,则使用AV_LOG_INFO loglevel
将输出写入日志。
32.10.1 示例
-
使用键为
lavfi.signalstats.YDIF
且帧值介于0
和1
之间的帧打印所有元数据值。signalstats,metadata=print:key=lavfi.signalstats.YDIF:value=0:function=expr:expr='between(VALUE1,0,1)'
-
将
silencedetect
输出打印到文件'metadata.txt'
。silencedetect,ametadata=mode=print:file=metadata.txt
-
将所有元数据定向到具有文件描述符4的管道。
metadata=mode=print:file='pipe\:4'
32.11 perms, aperms
设置输出帧的读/写权限。
这些过滤器主要针对开发人员在filtergraph
中的以下过滤器中测试直接路径。
过滤器接受以下选项:
mode
选择权限模式。
它接受以下值:
值 | 解释 |
---|---|
none | 没做什么。 这是默认值 |
ro | 将所有输出帧设置为只读 |
rw | 将所有输出帧直接设置为可写 |
toggle | 如果可写,则将帧设置为只读,如果是只读,则使其可写 |
random | 将每个输出帧设置为只读或可随机写入 |
seed
设置随机模式的种子,必须是0到UINT32_MAX
之间的整数。 如果未指定,或者显式设置为-1
,则过滤器将尝试在尽力而为的基础上使用良好的随机种子。
注意:如果在权限过滤器和后续过滤器之间使用自动插入过滤器,则可能无法在后续过滤器中按预期接收权限。 在perms / aperms
过滤器之前插入格式或格式过滤器可以避免此问题。
32.12 realtime, arealtime
减慢过滤以近似匹配实时。
这些过滤器将暂停过滤一段可变的时间,以使输出速率与输入时间戳匹配。 它们类似于ffmpeg
的're'
选项。
他们接受以下选择:
limit
暂停的时间限制。 任何比此更长的暂停都将被视为时间戳不连续并重置计时器。 默认值为2
秒。
32.13 select, aselect
选择要传递输出的帧。
此过滤器接受以下选项:
expr,e
设置表达式,为每个输入框计算。
如果表达式计算为零,则丢弃该帧。
如果评估结果为负或NaN
,则将帧发送到第一输出;假设输入索引从0
开始,则以索引ceil(val)-1
发送到输出。
例如,值1.2
对应于索引ceil(1.2)-1 = 2-1 = 1
的输出,即第二输出。
outputs, n
设置输出数量。发送所选帧的输出基于评估结果。默认值为1
。
表达式可以包含以下常量:
n
过滤帧的(顺序)编号,从0
开始。
selected_n
所选帧的(顺序)编号,从0开始。
prev_selected_n
最后一个选定帧的序号。如果未定义则为NAN
。
TB
输入时间戳的时基。
pts
经过滤的视频帧的PTS(Presentation TimeStamp)
,以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 | 帧是渐进的(不是交错的) |
TOPFIRST | 该帧首先是顶场 |
BOTTOMFIRST | 帧是底场优先 |
consumed_sample_n (audio only)
当前帧之前所选样本的数量。
samples_n (audio only)
当前帧中的样本数
sample_rate (audio only)
输入采样率
key
如果过滤的帧是关键帧,则此值为1
,否则为0
。
pos
过滤帧文件中的位置,如果信息不可用,则为-1
(例如合成视频)
scene (video only)
0
到1
之间的值表示新场景;较低的值反映了当前帧引入新场景的概率较低,而较高的值意味着当前帧更可能是一个(参见下面的示例)
concatdec_select
concat
解复用器可以通过设置入点和出点来仅选择连接输入文件的一部分,但输出数据包可能不完全包含在所选间隔中。通过使用此变量,可以跳过由concat demuxer
生成的帧,这些帧并未精确地包含在所选区间中。
这通过将帧pts
与lavf.concat.start_time
和也存在于解码帧中的lavf.concat.duration
包元数据值进行比较来起作用。
如果帧pts
至少是start_time
并且缺少持续时间元数据或者帧pts
小于start_time + duration,则concatdec_select
变量为-1
,否则为0
,如果缺少start_time
元数据,则为NaN
。
这基本上意味着如果输入帧的pts
在concat demuxer
设置的区间内,则选择输入帧。
select
表达式的默认值为1
。
32.13.1 示例
-
选择输入中的所有帧:
select
上面的例子和下面的表达意思一样:
select=1
-
跳过所有帧:
select=0
-
仅选择
I
帧:select='eq(pict_type\,I)'
-
每
100
个选择一个帧: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
-
从
ffconcat
文件中选择有用的帧,该文件使用入点和出点,但源文件不是帧内帧。ffmpeg -copyts -vsync 0 -segment_time_metadata 1 -i input.ffconcat -vf select = concatdec_select -af aselect = concatdec_select output.avi