Як я можу нормалізувати звук за допомогою ffmpeg?


119

Я хочу, щоб найгучніший піковий звук у відеоролику був таким же гучним, як дозволяє кодек, а потім кожен інший звук посилюватися відповідно.

Який практичний приклад для досягнення цього за допомогою ffmpeg?


1
Ви хочете, щоб звук "нормалізувався". Я знайшов цю тему і там є багато хорошої інформації. Сподіваюся, це допомагає!
bobsbarricades

Відповіді:


189

Варіант 1: Вбудовані фільтри нормалізації

Поточний ffmpeg має два фільтри, які можна безпосередньо використовувати для нормалізації - хоча вони вже досить вдосконалені, тому вони не просто застосовують посилення для досягнення пікового рівня. Ось вони:

  • loudnorm: нормалізація гучності відповідно до EBU R128. Ви можете встановити інтегровану ціль гучності, ціль діапазону гучності або максимальний справжній пік. Це рекомендується для публікації аудіо та відео, і воно використовується телерадіокомпаніями по всьому світу.
  • dynaudnorm: «Інтелектуальна» нормалізація гучності без відсікання, яка динамічно застосовує нормалізацію до віконних частин файлу. Це може змінити характеристики звуку, тому застосовувати його слід обережно.

Також volumeфільтр можна використовувати для простого регулювання гучності. Додаткову інформацію див. У статті Вікі- маніпуляції з обсягом аудіо .

loudnormФільтр може бути використаний з одним проходом, але рекомендується , щоб виконати два проходи, що дозволяє більш точно лінійної нормалізації. Це трохи важко автоматизувати. Крім того, якщо ви хочете "простої" на основі RMS або пікової нормалізації до 0 dBFS (або будь-якої іншої цілі), читайте далі.


Варіант 2: Використовуйте ffmpeg-normalizeінструмент

Я створив програму Python для нормалізації медіа-файлів , доступних і на PyPi . Ви просто:

  • завантажити ffmpeg (виберіть статичну збірку , версію 3.1 або новішу)
  • помістіть 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) або автоматичне злиття аудіо назад у відео.


Варіант 3: нормалізація звуку вручну за допомогою ffmpeg

У ffmpeg ви можете використовувати volumeфільтр, щоб змінити гучність доріжки. Обов’язково завантажте останню версію програми.

Цей посібник призначений для нормалізації піку , тобто він зробить найгучнішу частину файлу на 0 dB замість чогось нижчого. Існує також нормалізація на основі RMS, яка намагається зробити середню гучність однаковою для кількох файлів. Для цього не намагайтеся висунути максимальний об'єм до 0 дБ, а середній об'єм до вибору рівня дБ (наприклад, -26 дБ).

Дізнайтеся виграш, який слід застосувати

Спочатку потрібно проаналізувати аудіопотік на максимальну гучність, щоб побачити, чи нормалізація навіть окупиться:

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

Замінити /dev/nullз NULна Windows.
Аргументи -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 дБ, тому ми можемо застосувати посилення 5 дБ. Якщо ви отримаєте значення 0 дБ, то вам не потрібно нормалізувати звук.

Застосуйте фільтр гучності:

Тепер застосуємо volumeфільтр до аудіофайлу. Зауважте, що застосувавши фільтр, нам доведеться перекодувати звуковий потік. Звичайно, який кодек ви хочете для аудіо, залежить від оригінального формату. Ось кілька прикладів:

  • Звичайний аудіофайл: просто кодуйте файл будь-яким кодером, який вам потрібен:

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

    Ваші варіанти, звичайно, дуже широкі.

  • Формат AVI: Зазвичай аудіо MP3 з відео, яке поставляється в контейнері AVI:

    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. Ми можемо використовувати вбудований AAC-кодер ffmpeg.

    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перед назвою вихідного файлу.


Коментарі не для розширеного обговорення; ця розмова переміщена до чату .
Подорожник Geek

7
Це дар, який продовжує давати. Через 6 років, і він все ще оновлюється та підтримується. Молодці!
Джон Скарпетейг

Чи уникає варіант 3 відсікання, якщо я встановив новий об'єм, щоб max_volume дорівнював нулю? тобто використовуючи протилежне початкове значення, задане max_volume
rraallvv

@rraallvv Так, так і повинно. Це також робить ffmpeg-normalizeінструмент, коли ви вказуєте рівень 0 дБ і нормалізацію піку.
slhck

7

Я не можу коментувати найкраще повідомлення, так що на моєму потворному башті базується це зробити

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

5

Ось сценарій для нормалізації рівня звуку файлів .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

ffmpeg -i image.jpg -i "input.mp3" -acodec копія tmp.avi

mencoder -ovc копія -oac копія tmp.avi -of rawaudio -a volnorm = 1 -oac mp3lame -lameopts cbr: preset = 192 -srate 48000 -o "output.mp3"

rm -f tmp.avi


2
Порівнюючи це з іншими відповідями тут, я сподіваюся, що зрозуміло, що у вашому дописі бракує контекстуальної та пояснювальної інформації, яка була б корисною. Що таке "mencoder" і яку роль він відіграє у відповіді на питання?
music2myear

2
Чи можете ви відредагувати свою відповідь, щоб пояснити, чому цей код відповідає на питання? Відповіді, що стосуються лише коду, відмовляють , оскільки вони не вчать рішення.
DavidPostill
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.