Я хочу, чтобы самый громкий пиковый звук в видеоклипе был настолько громким, насколько позволяет кодек, а затем соответственно усилил все остальные звуки.
Какой практический пример для того, чтобы сделать это с помощью ffmpeg?
Вы хотите, чтобы звук был «нормализован». Я нашел эту ветку и там много полезной информации. Надеюсь, это поможет!
bobsbarricades
Ответы:
190
Вариант 1: встроенные фильтры нормализации
Текущий ffmpeg имеет два фильтра, которые можно напрямую использовать для нормализации - хотя они уже достаточно продвинуты, поэтому они не просто применяют усиление для достижения пикового уровня. Они здесь:
loudnorm: нормализация громкости по EBU R128. Вы можете установить интегрированную цель громкости, цель диапазона громкости или максимальный истинный пик. Это рекомендуется для публикации аудио и видео и используется вещательными компаниями по всему миру.
dynaudnorm: «Интеллектуальная» нормализация громкости без ограничения, которая динамически применяет нормализацию к оконным частям файла. Это может изменить характеристики звука, поэтому его следует применять с осторожностью.
Также volumeфильтр можно использовать для выполнения простых настроек громкости. См. Вики запись Audio Volume Manipulation для более подробной информации.
loudnormФильтр может быть использован с одним проходом, но рекомендуется , чтобы выполнить два прохода, что позволяет более точно линейной нормализации. Это немного сложно автоматизировать. Кроме того, если вы хотите «простую» среднеквадратичную или пиковую нормализацию до 0 дБFS (или любую другую цель), читайте дальше.
Вариант 2: использовать ffmpeg-normalizeинструмент
Инструмент поддерживает EBU R128 (по умолчанию), RMS и пик. Посмотрите на ffmpeg-normalize -hдругие варианты и проверьте README для некоторых примеров.
Кроме того, он поддерживает перекодирование с другими кодерами (например, AAC или MP3) или автоматическое объединение аудио обратно в видео.
Вариант 3: нормализация звука вручную с ffmpeg
В ffmpeg вы можете использовать volumeфильтр для изменения громкости трека. Убедитесь, что вы скачали последнюю версию программы.
Это руководство предназначено для нормализации пиков , что означает, что самая громкая часть в файле будет сидеть на 0 дБ вместо чего-то более низкого. Существует также нормализация на основе RMS, которая пытается сделать среднюю громкость одинаковой для нескольких файлов. Для этого не пытайтесь довести максимальную громкость до 0 дБ, а среднюю громкость до выбранного уровня дБ (например, -26 дБ).
Узнайте усиление, чтобы применить
Сначала вам нужно проанализировать аудиопоток на максимальную громкость, чтобы увидеть, окупится ли нормализация:
Заменить /dev/nullс NULна Windows. , И аргументы , проинструктировать FFmpeg игнорировать не-аудио потоков в ходе этого анализа. Это резко ускоряет анализ. -vn-sn-dn
Это выведет что-то вроде следующего:
[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:
Здесь мы выбрали уровень качества 2. Значения варьируются от 0 до 9, и ниже означает лучше. Обратитесь к руководству MP3 VBR для получения дополнительной информации о настройке качества. Вы также можете установить фиксированный битрейт -b:a 192k, например.
Формат MP4: в контейнере MP4 вы обычно найдете аудио AAC. Мы можем использовать встроенный кодировщик AAC в ffmpeg.
Здесь вы также можете использовать другие кодеры AAC. Некоторые из них также поддерживают VBR. Посмотрите этот ответ и руководство по кодированию AAC для некоторых советов.
В приведенных выше примерах видеопоток будет скопирован с использованием -c:v copy. Если во входном файле есть субтитры или несколько видеопотоков, используйте опцию -map 0перед именем выходного файла.
Комментарии не для расширенного обсуждения; этот разговор был перенесен в чат .
Подмастерье Компьютерщик
7
Это подарок, который продолжает давать. 6 лет спустя, и это все еще обновляется и поддерживается. Отлично сработано!
Джон Скарпетейг
Вариант 3 избегает отсечения, если я устанавливаю новый объем так, чтобы max_volume был нулем? то есть используя противоположное начальное значение, заданное max_volume
rraallvv
@rraallvv Да, так и должно быть. Это также делает ffmpeg-normalizeинструмент, когда вы указываете уровень 0 дБ и пиковую нормализацию.
slhck
Чтобы использовать loudnorm(или другой) фильтр:ffmpeg -i input.wav -filter:a loudnorm output.wav
Иошуа
7
Я не могу комментировать лучшее сообщение, так что это мой уродливый bash на его основе, чтобы сделать это
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
Вот скрипт для нормализации уровня звука файлов .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
Сравнивая это с другими ответами здесь, я надеюсь, что ясно, что вашему сообщению не хватает контекстной и пояснительной информации, которая сделала бы его полезным. Что такое «менкодер» и какую роль он играет в ответе на вопрос?
music2myear
2
Не могли бы вы отредактировать свой ответ, чтобы объяснить, почему этот код отвечает на вопрос? Ответы только на код не приветствуются , потому что они не учат решению.
Ответы:
Вариант 1: встроенные фильтры нормализации
Текущий ffmpeg имеет два фильтра, которые можно напрямую использовать для нормализации - хотя они уже достаточно продвинуты, поэтому они не просто применяют усиление для достижения пикового уровня. Они здесь:
loudnorm
: нормализация громкости по EBU R128. Вы можете установить интегрированную цель громкости, цель диапазона громкости или максимальный истинный пик. Это рекомендуется для публикации аудио и видео и используется вещательными компаниями по всему миру.dynaudnorm
: «Интеллектуальная» нормализация громкости без ограничения, которая динамически применяет нормализацию к оконным частям файла. Это может изменить характеристики звука, поэтому его следует применять с осторожностью.Также
volume
фильтр можно использовать для выполнения простых настроек громкости. См. Вики запись Audio Volume Manipulation для более подробной информации.loudnorm
Фильтр может быть использован с одним проходом, но рекомендуется , чтобы выполнить два прохода, что позволяет более точно линейной нормализации. Это немного сложно автоматизировать. Кроме того, если вы хотите «простую» среднеквадратичную или пиковую нормализацию до 0 дБFS (или любую другую цель), читайте дальше.Вариант 2: использовать
ffmpeg-normalize
инструментЯ создал программу Python для нормализации медиа-файлов , также доступную в PyPi . Вы просто:
ffmpeg
исполняемый файл в свой файл$PATH
, добавив его, например/usr/local/bin
, или добавив его каталог в$PATH
pip install ffmpeg-normalize
ffmpeg-normalize
Например:
Или просто нормализовать несколько аудиофайлов в пакетном режиме и записать их как несжатый WAV в выходную папку:
Инструмент поддерживает EBU R128 (по умолчанию), RMS и пик. Посмотрите на
ffmpeg-normalize -h
другие варианты и проверьте README для некоторых примеров.Кроме того, он поддерживает перекодирование с другими кодерами (например, AAC или MP3) или автоматическое объединение аудио обратно в видео.
Вариант 3: нормализация звука вручную с
ffmpeg
В ffmpeg вы можете использовать
volume
фильтр для изменения громкости трека. Убедитесь, что вы скачали последнюю версию программы.Это руководство предназначено для нормализации пиков , что означает, что самая громкая часть в файле будет сидеть на 0 дБ вместо чего-то более низкого. Существует также нормализация на основе RMS, которая пытается сделать среднюю громкость одинаковой для нескольких файлов. Для этого не пытайтесь довести максимальную громкость до 0 дБ, а среднюю громкость до выбранного уровня дБ (например, -26 дБ).
Узнайте усиление, чтобы применить
Сначала вам нужно проанализировать аудиопоток на максимальную громкость, чтобы увидеть, окупится ли нормализация:
Заменить
/dev/null
сNUL
на Windows. , И аргументы , проинструктировать FFmpeg игнорировать не-аудио потоков в ходе этого анализа. Это резко ускоряет анализ.-vn
-sn
-dn
Это выведет что-то вроде следующего:
Как видите, наш максимальный уровень громкости составляет -5,0 дБ, поэтому мы можем применить усиление 5 дБ. Если вы получите значение 0 дБ, вам не нужно нормализовать звук.
Примените фильтр громкости:
Теперь мы применяем
volume
фильтр к аудиофайлу. Обратите внимание, что применение фильтра означает, что нам придется перекодировать аудиопоток. Какой кодек вы хотите для аудио, конечно, зависит от исходного формата. Вот некоторые примеры:Обычный аудиофайл: просто закодируйте файл любым нужным вам кодером:
Ваши варианты, конечно, очень широки.
Формат AVI: обычно есть аудио MP3 с видео, которое поставляется в контейнере AVI:
Здесь мы выбрали уровень качества 2. Значения варьируются от 0 до 9, и ниже означает лучше. Обратитесь к руководству MP3 VBR для получения дополнительной информации о настройке качества. Вы также можете установить фиксированный битрейт
-b:a 192k
, например.Формат MP4: в контейнере MP4 вы обычно найдете аудио AAC. Мы можем использовать встроенный кодировщик AAC в ffmpeg.
Здесь вы также можете использовать другие кодеры AAC. Некоторые из них также поддерживают VBR. Посмотрите этот ответ и руководство по кодированию AAC для некоторых советов.
В приведенных выше примерах видеопоток будет скопирован с использованием
-c:v copy
. Если во входном файле есть субтитры или несколько видеопотоков, используйте опцию-map 0
перед именем выходного файла.источник
ffmpeg-normalize
инструмент, когда вы указываете уровень 0 дБ и пиковую нормализацию.loudnorm
(или другой) фильтр:ffmpeg -i input.wav -filter:a loudnorm output.wav
Я не могу комментировать лучшее сообщение, так что это мой уродливый bash на его основе, чтобы сделать это
источник
Вот скрипт для нормализации уровня звука файлов .m4a. Будьте осторожны, если уровень звука слишком тихий, чтобы начать с. Окончательный звук может быть лучше, если вы используете что-то вроде Audacity в этом случае.
источник
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
источник