¿Cómo combinar y optimizar los filtros ffmpeg para evitar la codificación varias veces?

Nunca antes trabajé con ffmpeg y me pregunto qué optimización puedo tomar para mi situación.

En un bucle, tengo varios archivos input.mp4 que primero convierto uno por uno para tener una escala y una velocidad de audio comunes con este comando:

ffmpeg -i input_01.mp4 -vf 'scale=1280:720,setdar=16/9' -ar 44100 -ac 1 input_01_tmp.mp4

Más tarde agrego imágenes a cada archivo input.mp4 nuevamente uno por uno:

ffmpeg -i input_01_tmp.mp4 -i input_01_logo.png -filter_complex "[0:v][1:v]overlay=10:10:enable='between(t,2,11)',fade=t=in:start_time=1.5:d=0.5:alpha=1,fade=t=out:start_time=10.5:d=0.5:alpha=1[fg];[0][fg]overlay=format=auto,format=yuv420p" -c:a copy input_01_unified.mp4

Finalmente, después del ciclo, los combino con mkvmerge:

mkvmerge -o output.mkv \+ input_01_unified.mp4 +\ input_02_unified.mp4 ...

Estoy seguro de que esta no es la solución óptima y me pregunto cómo debería cambiarla.

¿Es posible hacer todo esto en un solo comando? Ya sea para cada archivo o para todo el proceso.

Se puede hacer en un comando. Comparta el comando completo para el primer y segundo paso
@Gyan gracias! agregó las partes faltantes a los comandos en la pregunta

Respuestas (1)

El comando único será largo, pero aquí hay un ejemplo para 3 entradas.

ffmpeg -i input_01.mp4 -loop 1 -t 11 -i input_01_logo.png
       -i input_02.mp4 -loop 1 -t 11 -i input_02_logo.png
       -i input_03.mp4 -loop 1 -t 11 -i input_03_logo.png
       -filter_complex
        "[0]scale=1280:720,setsar=1[0v];
         [1]fade=t=in:st=1.5:d=0.5:alpha=1,fade=t=out:st=10.5:d=0.5:alpha=1[0l];
         [2]scale=1280:720,setsar=1[1v];
         [3]fade=t=in:st=1.5:d=0.5:alpha=1,fade=t=out:st=10.5:d=0.5:alpha=1[1l];
         [4]scale=1280:720,setsar=1[2v];
         [5]fade=t=in:st=1.5:d=0.5:alpha=1,fade=t=out:st=10.5:d=0.5:alpha=1[2l];
         [0v][0l]overlay=10:10:format=auto:enable='between(t,2,11)'[0vl];
         [1v][1l]overlay=10:10:format=auto:enable='between(t,2,11)'[1vl];
         [2v][2l]overlay=10:10:format=auto:enable='between(t,2,11)'[2vl];
         [0]pan=1c,aresample=r=44100[0a];
         [2]pan=1c,aresample=r=44100[1a];
         [4]pan=1c,aresample=r=44100[2a];
         [0vl][0a][1vl][1a][2vl][2a]concat=n=2:v=1:a=1[v][a]"
        -map "[v]" -map "[a]" -pix_fmt yuv420p output.mkv

Es posible que necesite comillas simples en mapfunción de su shell.

Use una versión reciente de ffmpeg, al menos 4.0

¡Gracias! Probaré esto hoy y aceptaré la respuesta. Además de ahorrar tiempo, ¿tiene esto algún efecto sobre una mejor calidad en comparación con lo que hice?
Gracias @Gyan, no lo olvidé y acepté la respuesta. Agradezco mucho su ayuda <3
Para aclarar, ¿es beneficioso combinar filtros como este? ¿Garantiza que todo se hará en una codificación, o seguirá codificando varias veces como si se ejecutara cada operación por separado?
Sí, este es el método estándar y solo realiza una operación de codificación única después de todo el filtrado.
¿Qué pasa si tenemos algunos cientos de archivos de entrada y superamos los límites de caracteres de la línea de comandos (por ejemplo, en Windows son 8192 caracteres). El "filter_complex" podría escribirse en un archivo y usar "-filter_complex_script" en su lugar. Pero, ¿qué pasa con los comandos "-loop"? ¿Hay alguna manera de "reducir" los bucles de alguna manera? ¿O otra forma de obtener el mismo resultado con una línea de comando más corta? Pregunto porque tengo este problema en especifico ahora mismo...