Объединить множество аудиофайлов с определенными позициями

Объединить множество аудиофайлов с определенными позициями

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

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 и не могу найти параметры, которые можно использовать для создания перекрывающихся потоков и указания точного времени начала потока.

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

решение1

Давайте назначим относительное время начала первой аудиозаписи как 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]синтаксис такой.

Связанный контент