slh*_*hck 271
当前的 ffmpeg 有两个可以直接用于归一化的过滤器——尽管它们已经相当先进,因此它们不会简单地应用增益来达到峰值水平。他们来了:
loudnorm:根据 EBU R128 进行响度归一化。您可以设置集成响度目标、响度范围目标或最大真实峰值。推荐用于发布音频和视频,世界各地的广播公司都在使用它。dynaudnorm:无需剪辑的“智能”响度归一化,在文件的窗口部分动态应用归一化。这可能会改变声音的特性,因此应谨慎使用。此外,volume过滤器可用于执行简单的音量调整。有关更多信息,请参阅音频音量操作wiki 条目。
该loudnorm过滤器可与一个通一起使用,但建议进行两次通过,这使得能够更精确线性规范化。这有点难以自动化。此外,如果您想要“简单”的基于 RMS 或峰值归一化到 0 dBFS(或任何其他目标),请继续阅读。
ffmpeg-normalize工具我创建了一个 Python 程序来规范媒体文件,也可以在 PyPi 上使用。你只需:
ffmpeg可执行文件$PATH添加到,例如/usr/local/bin,或将其目录添加到$PATHpip install ffmpeg-normalizeffmpeg-normalize例如:
ffmpeg-normalize input.mp4 -o output.mp4 -c:a aac -b:a 192k
Run Code Online (Sandbox Code Playgroud)
或者,简单地批量标准化多个音频文件并将它们作为未压缩的 WAV 写入输出文件夹:
ffmpeg-normalize *.m4a -of /path/to/outputFolder -ext wav
Run Code Online (Sandbox Code Playgroud)
该工具支持 EBU R128(默认)、RMS 和峰值。查看ffmpeg-normalize -h更多选项并查看README以获取一些示例。
此外,它还支持使用其他编码器(例如,AAC 或 MP3)重新编码,或将音频自动合并回视频。
ffmpeg在 ffmpeg 中,您可以使用volume过滤器来更改曲目的音量。确保您下载了该程序的最新版本。
本指南用于峰值归一化,这意味着它将使文件中最响亮的部分位于 0 dB 而不是更低的位置。还有基于 RMS 的归一化,它试图使多个文件的平均响度相同。为此,不要尝试将最大音量推至 0 dB,而是将平均音量推至所选的 dB 级别(例如 -26 dB)。
首先,您需要分析最大音量的音频流,看看标准化是否会得到回报:
ffmpeg -i video.avi -af "volumedetect" -vn -sn -dn -f null /dev/null
Run Code Online (Sandbox Code Playgroud)
在 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
Run Code Online (Sandbox Code Playgroud)
如您所见,我们的最大音量为 -5.0 dB,因此我们可以应用 5 dB 增益。如果得到 0 dB 的值,则不需要对音频进行归一化。
现在我们将volume过滤器应用于音频文件。请注意,应用过滤器意味着我们必须重新编码音频流。当然,您想要的音频编解码器取决于原始格式。这里有些例子:
纯音频文件:只需使用您需要的任何编码器对文件进行编码:
ffmpeg -i input.wav -af "volume=5dB" output.mp3
Run Code Online (Sandbox Code Playgroud)
当然,您的选择非常广泛。
AVI 格式:通常有 MP3 音频和视频放在 AVI 容器中:
ffmpeg -i video.avi -af "volume=5dB" -c:v copy -c:a libmp3lame -q:a 2 output.avi
Run Code Online (Sandbox Code Playgroud)
这里我们选择了质量级别 2。值范围从 0 到 9,越低越好。有关设置质量的更多信息,请查看MP3 VBR 指南。例如,您还可以使用 设置固定比特率-b:a 192k。
MP4 格式:使用 MP4 容器,您通常会找到 AAC 音频。我们可以使用 ffmpeg 的内置 AAC 编码器。
ffmpeg -i video.mp4 -af "volume=5dB" -c:v copy -c:a aac -b:a 192k output.mp4
Run Code Online (Sandbox Code Playgroud)
在上面的例子中,视频流将使用-c:v copy. 如果输入文件中有字幕或多个视频流,请-map 0在输出文件名前使用该选项。
小智 8
我不能评论最好的消息,所以这是我基于它做的丑陋的bash
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
Run Code Online (Sandbox Code Playgroud)
小智 6
这是一个用于标准化 .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
Run Code Online (Sandbox Code Playgroud)