Я хотел бы эффективно объединить несколько транспортных файлов в файл m4a. Это означает сегментацию файлов, перекрестное затухание 3 секунд в начале/конце последовательных транспортных файлов, затем объединение подмножеств и новых перекрестных перекрытий вместе, чтобы свести к минимуму декодирование/повторное кодирование.
Гьян предлагает решение, которое корректно затухает список аудиофайлов. Я смог изменить эту программу, чтобы создать правильный выходной файл m4a для моих целей. Однако это требует перекодирования всего аудиофайла. Для перекрестного затухания 10 аудиофайлов (длиной от 3 до 5 минут каждый) это решение работает в течение 8-12 секунд, что не соответствует критериям для подачи этого звука в моем случае использования в реальном времени / в прямом эфире.
Чтобы избежать этого узкого места декодирования/перекодирования, я написал программу для сегментации каждого транспортного файла, перекрестного затухания перекрытий, а затем объединения всех соответствующих компонентов. Эта программа запускается в течение 1-2 секунд для описанного выше случая с 10 аудиофайлами, что соответствует моему варианту использования в реальном времени.
Ниже приведена сокращенная версия, которая объединяет два 10-секундных транспортных файла (a.ts
, b.ts
). Эти файлы закодированы в формате AAC, в монофоническом режиме и содержат синусоидальные сохранения на разных частотах.
ffmpeg -i a.ts -map 0 -f segment -segment_times 7 -c:a copy a_%d.ts
ffmpeg -i b.ts -map 0 -f segment -segment_times 3 -c:a copy b_%d.ts
ffmpeg -i a_1.ts -i b_0.ts -filter_complex acrossfade=d=3:c1=qua:c2=qua xfade.m4a
ffmpeg -i xfade.m4a -c:a copy xfade.ts
ffmpeg -i "concat:a_0.ts|xfade.ts|b_1.ts" -c:a copy out.m4a
Обратите внимание, что перекрестное затухание двух перекрывающихся трехсекундных файлов (a_1.ts
и b_0.ts
) требует записи в .m4a, а затем обратного преобразования в .ts. Попытка кроссфейда -> .ts или объединения файлов .ts и .m4a привела к невоспроизводимому звуку или отсутствию звука в файле out.m4a
.
Эта программа создает почти правильный звуковой файл (17 секунд звука, 3 секунды перехода между двумя файлами). Ниже приведено изображение формы волны. Вверху показана форма волны, созданная обычным кроссфейдом, с кодированием всех файлов (решение Гьяна) для сравнения. Дно производится моей программой.
Обратите внимание, что на границах кроссфейда появляются «артефакты». Эти небольшие промежутки вызывают «падение» громкости аудиофайла в начале кроссфейда, а в конце кроссфейда слышен щелчок. Эти артефакты НЕ присутствуют для обычного, неэффективного кроссфейда.
Мои вопросы:
- Что является причиной появления этих артефактов?
- Изучение формы волны
xfade.m4a
показывает, что к началу добавлено небольшое нарастание, но в документации ffmpeg это не упоминается. Является ли это следствием мультиплексирования/демультиплексирования при преобразовании между .ts/.m4a? - Это дополнительное увеличение не учитывает клип в конце. Вводит ли эта конкатенация артефакты в эти файлы .ts?
Спасибо всем, кто это читает.
РЕДАКТИРОВАТЬ: я должен добавить, что эти артефакты присутствуют независимо от того, какое время сегмента/аудиофайлы используются в качестве входных данных. Артефакты также кажутся детерминированными; они также появляются в одно и то же время для одних и тех же входных данных.