2011-08-14 19:56:01 +0000 2011-08-14 19:56:01 +0000
125
125

如何使用ffmpeg对音频进行标准化?

我想让电影片段中最响的峰值声音在编解码器允许的范围内响起,然后让其他每个声音都相应放大。

有什么实际的例子可以用ffmpeg来实现?

答案 (4)

202
202
202
2011-08-14 20:11:03 +0000

选项1:内置归一化滤波器

当前的ffmpeg有两个滤波器可以直接用于归一化–虽然它们已经很高级了,所以它们并不是简单地应用增益来达到峰值水平。它们是这样的。

  • loudnorm : 根据EBU R128进行响度归一化. 您可以设置综合响度目标、响度范围目标或最大真实峰值。这是推荐用于发布音频和视频的,全世界的广播公司都在使用它。
  • dynaudnorm : “智能 "响度归一化,无削波,在文件的窗口部分动态地应用归一化。这可能会改变声音的特性,因此应谨慎应用。

此外,volume滤波器也可用于执行简单的音量调整。更多内容请参考音频音量操纵维基条目。

loudnorm滤波器可以用一个通道,但建议执行两个通道,这样可以实现更精确的线性归一化。这有点难以自动化。另外,如果你想要一个 "简单的 "基于RMS或峰值的归一化到0 dBFS(或任何其他目标),请继续阅读。


选项2:使用ffmpeg-normalize工具

我创建了一个Python程序来归一化媒体文件在PyPi上也可以使用。你只需:

  • 下载 ffmpeg (选择一个 static build, 版本 3. 1或更高版本)
  • ffmpeg可执行文件放在你的$PATH中,例如,将其添加到/usr/local/bin中,或将其目录添加到$PATH
  • 运行pip install ffmpeg-normalize
  • 使用ffmpeg-normalize

例如:

ffmpeg-normalize input.mp4 -o output.mp4 -c:a aac -b:a 192k

或者,简单地将一些音频文件批量归一化,并将其作为未压缩的WAV写入输出文件夹。

ffmpeg-normalize *.m4a -of /path/to/outputFolder -ext wav

该工具支持EBU R128(默认),RMS和峰值。请看ffmpeg-normalize -h了解更多选项,并查看 README 了解一些例子。

此外,它还支持用其他编码器(如AAC或MP3)重新编码,或自动将音频合并回视频中。


选项3:使用ffmpeg

手动规范音频 在ffmpeg中,你可以使用volume过滤器来改变音轨的音量。确保你下载最新版本的程序。

这个指南是针对_峰值归一化的,意思是它会让文件中最大声的部分坐在0dB而不是更低的地方。也有基于RMS的归一化,它试图使多个文件的平均响度相同。要做到这一点,不要试图将最大音量推到0 dB,而是将平均音量推到所选择的dB级别(例如-26 dB)。

找出要应用的增益

首先,你需要分析音频流的最大音量,看看归一化是否会有回报:

ffmpeg -i video.avi -af "volumedetect" -vn -sn -dn -f null /dev/null

在Windows上用/dev/null替换NUL
-vn , -sn , 和 -dn 参数指示 ffmpeg 在分析过程中忽略非音频流。这将大大加快分析速度。

这将会输出类似下面的内容。

[Parsed_volumedetect_0 @ 0x7f8ba1c121a0] mean_volume: -16.0 dB
[Parsed_volumedetect_0 @ 0x7f8ba1c121a0] max_volume: -5.0 dB
[Parsed_volumedetect_0 @ 0x7f8ba1c121a0] histogram_0db: 87861

如你所见,我们的最大音量是-5.0dB,所以我们可以应用5dB增益。如果你得到的值是0dB,那么你就不需要对音频进行标准化。

应用音量过滤器:

现在我们将 volume过滤器应用到音频文件中。请注意,应用过滤器意味着我们将不得不重新对音频流进行编码。当然,你想要什么样的音频编解码器取决于原始格式。下面是一些例子。

  • 普通音频文件:用任何你需要的编码器对文件进行编码即可。

  • AVI格式:通常有MP3音频与视频,装在AVI容器中:

  • MP4格式:用MP4容器,通常会找到AAC音频。我们可以使用ffmpeg的内置AAC编码器。

在上面的例子中,视频流将使用-c:v copy复制过来。如果您的输入文件中有字幕,或者有多个视频流,请在输出文件名前使用-map 0选项。

7
7
7
2016-05-19 14:51:16 +0000

我不能评论最好的消息,所以,这是我的丑陋的巴什基于它做那

