Mesclar muitos arquivos de áudio com posições específicas

Mesclar muitos arquivos de áudio com posições específicas

Tenho vários arquivos de áudio que representam a sessão. Então, em uma pasta eu posso ter:

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

Nome do arquivo é a data e hora em que este arquivo foi criado. Por exemplo, o primeiro arquivo foi criado em 22 de junho, às 15h59. Segunda às 16h59.

A duração do áudio pode variar, não há duração fixa. Por exemplo, o usuário pode conectar-se à sessão por 5 segundos ou 10 minutos. Portanto, a primeira duração será 00h05 e a segunda 10h.

Esses arquivos juntos representam a sessão – é por isso que eles devem ser mesclados. Você pode pensar nisso como se várias pessoas estivessem ligando para o mesmo número de telefone usado para audioconferência.

Por exemplo, Alice, Bob e John querem discutir algo. Alice está ligando para o número 555-111-22-33, e Bob está ligando para o mesmo número 1 minuto depois. Eles conversam juntos por 5 minutos. E 30 minutos depois Bob e John ligam para o mesmo número ao mesmo tempo. E então Alice entra 1 minuto depois.

Portanto, neste caso, temos vários fluxos de áudio. Esses fluxos geralmente se sobrepõem, mas nem sempre. Por exemplo, quando Alice está esperando pelo Bob logo no início, já estamos gravando ela, e não há mais ninguém nesta sessão, então esse fluxo de áudio não se sobrepõe a outros.

Estou procurando a melhor maneira de mesclar as gravações de áudio de cada pessoa em um único arquivo. Portanto, neste arquivo devemos ouvir todos. E entre as ligações, quando Alice, Bob e John não estão na sessão, deve haver apenas silêncio.

Estou olhando o documento ffmpeg e não consigo encontrar opções que possam ser usadas para criar fluxos sobrepostos e especificar a hora exata em que o fluxo deve começar.

Vocês sabem qual seria a melhor maneira de fazer isso? Talvez eu precise de ferramentas melhores do que apenas ffmpeg, talvez eu só precise usar bibliotecas e linguagens de programação para criar meu próprio programa para fazer isso? Obrigado

Responder1

Vamos atribuir o tempo relativo do início do primeiro áudio como t=0. Portanto, se a primeira gravação de áudio começou às 16:59:23e a terceira gravação começou às 17:14:13, então o horário de início relativo da terceira será 14:50.

Com isso em mente, a estrutura básica de comando é

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

O que o comando faz é atrasar o início relativo de cada arquivo de áudio, exceto o primeiro, para corresponder aos horários de início relativos da vida real. Em seguida, todos os fluxos de áudio atrasados ​​são mixados. O amixfiltro insere silêncio onde necessário.

adelayrequer valor em milissegundos, então 3 minutos e 4 segundos são 184 segundos é 184000ms. Um valor deve ser fornecido para cada canal de um fluxo de áudio, portanto, se você estiver lidando com fluxos mono, essa [1]adelay=184000[b]é a sintaxe.

informação relacionada