4

У меня есть несколько аудио файлов, которые представляют сессию. Так что в одной папке у меня может быть:

2016-06-22-15-59-59-000.mka
2016-06-22-16-59-59-001.mka
2016-06-22-17-59-59-002.mka

Имя файла - это дата и время, когда этот файл был создан. Например, первый файл был создан 22 июня в 15:59. Второй в 16:59.

Продолжительность звука может отличаться, фиксированной длительности нет. Например, пользователь может подключиться к сеансу за 5 секунд или за 10 минут. Таким образом, первая продолжительность будет 00:05, а вторая 10:00.

Эти файлы вместе представляют сессию - поэтому они должны быть объединены. Вы можете думать об этом, поскольку несколько человек звонят по одному и тому же номеру телефона, который используется для аудиоконференции.

Например, Алиса, Боб и Джон хотят что-то обсудить. Алиса звонит на номер 555-111-22-33, а Боб звонит на тот же номер через 1 минуту. Они разговаривают вместе в течение 5 минут. И через 30 минут Боб и Джон звонят на один и тот же номер одновременно. А потом Алиса присоединяется через 1 минуту.

Так что в этом случае у нас есть несколько аудиопотоков. Эти потоки обычно перекрываются, но не всегда. Например, когда Алиса ждет Боба в самом начале, мы уже записываем ее, и в этом сеансе больше никого нет, поэтому этот аудиопоток не перекрывается с другими.

Я ищу лучший способ объединить аудиозаписи каждого человека в один файл. Так что в этом файле мы должны услышать всех. И между звонками, когда Алиса, Боб и Джон не находятся на сессии, должна быть просто тишина.

Я смотрю на ffmpeg doc и не могу найти опции, которые я могу использовать для создания перекрывающихся потоков, и указать точное время, когда поток должен начаться.

Ребята, вы знаете, как лучше всего это сделать? Может быть, мне нужны лучшие инструменты, чем просто ffmpeg, может, мне просто нужно использовать библиотеки и язык программирования, чтобы создать собственную программу для этого? Спасибо

1 ответ1

7

Давайте назначим относительное время начала первого аудио как t=0 . Итак, если первая аудиозапись началась в 16:59:23 а третья запись началась в 17:14:13 , то относительное время начала третьего - 14:50 .

Имея это в виду, основная структура команд

ffmpeg -i first.mka -i second.mka -i third.mka -i fourth.mka
       -filter_complex
         "[1]adelay=184000|184000[b];
          [2]adelay=360000|360000[c];
          [3]adelay=962000|962000[d];
          [0][b][c][d]amix=4"
merged.mka

Эта команда задерживает относительный запуск каждого аудиофайла, кроме первого, соответствующего реальным относительным временам начала. Затем все задержанные аудиопотоки смешиваются вместе. Фильтр amix вставляет тишину, где это необходимо.

adelay требует значения в миллисекундах, поэтому 3 минуты, 4 секунды, 184 секунды, это 184000 мс. Необходимо указать значение для каждого канала аудиопотока, поэтому, если вы имеете дело с монопотоками, то синтаксис [1]adelay=184000[b] .

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