1

Используя 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 ли без потерь без потерь потоки? (За исключением случаев, когда они активно затухают, конечно.) Или все входные потоки перекодируются?

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

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

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

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

1 ответ1

4

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

По вашей команде вы выводите в 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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .