【问题标题】:How the ffmpeg astats crest factor is calculated如何计算 ffmpeg astats 波峰因数
【发布时间】:2017-08-30 21:46:03
【问题描述】:

我正在为我的工作编写一个 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 过滤器 astats 的值进行了一些试验,发现 波峰因数(峰值与 RMS 电平的标准比)为以编程方式获得更好的参数提供了很好的参考。

事实上,我看到一个具有良好动态范围声音和平滑形状的录音,获得的波峰值在 9-15 左右(compress/normlz 参数会有点保守)。但是波峰在 22-30 左右的音频需要更积极的处理。 (全部凭经验)

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

感谢您的想法。

【问题讨论】:

    标签: audio ffmpeg statistics compression


    【解决方案1】:

    一般来说,波峰因数定义为(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

    希望对你有帮助!

    【讨论】:

    • 所以,如果我做对了,那么峰的分布方式就没有区别了。好吧,限制循环以找到最佳参数是相对有用的。我认为我需要对曲线进行更“智能”的测量
    • @FranGar 是的,没有时间歧视/整合期,如果你想知道的话。也许您可以将音频文件分成小块并单独处理每个文件?
    • @FranGar 另外,如果您觉得我的回答有帮助,您可以接受。欢迎使用 StackOverflow! :)
    • 当然很抱歉,但我不知道如何“接受”答案,我是新手。关于切片:主要目标是找到必须在主动态压缩之前压缩的“坏峰值”(通常是音频突发/爆音等)。通常我会在 Audacity 中以视觉方式进行,因为它们相对容易被发现,但非常耗时。无论如何再次感谢
    • 要接受答案,只需单击我的答案左侧的“复选标记”形状(请参阅meta.stackexchange.com/questions/5234/…)。关于您的压缩,您可以只使用 2 次压缩。将您的音频发送到第一个可衰减“坏峰值”的积极压缩器中,然后将第一个压缩音频放入另一个更精细的压缩器中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-23
    • 2019-06-22
    • 1970-01-01
    • 2022-09-27
    • 2022-11-02
    相关资源
    最近更新 更多