当前的ffmpeg有两个滤波器可以直接用于归一化–虽然它们已经很高级了,所以它们并不是简单地应用增益来达到峰值水平。它们是这样的。
loudnorm
: 根据EBU R128进行响度归一化. 您可以设置综合响度目标、响度范围目标或最大真实峰值。这是推荐用于发布音频和视频的,全世界的广播公司都在使用它。dynaudnorm
: “智能 "响度归一化,无削波,在文件的窗口部分动态地应用归一化。这可能会改变声音的特性,因此应谨慎应用。此外,volume
滤波器也可用于执行简单的音量调整。更多内容请参考音频音量操纵维基条目。
loudnorm
滤波器可以用一个通道,但建议执行两个通道,这样可以实现更精确的线性归一化。这有点难以自动化。另外,如果你想要一个 "简单的 "基于RMS或峰值的归一化到0 dBFS(或任何其他目标),请继续阅读。
ffmpeg-normalize
工具我创建了一个Python程序来归一化媒体文件,在PyPi上也可以使用。你只需:
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)重新编码,或自动将音频合并回视频中。
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
选项。
我不能评论最好的消息,所以,这是我的丑陋的巴什基于它做那
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
```。
这里有一个脚本来规范.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
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。