¿Fundir muchos archivos de audio en uno con FFmpeg?

1

Con FFmpeg, estoy tratando de combinar muchos archivos de audio en uno largo, con un fundido cruzado entre cada uno de ellos. Para mantener los números simples, digamos que tengo 10 archivos de entrada, cada 5 minutos, y quiero un fundido cruzado de 10 segundos entre cada uno. (La duración resultante sería 48:30.) Suponga que todos los archivos de entrada tienen el mismo códec / velocidad de bits.

Me sorprendió gratamente descubrir lo simple que era fundir dos archivos:

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

Pero el acrossfadefiltro no permite más de 3 entradas. Entonces, mi solución ingenua es ejecutar repetidamente ffmpeg, fundiendo la salida intermedia anterior con el siguiente archivo de entrada. No es ideal Me lleva a dos preguntas:

1. ¿ acrossfadeCopia sin pérdidas las transmisiones? (Excepto donde están activamente fundiéndose, por supuesto). ¿ O se vuelven a codificar todos los flujos de entrada?

Si las secuencias de entrada se vuelven a codificar por completo, entonces mi enfoque ingenuo es muy malo. En el ejemplo anterior (llamando acrossfade9 veces), ¡las primeras 4:50 del primer archivo se volverían a codificar 9 veces! Si estoy combinando 50 archivos, ¡el primer archivo se vuelve a codificar 49 veces!

2. Para evitar múltiples ejecuciones y el problema de la recodificación, ¿puedo lograr el comportamiento de fundido múltiple en una sola ffmpegllamada?

Me imagino que necesitaría un filtro gráfico largo, pero aún no lo he descubierto. ¿Alguien tiene un ejemplo de fundido cruzado con solo 3 archivos de entrada? A partir de eso, pude automatizar los gráficos de filtro para cadenas más largas.

Gracias por cualquier consejo!

Setouk
fuente

Respuestas:

4

Los filtros funcionan con datos de muestra sin procesar y generan los mismos. La decodificación se produce antes de enviar los datos a los filtros y la codificación se produce después de que se realiza todo el filtrado. Entonces, si el filtro no modifica una porción de los datos, esa porción permanece intacta.

En su comando, está enviando a MP3, por lo que esto fuerza una nueva codificación. Puede evitar eso enviando a un WAV,

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

Puede enviar a MP3 durante el comando final de fundido cruzado.

También puede realizar todos los fundidos cruzados en una llamada.

Ejemplo con 4 archivos,

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
Gyan
fuente