FFmpeg amix-filter 始终执行 "volume normalization"。如何预防它以及它可能带来的弊端是什么?

FFmpeg amix-filter always does "volume normalization". How to prevent it and what are the possible drawbacks of it?

关于这个话题有很多问题, , and link3。但是,我正在征求有关可能解决方案的建议,以及它是否有一些缺点。

问题定义: amix-filter 总是"volume normalization"并且无法关闭

参考:请阅读FFmpeg论坛上here by @Reino. He also had opened a ticket的评论来说明情况。

Hacky 解决方案: amix=inputs=13:dropout_transition=1000,volume=13

参考:已回答, and also in the ticket

问题:

1) "amix scales each input's volume by 1/n where n = no. of active inputs. This is evaluated for each audio frame. So when an input drops out, the volume of the remaining inputs is scaled by a smaller amount, hence their volumes increase."

例如,如果我要合并 10 个音频流,那么第一个音频流将缩放 1/10,第二个缩放 1/9,第三个缩放 1/8 ..第 9 个缩放 1/2,最后第 10 个1. 我是否理解正确,或者如果我遗漏了什么请告诉我?

2) dropout_transition: 输入流结束时体积重新归一化的过渡时间(以秒为单位)。默认值为 2 秒。

dropout_transition 意思是 它会在给定秒数 后跳过,对吗?因此,如果我设置 dropout_transition=1000(非常大的数字),那么无论视频长度如何,FFmpeg 都将 drop/skip 音频转换提供的秒数。再一次,如果我的假设有误,请指正。

3) 我已经尝试过很多其他的解决方案,但都没有成功,现在我非常依赖所提供的解决方案。上述 hacky 解决方案有什么缺点吗?

如果我要合并 10 个音频流,那么第一个音频流将按 1/10 缩放,第二个按 1/9 缩放,第三个按 1/8 .. 第 9 个按 1/2 缩放,然后最后 10 比 1.

没有。假设您有 4 个输入,分别为 10、7、4 和 2 秒长。让我们将 dropout transition 保持为 0。然后在前 2 秒内,所有输入都处于活动状态,因此每个输入都按 1/4 缩放。从 2 到 4 秒,有 3 个输入处于活动状态,因此所有活动输入(#1、2、3)都按 1/3 缩放。从 4 到 7 秒,只有输入 1 和 2 处于活动状态,因此两者都按 1/2 缩放。并且从 7 到 10 秒,只有输入 1 处于活动状态,因此它按 1 缩放,即它的音量不变。

dropout_transition 表示它会跳过几秒,对吗?

没有。继续上面的场景,假设 dropout 转换为 1 秒。因此,当输入 4 结束时,缩放比例不会立即从 1/4 变为 1/3。它在 1 秒内逐渐过渡。

上述hacky解决方案有什么缺点吗?

在大多数情况下,这很好。如果您要组合响亮的音乐片段,那么音域会变平,但在那种情况下应该无关紧要。