Crossfade muitos arquivos de áudio em um com FFmpeg?

1

Usando o FFmpeg, estou tentando combinar muitos arquivos de áudio em um longo, com um crossfade entre cada um deles. Para manter os números simples, digamos que eu tenha 10 arquivos de entrada, a cada 5 minutos, e quero um crossfade de 10 segundos entre eles. (A duração resultante seria 48:30.) Suponha que todos os arquivos de entrada tenham o mesmo codec / bitrate.

Eu fiquei agradavelmente surpreso ao descobrir como era simples cruzar dois arquivos:

ffmpeg -i 0.mp3 -i 1.mp3 -vn -filter_complex acrossfade=d=10:c1=tri:c2=tri out.mp3

Mas o filtro acrossfade não permite 3 + entradas. Então, minha solução ingênua é executar repetidamente ffmpeg , cruzar a saída intermediária anterior com o próximo arquivo de entrada. Não é ideal. Isso me leva a duas questões:

1. O acrossfade copia sem perda os fluxos? (exceto onde eles estão ativamente em crossfading, é claro). Ou os streams de entrada são reencodidos?

Se os fluxos de entrada são totalmente reencodificados, então minha abordagem ingênua é muito ruim. No exemplo acima (chamando acrossfade 9 vezes), os primeiros 4:50 do primeiro arquivo seriam reencodificados 9 vezes! Se eu estiver combinando 50 arquivos, o primeiro arquivo será reencodificado 49 vezes!

2. Para evitar várias execuções e o problema de reencodificação, posso alcançar o comportamento de vários crossfades em uma única chamada ffmpeg ?

Eu imagino que precisaria de algum filtro de tempo longo, mas ainda não descobri. Alguém tem um exemplo de crossfading apenas 3 arquivos de entrada? A partir disso, consegui automatizar os filtros para cadeias mais longas.

Obrigado por qualquer dica!

    
por setouk 03.10.2018 / 05:50

1 resposta

3

Os filtros funcionam com dados de amostra brutos e produzem o mesmo. A decodificação ocorre antes que os dados sejam enviados para os filtros e a codificação ocorre após a conclusão de toda a filtragem. Portanto, se o filtro não modificar uma parte dos dados, essa parte permanecerá intacta.

Em seu comando, você está enviando para MP3, então isso força uma nova codificação. Você pode evitar isso enviando para um WAV,

ffmpeg -i 0.mp3 -i 1.mp3 -vn -filter_complex acrossfade=d=10:c1=tri:c2=tri out.wav

Você pode enviar para MP3 durante o comando final de crossfade.

Você também pode realizar todos os crossfades em uma chamada.

Exemplo com 4 arquivos,

ffmpeg -i 0.mp3 -i 1.mp3 -i 2.mp3 -i 3.mp3 -vn
       -filter_complex "[0][1]acrossfade=d=10:c1=tri:c2=tri[a01];
                        [a01][2]acrossfade=d=10:c1=tri:c2=tri[a02];
                        [a02][3]acrossfade=d=10:c1=tri:c2=tri"
       out.mp3
    
por 03.10.2018 / 06:39