Эффективное объединение и перекрестное затухание файлов .ts с помощью FFMPEG

Я хотел бы эффективно объединить несколько транспортных файлов в файл 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?

Спасибо всем, кто это читает.

РЕДАКТИРОВАТЬ: я должен добавить, что эти артефакты присутствуют независимо от того, какое время сегмента/аудиофайлы используются в качестве входных данных. Артефакты также кажутся детерминированными; они также появляются в одно и то же время для одних и тех же входных данных.


person dooman    schedule 10.09.2019    source источник


Ответы (1)


Аудиокодеры используют нечто, называемое «резервуаром битов». Это означает, что отдельные кадры не могут быть объединены, поскольку им могут потребоваться биты из резервуара в другом кадре. Для запуска процесса некоторые кодеки используют то, что называется предварительными образцами. Эти образцы составляют макетную раму для заливки резервуара долота. Короче говоря, бесшовное объединение звука означает, что предыдущий кадр и следующий кадр ДОЛЖНЫ согласовываться с состоянием и содержимым резервуара. Существуют методы решения этой проблемы, но ВСЕ они требуют перекодирования.

Пробелы в вашем примере — это потерянные биты в резервуаре, который вы отключили, и/или образцы заполнения нового кодирования.

TLDR. Ты СОЛ.

person szatmary    schedule 10.09.2019
comment
Благодарю вас! Есть ли у вас рекомендуемые ресурсы (онлайн-документы, учебники и т. д.), где я мог бы ответить на подобные вопросы в будущем? - person dooman; 07.11.2019