Agregue dos imágenes antes de un mp4 y una al final con ffmpeg

Estoy tratando de hacer una operación usando FFmpeg con solo un comando para dejar la salida con la menor pérdida posible.

Mi intención es agregar dos imágenes, de 5 segundos cada una, antes del archivo mp4, agregar un fundido de entrada a la primera de 1 segundo y agregar una tercera imagen después del video durante 5 segundos.

¿Es posible hacer esto en un solo paso?

Encontré algunos fragmentos de código, a saber:

ffmpeg -r 25 -loop 1 -t 5 -i "image" -i "video" -f lavfi -t 5 -i aevalsrc=0 \
   -filter_complex "[0:v] [2:a] [1:v] [1:a] concat=n=2:v=1:a=1 [v] [a]" \
   -c:v libx264 -c:a aac -strict -2 -map "[v]" -map "[a]" output.mp4 

y

ffmpeg -i clip.mp4 -vf "fade=in:0:25" -acodec copy clip-out.mp4

Pero no puedo usarlos juntos y no sé si todos esos comandos son realmente necesarios. ¿Alguna idea?

¿Hacerlo en un solo comando es un requisito absoluto? De lo contrario, podría hacer primero los videos de inicio y final, luego concatenarlos con el video principal sin necesidad de volver a codificar el video principal. Si esto es aceptable, muestre la salida completa de ffmpeg -i video -i image1 -i image2 -i image3para mostrar información importante sobre cada entrada.
Hola @llogan. Solo me gustaría evitar comprimir el video principal más de una vez para mantener la mejor imagen posible, pero no es un requisito absoluto. El video y las tres imágenes son 1920x1080.Video Encoder: Lavf58.18.104 Duration: 00:01:36.48, start: 0.000000, bitrate: 4038 kb/s Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, bt709), 1920x1080 [SAR 1:1 DAR 16:9], 3907 kb/s, 24 fps, 24 tbr, 12288 tbn, 48 tbc (default) Stream #0:1(eng): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 127 kb/s (default)

Respuestas (1)

Hacer videos a partir de imágenes:

ffmpeg -loop 1 -framerate 24 -t 5 -i image0.png -loop 1 -framerate 24 -t 5 -i image1.jpg -loop 1 -framerate 24 -t 5 -i image2.jpg -f lavfi -i anullsrc=cl=stereo:r=44100 -filter_complex "[0]fade=t=in:duration=1,format=yuv420p[v0];[1]format=yuv420p[v1];[2]format=yuv420p[v2]" -map "[v0]" -map 3 -shortest pre1.mp4 -map "[v1]" -map 3 -shortest pre2.mp4 -map "[v2]" -map 3 -shortest post.mp4

Tenga en cuenta que la velocidad de fotogramas, el ancho, la altura, la relación de aspecto, el formato de píxeles, el perfil H.264, la base de tiempo, el diseño del canal de audio, la frecuencia de muestreo de audio, los tipos de transmisión y la cantidad de transmisiones de estos videos coinciden con los del video principal.

Hacer input.txt:

file 'pre1.mp4'
file 'pre2.mp4'
file 'main.mp4'
file 'post.mp4'

Concatenar con concat demuxer :

ffmpeg -f concat -i input.txt -c copy -movflags +faststart output.mp4