如何计算ffmpeg astats波峰因数

时间:2017-08-29 14:34:58

标签: audio ffmpeg statistics compression

我正在为我的工作编写一个ffmpeg链式流程。目标是规范化/压缩大量音频文件(mp3)。 它是用Python完成的,关键部分是行:

ffmpeg -y -i "Input.mp3" -codec:a libmp3lame -b:a 96k -af acompressor=threshold=-15dB:ratio=5:attack=0.01:release=1000:knee=2,dynaudnorm=g=3:m=2:p=0.95 "Output.mp3"

python脚本完成并且正常工作但是音频(录音)的性质非常不同所以我不能对所有这些使用相同的参数。

我对ffmpeg过滤器的值进行了一些实验,我发现波峰因数(峰值与RMS水平的标准比率)给出了一个很好的参考,以编程方式获得更好的参数。< / p>

事实上,我看到一个具有良好动态范围声音和平滑形状的录音,得到9-15左右的波峰值(压缩/ normlz参数将以某种方式保守)。但是22-28左右的音频需要更积极的处理。 (所有经验)

有人可以澄清波峰值是如何计算的吗?考虑到哪些峰值? (为什么平坦因子总是0?) 或者,如果有人知道如何获得表示声音'平滑度'的值也会很好。

感谢您的想法。

1 个答案:

答案 0 :(得分:0)

一般来说,波峰因数定义为(Wikipedia):

Crest factor

展望ffmpeg's source code,我们发现波峰因素定义为:

p->sigma_x2 ? FFMAX(-p->nmin, p->nmax) / sqrt(p->sigma_x2 / p->nb_samples) : 1)

将案例p->sigma_x2 == 0放在一边,我们看到:

crest_factor = FFMAX(-p->nmin, p->nmax) / sqrt(p->sigma_x2 / p->nb_samples)

匹配上面的公式,给出:

  • max(- x_min, + x_max)相当于abs(x_peak)
  • p->sigma_x2指定音频样本的平方和,p->nb_samples对应于音频样本的数量,因此sqrt(p->sigma_x2 / p->nb_samples)RMS value

希望它有所帮助!