FFmpeg在libavfilter模块提供音视频滤镜。所有的音频滤镜都注册在libavfilter/allfilters.c。我们也可以使用ffmpeg -filters命令行来查看当前支持的所有滤镜,前面-a代表音频。本篇文章主要介绍音频滤镜,包括:压缩器、淡入淡出、移除噪声、延时、回声、噪声门。
关于音频滤镜的详细介绍,可查看官方文档:音频滤镜。
1、acompressor
压缩器,主要用于减小信号的动态范围。尤其是现代音乐,大多数以高压缩比,提高整体响度。压缩原理是通过检测信号超过所设定阈值,将其除以比例因子。参数选项如下:
-
level_in:输入增益,默认为1,范围[0.015625, 64]
-
mode:压缩模式,有 upward和downward两种模式, 默认为downward
-
threshold:如果媒体流信号达到此阈值,会引起增益减少。默认为0.125,范围[0.00097563, 1]
-
ratio:信号压缩的比例因子,默认为2,范围[1, 20]
-
attack:信号提升到阈值所用的毫秒数,默认为20,范围[0.01, 2000]
-
release:信号降低到阈值所用的毫秒数,默认为250,范围[0.01, 9000]
-
makeup:在处理后,多少信号被放大. 默认为1,范围[1, 64]
-
knee:增益降低的阶数,默认为2.82843,范围[1, 8]
-
link:信号衰减的average和maximum两种模式, 默认为average
-
detection:采用peak峰值信号或rms均方根信号,默认采用更加平滑的rms
-
mix:输出时使用多少压缩信号, 默认为1,范围[0, 1]
2、acrossfade
淡入淡出效果,将该效果应用到从一个音频流到另一个音频流的切换过程。参数选项如下:
-
nb_samples, ns:指定淡入淡出效果的采样数, 默认为44100
-
duration, d:指定淡入淡出的持续时间
-
overlap, o:第一个流结束是否与第二个流无缝衔接,默认开启
-
curve1:设置第一个流淡入淡出的过渡曲线
-
curve2:设置第二个流淡入淡出的过渡曲线
参考命令如下:
ffmpeg -i first.flac -i second.flac -filter_complex acrossfade=d=10:c1=exp:c2=exp output.flac
3、afade
淡入淡出效果,与acrossfade效果类似。参数列表如下:
type, t:效果类型in或者out,默认为in
start_sample, ss:开始采样数,默认为0
nb_samples, ns:淡入淡出的采样个数,默认为44100
start_time, st:开始时间,默认为0
duration, d:淡入淡出效果持续时长
curve:淡入淡出的过渡曲线,包括以下选项:
-
tri:三角形,默认为线性斜率
-
qsin:四分之一正弦波
-
hsin:二分之一正弦波
-
esin:指数正弦波
-
log:对数
-
ipar:反抛物线
-
qua:二次插值
-
cub:三次插值
-
squ:平方根
-
cbr:立方根
-
par:抛物线
-
exp:指数
-
iqsin:反四分之一正弦波
-
ihsin:反二分之一正弦波
-
dese:双指数
-
desi:双指数曲线
-
losi:回归曲线
-
sinc:正弦基数函数
-
isinc:反正弦基数函数
-
nofade:无淡入淡出
同样地,采用宏定义给不同采样格式设置淡入淡出效果,代码位于af_afade.c,分为FADE_PLANAR(平面存储)和FADE(交错存储)两种形式:
#define FADE_PLANAR(name, type) \ static void fade_samples_## name ##p(uint8_t **dst, uint8_t * const *src, \ int nb_samples, int channels, int dir, \ int64_t start, int64_t range, int curve) \ { \ int i, c; \ \ for (i = 0; i < nb_samples; i++) { \ double gain = fade_gain(curve, start + i * dir, range); \ for (c = 0; c < channels; c++) { \ type *d = (type *)dst[c]; \ const type *s = (type *)src[c]; \