Вопрос или проблема
Я пытаюсь использовать фильтр loudnorm из ffmpeg, чтобы стандартизировать группу фильмов до одного уровня громкости.
Моя цель: интегрированная громкость -23 LUFS, максимальный истинный пик -1 dB.
Моя задача — привести все фильмы к одному уровню громкости и ограничить любые высокие пики, которые превысят 0 dB (и, таким образом, вызовут искажения), если просто увеличить уровень громкости.
Например, если входной файл имеет -28 LUFS, но истинный пик на уровне -2 dB: чтобы достичь желаемого эффекта, он должен быть лимитирован до -6 dB, а затем увеличен на +5 dB.
Насколько я понимаю, именно для этого и предназначен фильтр loudnorm.
Однако проблема, с которой я сталкиваюсь, заключается в том, что loudnorm также требует указания целевого диапазона громкости (или использует значение по умолчанию, если вы его не укажете).
В моем случае мне не важен диапазон громкости. Некоторые файлы будут иметь более широкий динамический диапазон, чем другие, и это нормально. Я просто хочу достичь интегрированной громкости и максимального истинного пика. Но я не могу избежать того, что loudnorm также учитывает целевой диапазон.
Я пробовал использовать различные значения диапазона.
-
Высокое значение диапазона громкости не увеличивает LUFS, так как, похоже, приоритетом является сохранение широкого диапазона.
-
Низкое значение диапазона достигает желаемых LUFS и максимального истинного пика, но часто превышает это и сильно сжимает динамический диапазон.
Есть ли способ это осуществить?
Фильтр loudnorm
из ffmpeg использует измерение LRA (диапазона громкости), чтобы поддерживать уровень вашего аудио постоянным на протяжении всего его времени. Для большинства музыки “тихие” и “громкие” части не слишком отличаются по громкости, поэтому можно использовать “линейную коррекцию”, чтобы сделать так, чтобы аудио достигало желаемых целевых значений I
/ TP
.
Но! Если измеренный диапазон слишком высок — громкость вашего аудио сильно варьируется между “очень тихими” и “очень громкими” частями (например, целый фильм или “1812 год с пушечным залпом”)… это указывает на то, что никакое линейное изменение уровней громкости не позволит аудио достичь постоянного диапазона громкости. Если фильтр понизит уровень всего трека, тихие части будут СЛИШКОМ тихими, но если сделать тихие части достаточно громкими, самые громкие части будут искажать звук.
В этом случае loudnorm
переключается в “динамический” режим, который времязависим, т.е. измерения и корректировки проводятся по частям файла, а не по постоянному изменению по всему файлу. Это изменит ваш аудиофайл относительно самого себя! Он сделает тихие части громче, а громкие части тише до тех пор, пока выходной LRA не окажется в желаемом диапазоне. Другими словами, он жертвует динамическим диапазоном записи для достижения согласованности.
Вы можете увидеть с помощью print_format=summary
или print_format=json
, какой метод был использован. Если указано “динамический” вместо “линейного”, значит, вы используете только один проход, или:
Целевой LRA не должен быть ниже исходного LRA, и изменение интегрированной громкости не должно приводить к истинному пику, который превышает целевой TP. Если одно из этих условий не выполнено, режим нормализации вернется в динамический.
Согласно документации ffmpeg, вы можете установить максимальный допустимый LRA, и фильтр вернется в “динамический” режим, только если измеренное значение превысит это:
LRA, lra
Установите целевой диапазон громкости. Диапазон от 1.0 до 50.0. Значение по умолчанию равно 7.0.
Так что, чтобы ответить на ваш вопрос: вы должны использовать что-то вроде настроек с двумя проходами, описанных в этом другом ответе, за исключением того, что вы должны установить целевой LRA равным измеренному LRA из первого прохода. Например, мой input_LRA для одного трека был 7.4, следовательно,
ffmpeg -i input.wav -filter:a loudnorm=linear=true:i=-23:tp=-1:lra=7.4:measured_I=...
и это смогло получить
[Parsed_loudnorm_0 @ 0x2d3094c53840]
Input Integrated: -8.1 LUFS
Input True Peak: +0.0 dBTP
Input LRA: 7.4 LU
Input Threshold: -18.4 LUFS
Output Integrated: -24.0 LUFS
Output True Peak: -15.8 dBTP
Output LRA: 7.4 LU
Output Threshold: -34.2 LUFS
Normalization Type: Linear
Target Offset: -0.0 LU
(если ваше измеренное значение LRA превышает 50 LUFS, тогда вам не повезло, похоже.)
Ответ или решение
Для достижения цели по стандартизации уровня громкости фильтром loudnorm
в FFmpeg существует несколько нюансов, которые следует учесть. Этот фильтр действительно предназначен для нормализации громкости в аудиофайлах, учитывая интегрированную громкость и истинные пики, однако его поведение также зависит от диапазона громкости (LRA).
Если вы хотите стандартизировать фильмы до уровня интегрированной громкости -23 LUFS с максимальным истинным пиком -1 dB, в то время как вас не интересует диапазон громкости, вы можете использовать следующую стратегию:
Двухпроходный метод (2-pass):
-
Первый проход: Измерьте параметры звукового файла, включая интегрированную громкость (I), истинный пик (TP) и диапазон громкости (LRA), не применяя никаких изменений:
ffmpeg -i input.wav -filter:a loudnorm=print_format=summary -f null -
Эта команда не создаст выходной файл, но даст вам необходимые значения для дальнейших шагов.
-
Второй проход: Используйте значения, полученные из первого прохода, чтобы нормализовать громкость, при этом установив значение LRA, равное измеренному значению. Например, если вы получили LRA равным 7.4:
ffmpeg -i input.wav -filter:a loudnorm=linear=true:i=-23:tp=-1:lra=7.4:measured_I=...:measured_LRA=...:measured_tp=... -ar 48000 output.wav
Замените
...
на соответствующие измеренные значения первого прохода. Использование фиксированного LRA, который соответствует вашим исходным данным, позволит фильтру преобразовать звук, не теряя его динамического диапазона.
Общие рекомендации:
- Если LRA превышает 50 LUFS, вам, вероятно, придется рассмотреть другой подход к нормализации, так как фильтр не сможет адекватно обработать такие параметры.
- Помните, что при его настройке всегда важно следить за сохранением динамики, чтобы избежать чрезмерной компрессии звука.
- Если вы намеренно игнорируете диапазон громкости, вы рискуете создать ситуации, когда неравномерные уровни громкости могут привести к нежелательным искажениям, поэтому стараетесь всегда контролировать этот параметр.
Следуя этим шагам, вы сможете эффективно использовать фильтр loudnorm
для стандартизации громкости вашего аудиоконтента, даже если динамический диапазон не является вашим приоритетом.