我正在为我的工作编写一个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?) 或者,如果有人知道如何获得表示声音'平滑度'的值也会很好。
感谢您的想法。
答案 0 :(得分:0)
一般来说,波峰因数定义为(Wikipedia):
展望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。希望它有所帮助!