私は、ムービークリップの中で最も大きなピーク音をコーデックが許す限り大きくして、それに応じて他のすべての音を増幅させたいと思います
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上でも利用可能を作成しました。あなたは単に
- ffmpeg のダウンロード (バージョン 3.1 以上の静的ビルドを選択)
ffmpeg
の実行ファイルを$PATH
に入れるには、例えば/usr/local/bin
に追加するか、そのディレクトリを <++2 に追加します- 実行 <++1
- Use
ffmpeg-normalize
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/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.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