gpt4 book ai didi

audio - 在 ffmpeg 中规范化音频 - 如何?

转载 作者:行者123 更新时间:2023-12-03 01:06:45 28 4
gpt4 key购买 nike

我正在使用我正在编写的 C# 应用程序为合唱团创建其中一个“Brady Bunch”视频,该应用程序使用 ffmpeg 进行所有繁重的工作,并且在大多数情况下它运行良好,但我无法获得音频电平正好。
我现在正在做的是首先“标准化”来自各个歌手的音频,如下所示:

  • 使用 ffmpeg
  • 将音频提取到 WAV 文件中
  • 使用 NAudio
  • 将 WAV 文件加载到我的应用程序中
  • 查找最大 16 位值
  • 当我创建合并视频时,为此流指定一个音量,将最大值提升到 32767

  • 因此,例如,如果我有 3 个流:流 A 的最大音频已经是 32767,流 B 的最大音频是 32000,流 C 的最大音频是 16000,那么当我合并这些视频时,我将指定
    [0:a]volume=1.0,aresample=async=1:first_pts=0[aud0]
    [1:a]volume=1.02,aresample=async=1:first_pts=0[aud1]
    [2:a]volume=2.05,aresample=async=1:first_pts=0[aud2]
    [aud0][aud1][aud2]amix=inputs=3[a]
    (我有一个额外的“音量调整”,可以让我根据需要调整个别歌手的音量,但对于这个问题我们可以忽略它)
    我正在阅读 Audio Volume Manipulation 上的 ffmpeg wiki ,接下来我将实现它,但我不知道如何处理它生成的输出。看起来我将以 dB 为单位获得平均和最大音量水平,虽然我以“是的,我在 30 年前在大学里了解到那些”的方式理解分贝,但我不知道如何使用这些值标准化我的输入视频的音频。
    问题是,在 ffmpeg 输出视频中,音频电平很低。如果我在 ffmpeg 生成的合并视频中提取音频并查看 WAV 文件的过程相同,最大值仅为 4904。
    如何实现自动将输出音量设置为“合理”水平的算法?我意识到我可以简单地添加一个手动音量过滤器并让人工设置级别,但这将是生成合并视频、收听它、调整级别、再次合并等的很多来回。我想要我的应用程序计算出适当的输出量的一种方式(可能允许人工调整)。
    编辑
    要求 ffmpeg 确定每个剪辑的平均和最大音量确实提供了以 dB 为单位的平均和最大音量,然后我可以使用这些值来缩放每个输入剪辑:
    [0:a]volume=3.40dB,aresample=async=1:first_pts=0[aud0]
    [1:a]volume=3.90dB,aresample=async=1:first_pts=0[aud1]
    [2:a]volume=4.40dB,aresample=async=1:first_pts=0[aud2]
    [3:a]volume=-0.00dB,aresample=async=1:first_pts=0[aud3]
    但是我的最后一个视频仍然出奇地安静。现在,我添加了一个在最后应用的手动输入的体积因子:
    [aud0][aud1][aud2]amix=inputs=3[a]
    [a]volume=volume=3.00[b]
    所以我的问题是,实际上,我如何通过算法确定这个最终体积因子需要是多少?
    更多编辑
    这里有一些更深层次的东西,我只是将音量过滤器设置为 100,输出只是稍微响亮一些。这是我的过滤器,以及命令行的相关部分:
    color=size=1920x1080:c=0x0000FF [base];
    [0:v] scale=576x324 [clip0];
    [0:a]volume=1.48,aresample=async=1:first_pts=0[aud0];
    [1:v] crop=808:1022:202:276,scale=384x486 [clip1];
    [1:a]volume=1.57,aresample=async=1:first_pts=0[aud1];
    [2:v] crop=1160:1010:428:70,scale=558x486 [clip2];
    [2:a]volume=1.66,aresample=async=1:first_pts=0[aud2];
    [3:v] crop=1326:1080:180:0,scale=576x469 [clip3];
    [3:a]volume=1.70,aresample=async=1:first_pts=0[aud3];
    [4:a]volume=0.20,aresample=async=1:first_pts=0[aud4];
    [5:a]volume=0.73,aresample=async=1:first_pts=0[aud5];
    [6:v] crop=1326:1080:276:0,scale=576x469 [clip4];
    [6:a]volume=1.51,aresample=async=1:first_pts=0[aud6];
    [base][clip0] overlay=shortest=1:x=32:y=158 [tmp0];
    [tmp0][clip1] overlay=shortest=1:x=768:y=27 [tmp1];
    [tmp1][clip2] overlay=shortest=1:x=1321:y=27 [tmp2];
    [tmp2][clip3] overlay=shortest=1:x=32:y=625 [tmp3];
    [tmp3][clip4] overlay=shortest=1:x=672:y=625 [tmp4];
    [aud0][aud1][aud2][aud3][aud4][aud5][aud6]amix=inputs=7[a];
    [a]adelay=delays=200:all=1[b];
    [b]volume=volume=100.00[c];
    [c]asplit[a1][a2];

    ffmpeg -y ....
    -map "[tmp4]" -map "[a1]" -c:v libx264 "D:\voutput.mp4"
    -map "[a2]" "D:\aoutput.mp3""
    当我这样做时,我想要的音频会更响亮(响亮到足以剪辑和失真),但绝对不会响亮 100 倍。

    最佳答案

  • 混合音频后,运行
  • ffmpeg -i output.mp3 -filter:a volumedetect -map 0:a -f null /dev/null
  • 像这样从字符串中获取值:
  • [Parsed_volumedetect_0 @ 0xdigitsletters] max_volume: -16.5 dB
  • 将此值添加到过滤器中,但为正值:...]amix=inputs=7,volume=16.5dB[a]

  • [编辑]
    混合音频后执行此操作。
    [更新]
    我做了一些调查:
    [更新 2]
    #!/bin/bash
    f="input 1.mp3"
    INP=("-ss" "30" "-i" "$f")
    FCT=1
    FLA="[0:a:0]aresample=async=1:first_pts=0[0a0]; "
    AUD="[0a0]"
    MAX=$(ffmpeg -hide_banner -i "$f" -map 0:a -filter:a volumedetect -f null /dev/null 2>&1 | grep 'max_volume' | awk '{print $4, $5, $6}')
    echo " $FCT $MAX"
    for f in /mnt/sklad/Музыка/*.mp3; do
    INP+=("-ss" "30" "-i" "$f")
    FLA+="[${FCT}:a:0]aresample=async=1:first_pts=0[${FCT}a0]; "
    AUD+="[${FCT}a0]"
    ((FCT++))
    printf -v OUT "%02d" $FCT
    ffmpeg -v error -hide_banner "${INP[@]}" -filter_complex "${FLA} ${AUD}amix=inputs=${FCT}[a]" -map [a] -c:a aac -q:a 4 -t 30 -y "out_${OUT}.mkv"
    MAX=$(ffmpeg -hide_banner -i "$f" -map 0:a -filter:a volumedetect -f null /dev/null 2>&1 | grep 'max_volume' | awk '{print $5, $6}')
    echo " $FCT $MAX"
    done

    for f in out_*.mkv; do
    MAX=$(ffmpeg -hide_banner -i "$f" -map 0:a -filter:a volumedetect -f null /dev/null 2>&1 | grep 'max_volume' | awk '{print $5, $6}')
    echo " $f $MAX"
    done
    输出:
    1 max_volume: -1.1 dB
    2 -0.2 dB
    3 0.0 dB
    4 -1.9 dB
    5 -0.1 dB
    6 -0.9 dB
    7 0.0 dB
    8 0.0 dB
    9 0.0 dB
    10 0.0 dB
    11 0.0 dB
    12 0.0 dB
    13 -0.5 dB
    14 -1.1 dB
    15 0.0 dB
    16 0.0 dB
    17 -0.0 dB
    out_02.mkv -4.4 dB
    out_03.mkv -5.0 dB
    out_04.mkv -6.8 dB
    out_05.mkv -7.1 dB
    out_06.mkv -8.3 dB
    out_07.mkv -8.9 dB
    out_08.mkv -8.9 dB
    out_09.mkv -8.8 dB
    out_10.mkv -8.9 dB
    out_11.mkv -9.7 dB
    out_12.mkv -10.3 dB
    out_13.mkv -11.1 dB
    out_14.mkv -11.3 dB
    out_15.mkv -10.6 dB
    out_16.mkv -10.9 dB
    out_17.mkv -11.2 dB
    得到其他结果,但仍然没有强大的模式

    关于audio - 在 ffmpeg 中规范化音频 - 如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64753053/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com