Представьте: вам нужно собрать видео с пятью аудиодорожками, каждая из которых должна включаться с определённой задержкой. Первый трек играет сразу, второй – через 2 секунды, третий – через 12, и так далее. Казалось бы, FFmpeg с его фильтрами идеально подходит для этой задачи… Но когда вы запускаете команду, слышен только первый аудиопоток, а остальные mysteriously исчезают. Знакомо? Давайте разбираться, как заставить это работать.
Подготовка аудиодорожек: задержки и синхронизация
Ключевая ошибка – некорректное использование фильтра adelay. Этот фильтр требует указать задержку для каждого канала отдельно (например, adelay=1000|1000
для стерео). Если пропустить второй параметр, FFmpeg может проигнорировать поток целиком. Вот правильный вариант:
[1:a]adelay=0|0:all=1[a1];
[2:a]adelay=192000|192000:all=1[a2];
... (и так для всех входов)
Но даже это не всегда решает проблему. Если задержка превышает длительность исходного аудио, FFmpeg обрежет поток до его фактического конца. Чтобы избежать тишины в финальном миксе, нужно добавить «молчание» в начало каждого трека. Для этого можно использовать apad или предварительно генерировать silent-аудио нужной длины (кстати, это особенно полезно, если исходные файлы имеют разную длительность).
Микширование аудиопотоков без потерь
Фильтр amix объединяет аудиодорожки, но его параметр duration=first
заставляет результирующий трек длиться столько же, сколько первый вход. Если ваш первый аудиофайл короче остальных, это приведёт к обрезке всех остальных дорожек. В исходном примере cameraVoip_13_4.flv
длится 3 минуты – поэтому финальное видео становилось silent после этого времени.
Решение:
- Убедитесь, что все аудиопотоки достаточно длинные (добавьте silence через
apad
). - Используйте
duration=longest
вместоfirst
, если хотите сохранить самую длинную дорожку. - Проверьте, что задержки не превышают длительность исходников (можно через
ffprobe
).
Пример рабочего микширования:
[a1][a2][a3][a4][a5]amix=inputs=5:duration=longest[aout]
Практические советы и частые ошибки
- Порядок входных файлов имеет значение. В команде
-i output_na.mp4 -i file1 -i file2...
индексы аудиопотоков начинаются с[1:a]
,[2:a]
и т.д. Перепутали порядок — получите не те задержки. - Формат задержки. Значения в
adelay
указываются в миллисекундах, но иногда разработчики путают их с секундами (для перевода: 1 сек = 1000 мс). - Кодеки и битрейт. Если итоговое аудио «захлёбывается», попробуйте сменить кодек на
libopus
или увеличить битрейт (-b:a 320k
).
Таблица типичных ошибок:
Нет звука после микширования | Проверьте параметры adelay и длительность дорожек |
Искажения в аудио | Убедитесь, что все исходники имеют одинаковую частоту дискретизации (используйте aresample ) |
FFmpeg «зависает» при рендере | Добавьте флаг -threads 2 для ограничения потоков CPU |
И напоследок лайфхак: если нужно визуально отладить задержки, экспортируйте аудио отдельно через -map [aout]
и откройте в Audacity. Там отлично видно, где начинаются и заканчиваются треки. А если времени совсем в обрез, попробуйте утилиту FFmpeg Audio Merger – она упрощает построение сложных фильтров через GUI.
P.S. Не забывайте делать бэкапы исходников перед обработкой. Одна опечатка в параметрах – и можно случайно перезаписать файл (спасибо флагу -y
за неожиданные сюрпризы!).