FFmpeg - Concatenando arquivos de áudio com espaçamento

2

Por favor, veja a imagem:

Cadaclipedeáudiotemomesmocodec/sample_rate,mastemduraçãodiferenteecadaespaçotambémédiferente.Hásempreespaçoentreosclipes,semsobreposição.Portanto,nãohámotivoparareencoding,jáqueesteébasicamenteumtrabalhodecópiadefluxo.Éimportanteporqueeudevopreservaraqualidadeoriginaldecadaclipe.

Agora,vamospensarqueencontreioqueprocurava.Eudeiaessecomandoumpseudonome"- start_at" , ele insere o clipe no fluxo de áudio em um determinado momento. Com esse pseudo comando, eu definirei o tempo que cada clipe deve começar. E o resto do trabalho deve ser feito pelo comando ffmpeg / filter / script etc.

ffmpeg -start_at 00.00 -i audio1.opus  -start_at 06.30 -i audio2.opus  -start_at 21.15 -i audio3.opus  -start_at 26.35 -i audio4.opus

Apenas pense que o ffmpeg preencherá automaticamente as lacunas com sons silenciosos.

Então, existe um comando / filtro ffmpeg para isso? Ou um ffmpeg gui / script etc??

    
por dandidondi 23.06.2015 / 07:02

2 respostas

4

O FFmpeg é capaz de lidar com isso. O que você precisa usar é filter_complex com o encadeamento do filtro. Você pode criar um áudio silencioso com aevalsrc . Para criar um áudio silencioso de 5 segundos,

aevalsrc=0:d=5

Portanto, o comando a seguir funcionará para você.

ffmpeg -i input_audio_1 -i input_audio_2 -i input_audio_3 -filter_complex "
aevalsrc=0:d=10[s1];
aevalsrc=0:d=15[s2];
aevalsrc=0:d=20[s3];
[s2][1:a]concat=n=2:v=0:a=1[ac1];
[s3][2:a]concat=n=2:v=0:a=1[ac2];
[0:a][s1][ac1][ac2]amix=inputs=4[aout]" -map [aout] output_audio

Aqui eu assumi que cada áudio tem um comprimento de 5 segundos e a recodificação é opcional,

-c:a libmp3lame -ac 2 -b:a 128k

Como amix causa a sobreposição de áudios, acrescentei um áudio silencioso a cada áudio de entrada. Você também pode tentar amerge e adelay onde o próprio documento tem uma explicação clara.

Espero que isso ajude você!

    
por 23.06.2015 / 07:35
1

Aqui está o exemplo de concat de áudio:

ffmpeg -y -f s16be -i /dev/zero -af "[in]anullsink;amovie=1.wav[a1];amovie=silence.wav[a2];amovie=2.wav[a3];amovie=4.wav[a4];[a1][a2][a3][a4]concat=n=4:v=0:a=1[out]" -shortest -t 12 output.wav

Observe algumas coisas que você precisa saber aqui:

  1. Eu comecei com uma entrada limpa /dev/zero , é legal, ainda, pode haver uma maneira melhor de fazer isso.
  2. Você precisa saber a duração total do clipe antes de criá-lo ( t=12 )
  3. Eu pré-criei o arquivo silence.wav . Você pode usar filtros como anullsrc (consulte nb_samples na documentação ) ou outro, mas este é muito chato se você me perguntar.
  4. Às vezes, ao usar essa abordagem, o FFmpeg não sabe quando parar e, no entanto, não criará uma trilha de silêncio vazio, pois o -shortest param é aplicado.
por 23.06.2015 / 08:00