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

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

ムービークリップの中で最も大きなピーク音をコーデックが許す限り大きくして、それに応じて他のすべての音を増幅させたいのですが、FFMPEGを使ってこれを実現するための実用的な例を教えてください。

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

回答 (4)

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

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

現在の ffmpeg には、正規化に直接使用できる 2 つのフィルターがあります。以下がその例です。

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

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

ffmpeg-normalizeフィルターは1パスで使用できますが、より正確な線形正規化ができるように2パス行うことをお勧めします。これを自動化するのは少し難しいです。また、0 dBFS(または他のターゲット)への「シンプルな」RMSベースまたはピーク正規化が必要な場合は、読み進めてください。

オプション 2: ffmpeg ツールを使う

私は メディアファイルを正規化する Python プログラム , PyPi でも利用可能 を作成しました。

を使用する 例:

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を、いくつかの例については README をご覧ください。

また、他のエンコーダー(例:AACやMP3)での再エンコードや、音声をビデオに戻す自動マージもサポートしています。

オプション 3: volume

でオーディオを手動で正規化する ffmpeg では、/dev/null フィルターを使用してトラックの音量を変更することができます。(https://ffmpeg.org/ffmpeg.html#Stream-selection) プログラムの 最新バージョンをダウンロード がインストールされていることを確認してください。

このガイドは peak 正規化のためのもので、ファイルの中で最も音量の大きい部分をより低い値ではなく 0 dB にすることを意味します。RMSベースの正規化もありますが、これは複数のファイルの平均ラウドネスを同じにしようとするものです。これを行うには、最大音量を0 dBにするのではなく、平均音量を選択したdBレベル(例:-26 dB)にするようにしてください。

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

NUL を Windows の場合は -vn-sn に置き換えてください。
-dn , [ volume ]0x3&, および [ -c:v copy ]0x3& 引数は、この分析中にオーディオ以外のストリームを無視するように 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 のゲインを適用できます。0dBの値が出た場合は、オーディオをノーマライズする必要はありません。

ボリュームフィルターを適用する:

ここで、[ -map 0 フィルター ]0x3& をオーディオファイルに適用します。フィルタを適用すると、オーディオストリームを再エンコードする必要があることに注意してください。オーディオにどのようなコーデックを使うかは、もちろん元のフォーマットに依存します。以下にいくつかの例を示します。

  • 通常のオーディオファイル:必要なエンコーダーでファイルをエンコードしてください。

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

  • MP4形式:MP4コンテナに入っている場合、通常はAACオーディオがあります。ffmpeg のビルトイン AAC エンコーダーを使用することができます。

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

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

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

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

関連する質問

6
10
8
12
2