19.重新采样器选项
音频重采样器支持以下命名选项。
可以通过在FFmpeg
工具中指定-option
值,为aresample
过滤器指定option = value
,通过在SwrContext
选项中显式设置值或使用libavutil / opt.h``API
进行编程来设置选项。
ich,in_channel_count
设置输入通道的数量。默认值为0
。如果设置了相应的通道布局in_channel_layout
,则不必设置此值。
och,out_channel_count
设置输出通道的数量。默认值为0
。如果设置了相应的通道布局out_channel_layout
,则不必设置此值。
uch,used_channel_count
设置已使用输入通道的数量。默认值为0
。此选项仅用于特殊重映射。
isr,in_sample_rate
设置输入采样率。默认值为0
。
osr,out_sample_rate
设置输出采样率。默认值为0
。
isf,in_sample_fmt
指定输入样本格式。它默认设置为none
。
osf,out_sample_fmt
指定输出样本格式。它默认设置为none
。
tsf,internal_sample_fmt
设置内部样本格式。默认值为none
。未明确设置时,将自动选择此选项。
icl,in_channel_layout
ocl,out_channel_layout
设置输入/输出通道布局。
有关所需语法,请参阅(ffmpeg-utils
)channel
布局语法。
clev,center_mix_level
设置中心混音水平。它是以deciBel
表示的值,并且必须在区间[-32,32]
中。
slev,surround_mix_level
设置环绕声混音水平。它是以deciBel
表示的值,并且必须在区间[-32,32]
中。
lfe_mix_level
将LFE
混音设置为非LFE级别。当有LFE
输入但没有LFE
输出时使用。它是以deciBel
表示的值,并且必须在区间[-32,32]
中。
rmvol,rematrix_volume
设置rematrix
卷。默认值为1.0
。
rematrix_maxval
设置重新矩阵的最大输出值。这可用于防止削波与防止音量减小。值1.0
可防止剪裁。
flags, swr_flags
设置转换器使用的标志。 默认值为0
。
它支持以下各个标志:
值 | 解释 |
---|---|
res | 强制重新采样,即使输入和输出采样率匹配,此标志也会强制使用重采样 |
dither_scale
设置抖动比例。 默认值为1
。
dither_method
设置抖动方法。 默认值为0
。
支持如下的值:
值 | 解释 |
---|---|
rectangular | 选择矩形抖动 |
triangular | 选择三角形抖动 |
triangular_hp | 选择高通三角形抖动 |
lipshitz | 选择Lipshitz 噪音塑造抖动 |
shibata | 选择Shibata 噪音整形抖动 |
low_shibata | 选择低Shibata 噪声整形抖动 |
high_shibata | 选择高Shibata 噪声整形抖动 |
f_weighted | 选择f 加权噪声整形抖动 |
modified_e_weighted | 选择修改的e 加权噪声整形抖动 |
improved_e_weighted | 选择改进的e 加权噪声整形抖动 |
resampler
设置重采样引擎。 默认值为swr
。
支持的值如下:
值 | 解释 |
---|---|
swr | 选择原生SW重采样器; 过滤器选项精度和cheby在这种情况下不适用 |
soxr | 选择SoX 重采样器(如果可用); 补偿和过滤器选项filter_size,phase_shift,exact_rational,filter_type 和kaiser_beta 在这种情况下不适用 |
filter_size
仅对于swr
,设置重采样过滤器大小,默认值为32
。
phase_shift
仅对于swr
,设置重采样相移,默认值为10
,并且必须在区间[0,30]
中。
linear_interp
启用时使用线性插值(默认值)。 如果要在exact_rational
失败时保持速度而不是质量,请禁用它。
exact_rational
仅对于swr
,启用时,尝试根据输入和输出采样率使用精确的phase_count
。 但是,如果它大于1 << phase_shift
,则phase_count
将为1 << phase_shift
作为后退。 默认值已启用。
cutoff
设置截止频率(swr:6dB
点; soxr:0dB
点)比率; 必须是介于0
和1
之间的浮点值。默认值为0.97(swr)
和0.91(soxr)
(采样率为44100
,保留整个音频频段为20kHz
)。
precision
仅对于soxr
,将计算重采样信号的位精度。 默认值20
(通过适当的抖动,适用于目标位深度为16
),可以得到SoX
的High Quality
; 值28
表示SoX
的Very High Quality
。
cheby
仅对于soxr
,选择passband rolloff none(Chebyshev)
和irrational
比率的更高精度近似。 默认值为0
。
async
仅对于swr
,使用拉伸,挤压,填充和修剪的简单1参数音频同步到时间戳。 将此值设置为1将启用填充和修剪,较大的值表示样本中每秒可以拉伸或挤压数据的最大量。 默认值为0
,因此不会应用补偿使样本与音频时间戳匹配。
first_pts
仅对于swr
,假设第一个pts
应为此值。 时间单位是1 / sample rate
。 这允许在流的开始处进行padding/trimming
。 默认情况下,不会对第一帧的预期pts
做出假设,因此不会进行填充或修剪。 例如,如果音频流在视频流之后开始,则可以将其设置为0
以用静音填充开头,或者由于编码器延迟而用负pts
修剪任何样本。
min_comp
仅对于swr
,设置时间戳和音频数据之间的最小差异(以秒为单位),以触发拉伸/挤压/填充或修剪数据,使其与时间戳匹配。 默认情况下,拉伸/挤压/填充和修剪被禁用(min_comp'= FLT_MAX
)。
min_hard_comp
仅对于swr
,设置时间戳和音频数据之间的最小差异(以秒为单位)以触发添加/删除样本以使其与时间戳匹配。 此选项实际上是在hard (trim/fill)
和soft (squeeze/stretch)
补偿之间进行选择的阈值。 请注意,默认情况下,通过min_comp
禁用所有补偿。 默认值为0.1
。
comp_duration
仅对于swr
,设置延长/挤压数据的持续时间(以秒为单位),使其与时间戳匹配。 必须是非负双浮点值,默认值为1.0
。
max_soft_comp
仅对于swr
,设置拉伸/挤压数据的最大因子,使其与时间戳匹配。 必须是非负双浮点值,默认值为0
。
matrix_encoding
选择矩阵立体声编码。
它接受以下值:
值 | 解释 |
---|---|
none | 选择none
|
dolby | 选择dolby
|
dplii | 选择Dolby Pro Logic II
|
默认值是none
。
filter_type
仅对于swr
,选择重采样过滤器类型。 这仅影响重采样操作。
它接受以下值:
值 | 解释 |
---|---|
cubic | 选择立方体 |
blackman_nuttall | 选择Blackman Nuttall 窗口sinc
|
kaiser | 选择Kaiser 窗口sinc
|
kaiser_beta
仅对于swr
,设置Kaiser
窗口beta
值。 必须是区间[2,16]
中的双浮点值,默认值为9
。
output_sample_bits
仅对于swr
,设置用于抖动的已使用输出采样位数。 必须是区间[0,64]
中的整数,默认值为0
,这意味着它不被使用。
20.缩放选项
视频缩放器支持以下命名选项。
可以通过在FFmpeg
工具中指定-option
值来设置选项。 对于程序化使用,可以在SwsContext
选项中或通过libavutil / opt.h``API
显式设置它们。
sws_flags
设置缩放器标志。 这也用于设置缩放算法。 只应选择一个算法。 默认值为bicubic
。
它接受以下值:
值 | 解释 |
---|---|
fast_bilinear | 选择快速双线性缩放算法 |
bilinear | 选择双线性缩放算法 |
bicubic | 选择双三次缩放算法 |
experimental | 选择实验缩放算法 |
neighbor | 选择最近邻居重新缩放算法 |
area | 选择平均区域重新缩放算法 |
bicublin | 为亮度分量选择双三次缩放算法,为色度分量选择双线性 |
gauss | 选择高斯重新缩放算法 |
sinc | 选择sinc 重新缩放算法 |
lanczos | 选择Lanczos 重新缩放算法 |
spline | 选择自然双三次样条重新缩放算法 |
print_info | 启用打印/调试日志记录 |
accurate_rnd | 启用精确舍入 |
full_chroma_int | 启用全色度插值 |
full_chroma_inp | 选择全色度输入 |
bitexact | 启用bitexact 输出 |
srcw
设置源宽度。
srch
设置源高度。
dstw
设置目标宽度。
dsth
设置目的地高度。
src_format
设置源像素格式(必须表示为整数)。
dst_format
设置目标像素格式(必须表示为整数)。
src_range
选择源范围。
dst_range
选择目的地范围。
param0,param1
设置缩放算法参数。 指定的值特定于某些缩放算法,并被其他人忽略。 指定的值是浮点数值。
sws_dither
设置抖动算法。 接受以下值之一。 默认值为auto
。
值 | 解释 |
---|---|
auto | 自动选择 |
none | 没有抖动 |
bayer | bayer抖动 |
ed | 误差扩散抖动 |
a_dither | 算术抖动,基于加法 |
x_dither | 算术抖动,使用xor (更随机/更不明显的图案化a_dither ) |
alphablend
设置alpha
混合以在输入具有alpha
但输出不具有alpha
时使用。 默认值为none
。
值 | 解释 |
---|---|
uniform_color | 混合均匀的背景颜色 |
checkerboard | 混合到棋盘上 |
none | 没有混合 |
21.过滤简介
通过libavfilter
库启用FFmpeg
中的过滤。
在libavfilter
中,过滤器可以有多个输入和多个输出。 为了说明可能的事情,我们考虑以下过滤器图。
[main]
input --> split ---------------------> overlay --> output
| ^
|[tmp] [flip]|
+-----> crop --> vflip -------+
此过滤器图将输入流分成两个流,然后通过裁剪过滤器和vflip
过滤器发送一个流,然后通过将其重叠在顶部将其与另一个流合并。 可以使用以下命令来实现此目的:
ffmpeg -i INPUT -vf "split [main][tmp]; [tmp] crop=iw:ih/2:0:0, vflip [flip]; [main][flip] overlay=0:H/2" OUTPUT
结果是视频的上半部分镜像到输出视频的下半部分。
同一线性链中的过滤器用逗号分隔,过滤器的不同线性链用分号分隔。在我们的示例中,crop,vflip
在一个线性链中,split
和overlay
分别在另一个中。线性链连接的点由方括号括起来的名称标记。在该示例中,分割滤波器生成两个与标签[main]
和[tmp]
相关联的输出。
发送到分割的第二个输出(标记为[tmp]
)的流通过裁剪滤镜处理,裁剪滤镜裁掉视频的下半部分,然后垂直翻转。叠加滤波器输入分割滤波器的第一个未改变的输出(标记为[main]
),并在其下半部分覆盖由crop
,vflip
滤波器链生成的输出。
有些过滤器会输入一个参数列表:它们在过滤器名称和等号后面指定,并用冒号分隔。
存在所谓的没有音频/视频输入的源滤波器,以及不具有音频/视频输出的宿滤波器。
22. graph2dot
FFmpeg``tools
目录中包含的graph2dot
程序可用于解析filtergraph
描述并以点语言发出相应的文本表示。
调用命令如下:
graph2dot -h
看看如何使用graph2dot
。
然后,可以将点描述传递给dot
程序(来自graphviz
程序套件),并获得filtergraph
的图形表示。
例如命令序列:
echo GRAPH_DESCRIPTION | \
tools/graph2dot -o graph.tmp && \
dot -Tpng graph.tmp -o graph.png && \
display graph.png
可用于创建和显示表示GRAPH_DESCRIPTION
字符串描述的图形的图像。 请注意,此字符串必须是完整的自包含图形,并明确定义其输入和输出。 例如,命令行具有以下形式:
ffmpeg -i infile -vf scale=640:360 outfile
GRAPH_DESCRIPTION
字符串必须是以下形式:
nullsrc,scale=640:360,nullsink
可能还需要设置nullsrc
参数并添加格式过滤器以模拟特定的输入文件。
23.滤波器描述
滤波器图是连接滤波器的有向图。 它可以包含循环,并且一对过滤器之间可以有多个链接。 每个链路在一侧具有一个输入焊盘,将其连接到一个用于输入的滤波器,另一侧的一个输出焊盘将其连接到接受其输出的一个滤波器。
filtergraph
中的每个过滤器都是应用程序中注册的过滤器类的实例,它定义了过滤器的特征和输入和输出焊盘的数量。
没有输入焊盘的滤波器称为source
,没有输出焊盘的滤波器称为sink
。
23.1 Filtergraph语法
filtergraph
有一个文本表示,由ffmpe中的-filter'/' - vf'/' - af
和-filter_complex
选项以及ffplay
中的-vf'/' - af
识别,并由libavfilter / avfilter.h
中定义的avfilter_graph_parse_ptr()
函数。
过滤链由一系列连接的过滤器组成,每个过滤器连接到序列中的前一个过滤器。过滤链由,
- 分隔的过滤器描述列表表示。
filtergraph
由一系列过滤链组成。一系列过滤链由;
列表表示 -
分离的过滤链描述。
过滤器由以下形式的字符串表示:[in_link_1] ... [in_link_N] filter_name @ id = arguments [out_link_1] ... [out_link_M]
filter_name
是过滤器类的名称,其描述的过滤器是其实例,并且必须是在程序中注册的过滤器类之一的名称,可选地后跟@id
。筛选器类的名称后跟可选的字符串= arguments
。
arguments
是一个字符串,其中包含用于初始化过滤器实例的参数。它可能有以下两种形式之一:
一个
:
-key=value
对的分隔列表。一个
:
- 分隔的值列表。 在这种情况下,键被假定为声明它们的顺序中的选项名称。 例如。 淡入淡出过滤器按此顺序声明三个选项 -type
,start_frame
和nb_frames
。 然后参数列表:0:30
表示将值分配给选项type
,0
分配给start_frame
,30
分配给nb_frames
。:
- 混合直接值和长key=value
对的分隔列表。 直接值必须在key=value
对之前,并遵循前一点的相同约束顺序。 可以按任何首选顺序设置以下key = value
对。
如果选项值本身是项目列表(例如,格式过滤器采用像素格式列表),则列表中的项目通常用|
分隔。
可以使用字符'
作为起始和结束标记引用参数列表,并使用字符\
来引用引用文本中的字符;否则,当遇到下一个特殊字符(属于集合[] =;,
)时,参数字符串被视为终止。
过滤器的名称和参数可选地前面和后面是链接标签列表。链接标签允许用户命名链接并将其与过滤器输出或输入板相关联。前面的标签in_link_1 ... in_link_N
与滤波器输入焊盘相关联,以下标签out_link_1 ... out_link_M
与输出焊盘相关联。
当在filtergraph
中找到两个具有相同名称的链接标签时,将创建相应输入和输出板之间的链接。
如果未标记输出焊盘,则默认情况下将其链接到滤波器链中下一个滤波器的第一个未标记输入焊盘。例如在过滤链中
nullsrc, split[L1], [L2]overlay, nullsink
分离滤波器实例有两个输出pads
,而叠加滤波器实例有两个输入pads
。 分割的第一输出垫标记为L1
,覆盖的第一输入垫标记为L2
,并且分割的第二输出垫链接到覆盖的第二输入垫,其均未标记。
在过滤器描述中,如果未指定第一个过滤器的输入标签,则假定为in
; 如果未指定最后一个过滤器的输出标签,则假定为out
。
在完整的滤波链中,必须连接所有未标记的滤波器输入和输出焊盘。 如果所有滤波器链的所有滤波器输入和输出焊盘都连接在一起,则滤波器图被认为是有效的。
Libavfilter
将自动插入需要格式转换的缩放过滤器。 可以通过预先添加sws_flags = flags
为自动插入的缩放器指定swscale
标志; 到filtergraph
描述。
以下是filtergraph
语法的BNF描述:
NAME ::= sequence of alphanumeric characters and '_'
FILTER_NAME ::= NAME["@"NAME]
LINKLABEL ::= "[" NAME "]"
LINKLABELS ::= LINKLABEL [LINKLABELS]
FILTER_ARGUMENTS ::= sequence of chars (possibly quoted)
FILTER ::= [LINKLABELS] FILTER_NAME ["=" FILTER_ARGUMENTS] [LINKLABELS]
FILTERCHAIN ::= FILTER [,FILTERCHAIN]
FILTERGRAPH ::= [sws_flags=flags;] FILTERCHAIN [;FILTERGRAPH]
23.2 Notes on filtergraph escaping
Filtergraph
描述组合需要几个级别的转义。 有关使用的转义过程的更多信息,请参阅(ffmpeg-utils
)quoting_and_escaping
。
第一级转义会影响每个过滤器选项值的内容,其中可能包含特殊字符:用于分隔值或其中一个转义字符\
。
第二级转义会影响整个过滤器描述,其中可能包含转义字符\
或特殊字符[] ,
; filtergraph
描述使用的。
最后,当在shell
命令行上指定filtergraph
时,需要对其中包含的shell
特殊字符执行第三级转义。
例如,考虑将以下字符串嵌入到drawtext
过滤器描述text
值中:
this is a 'string': may contain one, or more, special characters
此字符串包含'
特殊转义字符和:特殊字符,因此需要以这种方式转义:
text=this is a \'string\'\: may contain one, or more, special characters
将过滤器描述嵌入到filtergraph
描述中时,需要第二级转义,以便转义所有filtergraph
特殊字符。 因此上面的例子变成:
drawtext=text=this is a \\\'string\\\'\\: may contain one\, or more\, special characters
(请注意,除了\'
转义特殊字符外,还需要进行转义)。
最后,在shell
命令中编写filtergraph
描述时需要额外的转义级别,这取决于所采用的shell
的转义规则。 例如,假设\是特殊的并且需要使用另一个\来转义,前一个字符串最终将导致:
-vf "drawtext=text=this is a \\\\\\'string\\\\\\'\\\\: may contain one\\, or more\\, special characters"
24.时间表编辑
某些过滤器支持通用的enable
选项。 对于支持时间轴编辑的过滤器,可以将此选项设置为在将帧发送到过滤器之前计算的表达式。 如果评估非零,则将启用过滤器,否则帧将不变地发送到过滤器图中的下一个过滤器。
表达式接受以下值:
t
时间戳以秒表示,如果输入时间戳未知,则为NAN
.
n
输入帧的序号,从0开始
pos
输入框文件中的位置,如果未知,则为NAN
w
h
视频输入帧的宽度和高度。
此外,这些过滤器支持enable
命令,可用于重新定义表达式。
与任何其他过滤选项一样,enable
选项遵循相同的规则。
例如,要启用模糊滤镜(smartblur)10
秒到3
分钟,曲线滤镜从3
秒开始:
smartblur = enable='between(t,10,3*60)',
curves = enable='gte(t,3)' : preset=cross_process
请参阅ffmpeg -filters
以查看哪些过滤器具有时间轴支持。
25.具有多个输入的过滤器选项(帧同步)
一些具有多个输入的过滤器支持一组通用选项。 这些选项只能通过名称设置,而不能使用简短表示法。
eof_action
在辅助输入上遇到EOF
时要采取的操作; 它接受以下值之一:
值 | 解释 |
---|---|
repeat | 重复最后一帧(默认) |
endall | 结束两个流 |
pass | 通过主输入 |
shortest
如果设置为1
,则在最短输入终止时强制输出终止。 默认值为0
。
repeatlast
如果设置为1
,则强制过滤器扩展辅助流的最后一帧,直到主流结束。 值为0
将禁用此行为。 默认值为1
。