Вариант 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
перед именем выходного файла.