Как измерить громкость 5.1 аудио в FFmpeg без объединения файлов

Работа с многоканальным аудио – это всегда квест, особенно когда нужно проверить громкость для всех каналов одновременно. Представьте: у вас есть шесть отдельных WAV-файлов (левый, правый, центр, сабвуфер, левый тыловой, правый тыловой), и хочется получить сводные замеры EBU R128 без лишних телодвижений. Сейчас расскажу, как это сделать через FFmpeg, минуя этап склейки в один файл.

Подготовка файлов и понимание структуры

Первое, что нужно сделать – убедиться, что ваши stems соответствуют канонической схеме 5.1. Обычно это:

  • FL (Front Left) – левый передний
  • FR (Front Right) – правый передний
  • FC (Front Center) – центральный
  • LFE (Low-Frequency Effects) — сабвуфер
  • SL (Surround Left) – левый тыловой (иногда обозначается как Ls)
  • SR (Surround Right) – правый тыловой

Ошибка, которая ломает всё: неправильное сопоставление файлов и каналов. Например, если вы перепутаете SL и SR, замеры будут некорректными. Проверьте названия файлов дважды – лучше потратить минуту сейчас, чем час на поиск проблемы потом.

Собираем «виртуальный» 5.1 в FFmpeg

Ключевой момент здесь – фильтр join и правильная разметка каналов. Вот рабочий пример команды:

ffmpeg -i Left.wav -i Right.wav -i Center.wav -i LFE.wav -i LeftSurround.wav -i RightSurround.wav   
-filter_complex "[0][1][2][3][4][5]join=inputs=6:channel_layout='5.1(side)':map=0.0-FL|1.0-FR|2.0-FC|3.0-LFE|4.0-SL|5.0-SR,ebur128=peak=true" -f null -

Разберём важные нюансы:

  1. channel_layout=’5.1(side)’ – указывает тип расположения тыловых каналов (важно для корректной интерпретации метаданных). Если у вас back вместо side, замените значение.
  2. map=0.0-FL|1.0-FR… – здесь сопоставляем каждый входной файл с конкретным каналом. Цифры перед точкой – номер входного файла (начиная с 0), после точки – номер потока в файле (обычно 0 для моно).
  3. Фильтр ebur128 применяется уже к объединённому потоку – это критично, иначе замеры будут для отдельных каналов.

Кстати, если в консоли видите ошибку “Invalid channel layout”, проверьте:

  • Нет ли опечатки в 5.1(side) (например, пропущен апостроф или точка)
  • Соответствует ли количество каналов в join=inputs= числу переданных файлов

Совет: Чтобы убедиться, что каналы сопоставлены верно, запустите команду без фильтра ebur128 и посмотрите метаданные через ffprobe. В разделе Stream #0:0 должно быть указано 5.1(side).

Одна из частых ошибок – использование флага -map без фильтрации. FFmpeg в таком случае пытается обработать все потоки отдельно, а не как единый многоканальный аудио. Фильтр join решает эту проблему, «сшивая» каналы в виртуальный контейнер.

Если после выполнения команды вы видите замеры громкости для всех каналов – поздравляю, всё работает! Если же FFmpeg ругается на отсутствие видеопотока (да, такое бывает), добавьте флаг -vn перед -filter_complex, чтобы явно указать, что видео не требуется.

P.S. Кстати, если у вас файлы названы не как Left.wav, а, скажем, ch1.wav, ch2.wav – не забудьте поменять порядок входных файлов в команде. Порядок аргументов -i определяет нумерацию входов ([0], [1] и т.д.).

Новое
Интересное