Кроссфейд много аудио файлов в один с FFmpeg?

363
setouk

Используя FFmpeg, я пытаюсь объединить много аудиофайлов в один длинный, с перекрестным затуханием между каждым из них. Для простоты, скажем, у меня есть 10 входных файлов, каждые 5 минут, и я хочу 10-секундное перекрестное затухание между каждым. (Итоговая продолжительность будет 48:30.) Предположим, что все входные файлы имеют одинаковый кодек / битрейт.

Я был приятно удивлен, обнаружив, как просто было смешать два файла:

ffmpeg -i 0.mp3 -i 1.mp3 -vn -filter_complex acrossfade=d=10:c1=tri:c2=tri out.mp3 

Но acrossfadeфильтр не позволяет 3+ входов. Поэтому мое наивное решение состоит в том, чтобы многократно запускать ffmpeg, смешивая предыдущий промежуточный вывод со следующим входным файлом. Это не идеально. Это приводит меня к двум вопросам:

1. acrossfadeКопирует ли без потерь потоки? (Конечно, за исключением случаев, когда они активно затухают.) Или все входные потоки перекодируются?

Если входные потоки полностью перекодированы, то мой наивный подход очень плох. В приведенном выше примере (вызов acrossfade9 раз) первые 4:50 первого файла будут перекодированы 9 раз! Если я объединяю 50 файлов, первый файл перекодируется 49 раз!

2. Чтобы избежать многократных запусков и проблемы перекодирования, могу ли я добиться многопереходного поведения за один ffmpegвызов?

Я предполагаю, что мне понадобится какой-то длинный фильтр-график, но я еще не понял этого. У кого-нибудь есть пример кроссфейдинга всего 3 входных файлов? Исходя из этого, я могу автоматизировать графы фильтров для более длинных цепочек.

Спасибо за любые советы!

1

1 ответ на вопрос

3
Gyan

Фильтры работают с необработанными образцами данных и выводят то же самое. Декодирование происходит до того, как данные отправляются в фильтры, а кодирование происходит после выполнения всей фильтрации. Таким образом, если фильтр не изменяет часть данных, эта часть остается неизменной.

По вашей команде вы выводите в MP3, так что это вызывает принудительное перекодирование. Вы можете избежать этого, выводя на WAV,

ffmpeg -i 0.mp3 -i 1.mp3 -vn -filter_complex acrossfade=d=10:c1=tri:c2=tri out.wav 

Вы можете выводить в MP3 во время последней команды кроссфейдера.

Вы также можете выполнить все перекрестные переходы за один звонок.

Пример с 4 файлами,

ffmpeg -i 0.mp3 -i 1.mp3 -i 2.mp3 -i 3.mp3 -vn -filter_complex "[0][1]acrossfade=d=10:c1=tri:c2=tri[a01]; [a01][2]acrossfade=d=10:c1=tri:c2=tri[a02]; [a02][3]acrossfade=d=10:c1=tri:c2=tri" out.mp3 

Похожие вопросы