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

Как я могу нормализовать звук с помощью ffmpeg?

Я хочу, чтобы самый громкий пиковый звук в фильме был настолько громким, насколько позволяет кодек, а затем каждый второй звук должен быть соответственно усилен.

Какой практический пример, чтобы добиться этого с помощью ffmpeg?

Ответы (4)

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

Вариант 1: Встроенные фильтры нормализации

Current ffmpeg имеют два фильтра, которые могут быть непосредственно использованы для нормализации - хотя они уже достаточно продвинуты, поэтому они не просто применяют коэффициент усиления для достижения пикового уровня. Вот они:

  • loudnorm : нормализация громкости в соответствии с EBU R128. Вы можете установить встроенную цель громкости, цель диапазона громкости или максимальный истинный пиковый уровень. Это рекомендуется для публикации аудио и видео и используется вещательными компаниями во всем мире.
  • dynaudnorm : “умная” нормализация громкости без обрезков, которая динамически применяет нормализацию к оконным частям файла. Это может изменить характеристики звука, поэтому его следует применять с осторожностью. Фильтр

Кроме того, фильтр volume может использоваться для выполнения простой регулировки громкости. Дополнительную информацию см. в разделе Манипулирование громкостью звука Вики-запись. Фильтр

Фильтр loudnorm можно использовать с одним проходом, но рекомендуется выполнять два прохода, что обеспечивает более точную линейную нормализацию. Это немного сложно автоматизировать. Также, если вам нужна “простая” среднеквадратическая или пиковая нормализация до 0 дБФС (или любой другой целевой показатель), читайте дальше.


  • Вариант 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 для изменения громкости дорожки. Убедитесь, что вы загрузили последнюю версию программы.

Это руководство предназначено для нормализации peak, что означает, что самая громкая часть файла будет сидеть на 0 дБ, а не на чем-то ниже. Также существует нормализация на основе RMS, которая пытается сделать громкость verage одинаковой для нескольких файлов. Для этого не пытайтесь подтолкнуть максимальный уровень громкости к 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 фильтр к аудиофайлу. Обратите внимание, что применение фильтра означает, что нам придется перекодировать аудио поток. Разумеется, какой кодек вы хотите использовать для аудио, зависит от исходного формата. Вот несколько примеров:

  • Обычный аудио файл: Просто кодируйте файл любым кодировщиком, который вам нужен:

  • AVI формат: Обычно есть аудио MP3 с видео, которое поставляется в контейнере AVI:

  • MP4 формат: С контейнером MP4, вы, как правило, найдете аудио AAC. Мы можем использовать встроенный кодировщик AAC от ffmpeg.

В приведенных выше примерах видеопоток будет скопирован с использованием -c:v copy. Если во входном файле есть субтитры или несколько видеопотоков, используйте опцию -map 0 перед именем выходного файла.

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

Я не могу прокомментировать лучшее сообщение, так что это моя уродливая вечеринка, основанная на нем, чтобы сделать это

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
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
8