前言
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