Работа с многоканальным аудио – это всегда квест, особенно когда нужно проверить громкость для всех каналов одновременно. Представьте: у вас есть шесть отдельных 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 -
Разберём важные нюансы:
- channel_layout=’5.1(side)’ – указывает тип расположения тыловых каналов (важно для корректной интерпретации метаданных). Если у вас back вместо side, замените значение.
- map=0.0-FL|1.0-FR… – здесь сопоставляем каждый входной файл с конкретным каналом. Цифры перед точкой – номер входного файла (начиная с 0), после точки – номер потока в файле (обычно 0 для моно).
- Фильтр
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] и т.д.).