ffmpegを使って音声を正規化するにはどうすればいいですか?

audio ffmpeg

私は、ムービークリップの中で最も大きなピーク音をコーデックが許す限り大きくして、それに応じて他のすべての音を増幅させたいと思います

ffmpegを使ってこれを実現するための実用的な例を教えてください

  139  Jon Skarpeteig  2011-08-14


ベストアンサー

オプシ ョ ン 1:内蔵の正規化フ ィ ル タ

現在のffmpegには、正規化のために直接使用できる2つのフィルタがあります – それらはすでにかなり高度なものですが、彼らは単にピークレベルに到達するためにゲインを適用しないようにしています。ここにそれらがあります

  • loudnorm:EBU R128に準拠したラウドネス正規化。統合ラウドネス目標、ラウドネスレンジ目標、最大真のピークを設定することができます。オーディオやビデオのパブリッシングに推奨されており、世界中の放送局で使用されています
  • dynaudnorm: クリッピングなしの “インテリジェント “ラウドネス正規化で、ファイルのウィンドウ化された部分に動的に正規化を適用します。これは音の特性を変える可能性があるので、注意して適用する必要があります

また、volumeフィルターを使って簡単な音量調整を行うこともできます。詳しくは オーディオボリュームの操作 を参照してください

loudnormのフィルタは1パスで使用できますが、2パスにした方がより正確な線形正規化が可能になります。これを自動化するのは少し難しいです。また、0 dBFS (または他の任意のターゲット) への “単純な” RMS ベースの正規化やピーク正規化が必要な場合は、読んでみてください


オプション2: ffmpeg-normalizeツールを使用します

メディアファイルを正規化するためのa PythonプログラムPyPi上でも利用可能を作成しました。あなたは単に

For example:

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、ピークをサポートしています。より多くのオプションについては、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/nullNULに置き換えてください。 -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.0 dB ですので、5 dB のゲインを適用することができます。0 dB の値が得られれば、オーディオをノーマライズする必要はありません

ボリュームフィルターを適用します

ここで、volume フィルタをオーディオファイルに適用します。フィルタを適用すると、オーディオストリームを再エンコードしなければならないことに注意してください。オーディオにどのようなコーデックを使うかは、もちろん元のフォーマットに依存します。以下にいくつかの例を示します

  • プレーンなオーディオファイル。必要なエンコーダーでファイルをエンコードするだけです

    ffmpeg -i input.wav -af "volume=5dB" output.mp3
    

    もちろん、あなたの選択肢は非常に広いです

  • AVI形式です。通常、AVIコンテナに入っているビデオとMP3オーディオがあります

    ffmpeg -i video.avi -af "volume=5dB" -c:v copy -c:a libmp3lame -q:a 2 output.avi
    

    ここでは品質レベル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
    

    ここでは、他のAACエンコーダも使用できます。それらの中にはVBRにも対応しているものもあります。ヒントについては、この回答AACエンコーディングガイドを参照してください

上記の例では、ビデオストリームは -c:v copy を使ってコピーされます。入力ファイルに字幕がある場合、または複数のビデオストリームがある場合は、出力ファイル名の前に -map 0 オプションを使用してください

230  slhck  2011-08-14


私はそれを行うには、それに基づいて私の醜いバッシングであるので、最高のメッセージにコメントすることはできません

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

7  Sebastien Willemijns  2016-05-19


.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

5  Chris Prince  2015-09-12


コマンドラインを使っています

mkdir NORMALIZED; for mkv in *.mkv ; do wav=`basename "$mkv" .mkv`.wav; echo "${wav}"; ffmpeg -i "${mkv}" -acodec copy "${wav}" ; normalize-audio "${wav}"; ffmpeg -i "${mkv}"  -i "${wav}" -codec copy NORMALIZED/"${mkv}"; done;

Or batch

[ ! -d work ] && echo "work directory does not ezists" && exit 1

for fn in *.mkv
do
map=$(ffmpeg -i "$fn" |& grep Stream | grep pcm_s16le) # pcm_dvd ac3 mp3

if [ "$map" != "" ]
then
echo "$fn"
fb=${fn%.mkv} #; shopt -s extglob; fb=${fb%%+([[:space:]])}
amap=${map:12:3}
ffmpeg -y -i "$fn" -map $amap -acodec pcm_s16le work/"$fb".wav 2>/dev/null
wavegain -y work/"$fb".wav
ffmpeg -y -i "$fn" -i work/"$fb".wav -c:v copy -c:a copy -map 0:v:0 -map 1:a:0 work/"$fb".mkv 2>/dev/null
rm -f work/"$fb".wav
echo
fi
done

read -p "BAIGTA"

0  user1855805  2020-03-28


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

-2  Maquelan Howl  2019-03-21


タイトルとURLをコピーしました