【问题标题】:FFMPEG audio normaliser dynaudnorm does no impact to amixFFMPEG 音频规范化器 dynaudnorm 对 amix 没有影响
【发布时间】:2020-02-15 19:38:26
【问题描述】:

基本上,我将多个 mp3 文件与 amix 和 adelay 混合在一起。

我遇到的问题是第一个 mp3 音量很低,最后一个音量太大,与这篇文章中讨论的完全一样:FFMPEG amix filter volume issue with inputs of different duration

我遵循@Gyan 的解决方案,将这些选项添加到 amix :duration=first:dropout_transition=0,dynaudnorm,但它不会影响输出。

我的命令是这样的:

ffmpeg \
-i "video.mp4" \
-i "audio1.mp3" \
-i "audio2.mp3" \
-i "audio3.mp3" \
-y \
-filter_complex " \
    [a:0]volume=0[videoAudio]; \
    [1]adelay=500[ad1]; \
    [2]adelay=5400[ad2]; \
    [3]adelay=10000[ad3]; \
    [videoAudio][ad1][ad2][ad3]amix=inputs=4:duration=first:dropout_transition=0,dynaudnorm \
" \
output.mp3

知道如何让dynaudnorm 工作吗?

【问题讨论】:

    标签: audio ffmpeg


    【解决方案1】:

    [a:0]volume=0[videoAudio]; \

    如果您要使视频配乐静音,为什么不完全忽略它?

    [1]adelay=500[ad1]; \

    如果您的 mp3 文件是立体声的,那么您必须为两个通道指定延迟。

    duration=first

    通过延迟您的输入,audio3.mp3 将自动成为最长的:

    [ delay 500ms ]<audio1.mp3>|
    [                          |       delay 5400ms ]<audio2.mp3>
    [                          |                                   delay 10000ms ]<audio3.mp3>
    

    垂直线(紧跟在audio1.mp3 之后)用duration=first 标记流的结尾。在这种情况下,你真的想要默认的duration=longest!

    dropout_transition=0

    我建议将此选项设置为混音的总长度,然后将volume 过滤器设置为输入量,以恢复音量。

    要找出混音的总长度:

    ffmpeg \
    -i "audio1.mp3" \
    -i "audio2.mp3" \
    -i "audio3.mp3" \
    -lavfi "
      [0]adelay=500|500[ad1];
      [1]adelay=5400|5400[ad2];
      [2]adelay=10000|10000[ad3];
      [ad1][ad2][ad3]amix=inputs=3
    " \
    -f null -
    

    例如,假设这会返回 time=00:01:30.74。那么最终的命令是:

    ffmpeg \
    -i "audio1.mp3" \
    -i "audio2.mp3" \
    -i "audio3.mp3" \
    -lavfi "
      [0]adelay=500|500[ad1];
      [1]adelay=5400|5400[ad2];
      [2]adelay=10000|10000[ad3];
      [ad1][ad2][ad3]amix=inputs=3:dropout_transition=90.74,volume=3,dynaudnorm
    " \
    output.mp3
    

    [编辑]
    如果您说您已使用您提供的网址阅读了 Gyan 的答案,那么我不明白为什么我仍然必须告诉您有关 duration=first 和 dropout_transition=0 的信息。让我告诉你dropout_transition的意义。

    ffmpeg \
    -i "input1.mp3" -i "input2.mp3" -i "input3.mp3" \
    -lavfi "[1]adelay=11233[ad2];[2]adelay=20141[ad3];[0][ad2][ad3]amix=inputs=3" \
    -f null -
    [...]
    size=N/A time=00:00:33.43 bitrate=N/A speed= 134x
    

    我测试了 3 个样本。音频混合的总长度为33.43seconds。

    这是dropout_transition=0 的波形:

    ffmpeg \
    -i "input1.mp3" -i "input2.mp3" -i "input3.mp3" \
    -lavfi "
      [1]adelay=11233[ad2];[2]adelay=20141[ad3];
      [0][ad2][ad3]amix=inputs=3:dropout_transition=0,
      volume=3,showwavespic=s=639x128
    " \
    "ffmpeg_amix=dt=0,vol=3,wavespic.png"
    

    就像您原始帖子中的波形一样;结尾变得非常响亮。所以这与dynaudnorm无关。

    将dropout_transition 设置为音频混合的总长度(不要忘记volume=3),这就是波形的样子:

    ffmpeg \
    -i "input1.mp3" -i "input2.mp3" -i "input3.mp3" \
    -lavfi "
      [1]adelay=11233[ad2];[2]adelay=20141[ad3];
      [0][ad2][ad3]amix=inputs=3:dropout_transition=33.43,
      volume=3,showwavespic=s=639x128
    " \
    "ffmpeg_amix=dt=33.43,vol=3,wavespic.png"
    

    接下来,您应该使用 dynaudnorm 的参数,正如 Paul B. Mahol 所说:

    ffmpeg \
    -i "input1.mp3" -i "input2.mp3" -i "input3.mp3" \
    -lavfi "
      [1]adelay=11233[ad2];[2]adelay=20141[ad3];
      [0][ad2][ad3]amix=inputs=3:dropout_transition=33.43,
      volume=3,dynaudnorm=f=200:g=15,showwavespic=s=639x128
    " \
    "ffmpeg_amix=dt=33.43,vol=3,dynaudnorm=f=200-g=15,wavespic.png"
    

    我更喜欢acompressor-filter btw:

    [/edit]

    【讨论】:

    • [a:0]volume=0 我只是在玩这些卷......但它应该在命令中。我的音频文件是单声道的,所以可以保留 adelay 的原样。
    • 实际上,您的答案是我在上面链接的帖子中的解决方案之一,但它没有回答我的问题,即关于 dynaudnorm 选项在我的情况下什么都不做,正如该答案中所解释的那样@Gyan 这里stackoverflow.com/a/38714779/3632172
    • 这是一个很好解释的答案......所以据我所知,需要设置 dynaudnorm 才能使其工作!只是 Gyan 的回答没有解释任何内容,我有点困惑,我的代码有问题!
    • 在发布这个问题的前一晚,我使用了那个解决方案,您将 dropout_transition 设置为最延迟的输入并添加其持续时间,然后我将音量设置为输入数量和它成功了。我正在考虑使用acompressor 以获得更好的输出质量。我再次感谢 Reino 的帮助;)非常感谢
    • @parse 不客气。你可能会发现stackoverflow.com/q/57190018/2703456(在acompressor-filter 上)也很有趣。
    【解决方案2】:

    请查阅 dynaudnorm 文档,它清楚地解释了一切。具体来说,持续时间默认值非常高,因此永远不会进行标准化。您需要将 dynaudnorm 滤波器的前两个选项:f (framelen) 和 g (gausssize) 更改为低得多的值。

    【讨论】:

    • 是的,我玩了它的参数并展示了一些变化。谢谢;)
    猜你喜欢
    • 2021-02-21
    • 1970-01-01
    • 1970-01-01
    • 2013-06-20
    • 1970-01-01
    • 2017-11-26
    • 2016-03-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多