ffmpeg -i sound.mp3 -af volumedetect -f null -y nul &> original.txt
grep "max_volume" original.txt > original1.tmp
sed -i 's|: -|=|' original1.tmp
if [$? = 0]
 then
 sed -i 's| |\r\n|' original.tmp
 sed -i 's| |\r\n|' original.tmp
 sed -i 's| |\r\n|' original.tmp
 sed -i 's| |\r\n|' original.tmp
 grep "max_volume" original1.tmp > original2.tmp
 sed -i 's|max_volume=||' original2.tmp
 yourscriptvar=$(cat "./original2.tmp")dB
 rm result.mp3
 ffmpeg -i sound.mp3 -af "volume=$yourscriptvar" result.mp3
 ffmpeg -i result.mp3 -af volumedetect -f null -y nul &> result.txt
fi
```。
5
5
5
2015-09-12 04:57:30 +0000

这里有一个脚本来规范.m4a文件的声级。如果一开始的声音水平太安静,就要注意了。在这种情况下,如果你使用类似Audacity的东西,最终的声音可以更好。

#!/bin/bash

# Purpose: Use ffmpeg to normalize .m4a audio files to bring them up to max volume, if they at first have negative db volume. Doesn't process them if not. Keeps bitrate same as source files.
# Parameters: $1 should be the name of the directory containing input .m4a files.
# $2 should be the output directory.

INPUTDIR=$1
OUTPUTDIR=$2

<<"COMMENT"

# For ffmpeg arguments http://superuser.com/questions/323119/how-can-i-normalize-audio-using-ffmpeg
# and
# https://kdecherf.com/blog/2012/01/14/ffmpeg-converting-m4a-files-to-mp3-with-the-same-bitrate/
ffmpeg -i test.m4a -af "volumedetect" -f null /dev/null

ffmpeg -i test.m4a -af "volumedetect" -f null /dev/null 2>&1 | grep max_volume
# output: max_volume: -10.3 dB

ffmpeg -i test.m4a -af "volumedetect" -f null /dev/null 2>&1 | grep 'max_volume\|Duration'
# Output:
# Duration: 00:00:02.14, start: 0.000000, bitrate: 176 kb/s
# [Parsed_volumedetect_0 @ 0x7f8531e011a0] max_volume: -10.3 dB

ffmpeg -i test.m4a -af "volumedetect" -f null /dev/null 2>&1 | grep max_volume | awk -F': ' '{print $2}' | cut -d' ' -f1
# Output: -10.3

ffmpeg -i test.m4a 2>&1 | grep Audio
# output: Stream #0:0(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 170 kb/s (default)

ffmpeg -i test.m4a 2>&1 | grep Audio | awk -F', ' '{print $5}' | cut -d' ' -f1
# output: 170

# This works, but I get a much smaller output file. The sound levels do appear normalized.
ffmpeg -i test.m4a -af "volume=10.3dB" -c:v copy -c:a aac -strict experimental output.m4a

# Operates quietly.
ffmpeg -i test.m4a -af "volume=10.3dB" -c:v copy -c:a aac -strict experimental -b:a 192k output.m4a -loglevel quiet

COMMENT

# $1 (first param) should be the name of a .m4a input file, with .m4a extension
# $2 should be name of output file, with extension
function normalizeAudioFile {
    INPUTFILE=$1
    OUTPUTFILE=$2

    DBLEVEL=`ffmpeg -i ${INPUTFILE} -af "volumedetect" -f null /dev/null 2>&1 | grep max_volume | awk -F': ' '{print $2}' | cut -d' ' -f1`

    # We're only going to increase db level if max volume has negative db level.
    # Bash doesn't do floating comparison directly
    COMPRESULT=`echo ${DBLEVEL}'<'0 | bc -l`
    if [${COMPRESULT} -eq 1]; then
        DBLEVEL=`echo "-(${DBLEVEL})" | bc -l`
        BITRATE=`ffmpeg -i ${INPUTFILE} 2>&1 | grep Audio | awk -F', ' '{print $5}' | cut -d' ' -f1`

        # echo $DBLEVEL
        # echo $BITRATE

        ffmpeg -i ${INPUTFILE} -af "volume=${DBLEVEL}dB" -c:v copy -c:a aac -strict experimental -b:a ${BITRATE}k ${OUTPUTFILE} -loglevel quiet

    else
        echo "Already at max db level:" $DBLEVEL "just copying exact file"
        cp ${INPUTFILE} ${OUTPUTFILE}
    fi
}

for inputFilePath in ${INPUTDIR}/*; do
    inputFile=$(basename $inputFilePath)
    echo "Processing input file: " $inputFile
    outputFilePath=${OUTPUTDIR}/$inputFile
    normalizeAudioFile ${inputFilePath} ${outputFilePath}
done
-2
-2
-2
2019-03-21 20:27:43 +0000

ffmpeg -i image.jpg -i “input.mp3” -acodec copy tmp.avi

mencoder -ovc copy -oac copy tmp.avi -of rawaudio -af volnorm=1 -oac mp3lame -lameopts cbr:preset=192 -srate 48000 -o “output.mp3”

rm -f tmp.avi。