Inmersión/fundido a negro

Inmersión/fundido a negro

Con 5 imágenes tengo que crear un video de 60 segundos en ffmpeg, cada imagen tiene que mostrarse durante 15 segundos. después de 15 segundos, la primera imagen tiene que desaparecer y la segunda imagen tiene que aparecer, después de esa segunda imagen tiene que desaparecer, la tercera imagen tiene que aparecer, etc. Guíeme sobre cómo puedo lograr esto usando los comandos ffmpeg.

Respuesta1

Inmersión/fundido a negro

Desplácese hacia abajo para ver el método de fundido cruzado.

ejemplo de desvanecimiento

Ejemplo donde cada imagen se muestra durante 5 segundos y cada una tiene un desvanecimiento que dura 1 segundo.Cada entrada de imagen tiene el mismo ancho, alto y relación de aspecto de muestra.Si varían en tamaño, consulte el ejemplo n.° 3 a continuación.

salida MP4

ffmpeg \
-loop 1 -t 5 -i input0.png \
-loop 1 -t 5 -i input1.png \
-loop 1 -t 5 -i input2.png \
-loop 1 -t 5 -i input3.png \
-loop 1 -t 5 -i input4.png \
-filter_complex \
"[0:v]fade=t=out:st=4:d=1[v0]; \
 [1:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v1]; \
 [2:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v2]; \
 [3:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v3]; \
 [4:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v4]; \
 [v0][v1][v2][v3][v4]concat=n=5:v=1:a=0,format=yuv420p[v]" -map "[v]" out.mp4

Con audio

Igual que el anterior pero con audio:

ffmpeg \
-loop 1 -t 5 -i input0.png \
-loop 1 -t 5 -i input1.png \
-loop 1 -t 5 -i input2.png \
-loop 1 -t 5 -i input3.png \
-loop 1 -t 5 -i input4.png \
-i audio.m4a \
-filter_complex \
"[0:v]fade=t=out:st=4:d=1[v0]; \
 [1:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v1]; \
 [2:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v2]; \
 [3:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v3]; \
 [4:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v4]; \
 [v0][v1][v2][v3][v4]concat=n=5:v=1:a=0,format=yuv420p[v]" -map "[v]" -map 5:a -shortest out.mp4

Para imágenes de entrada con tamaños variables o arbitrarios

Como el primer ejemplo, pero con imágenes de entrada que varían en ancho x alto. Estarán acolchados para que quepan dentro de una caja de 1280x720:

ffmpeg \
-loop 1 -t 5 -i input0.png \
-loop 1 -t 5 -i input1.png \
-loop 1 -t 5 -i input2.png \
-loop 1 -t 5 -i input3.png \
-loop 1 -t 5 -i input4.png \
-filter_complex \
"[0:v]scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2,setsar=1,fade=t=out:st=4:d=1[v0]; \
 [1:v]scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2,setsar=1,fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v1]; \
 [2:v]scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2,setsar=1,fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v2]; \
 [3:v]scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2,setsar=1,fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v3]; \
 [4:v]scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2,setsar=1,fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v4]; \
 [v0][v1][v2][v3][v4]concat=n=5:v=1:a=0,format=yuv420p[v]" -map "[v]" out.mp4

Vea los ejemplos enCambiar el tamaño de los videos para que quepan en un reproductor de tamaño estáticosi desea recortar (llenar la pantalla) en lugar de rellenar (buzón/pilar), o si desea evitar la ampliación.

Salida GIF

Agrega los filtros de¿Cómo convierto un video a GIF usando ffmpeg, con una calidad razonable?

ffmpeg \
-framerate 10 -loop 1 -t 5 -i input0.png \
-framerate 10 -loop 1 -t 5 -i input1.png \
-framerate 10 -loop 1 -t 5 -i input2.png \
-framerate 10 -loop 1 -t 5 -i input3.png \
-framerate 10 -loop 1 -t 5 -i input4.png \
-filter_complex \
"[0:v]fade=t=out:st=4:d=1[v0]; \
 [1:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v1]; \
 [2:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v2]; \
 [3:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v3]; \
 [4:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v4]; \
 [v0][v1][v2][v3][v4]concat=n=5:v=1:a=0,split[v0][v1]; \
 [v0]palettegen[p];[v1][p]paletteuse[v]" -map "[v]" out.gif

Utilice la -loopopción de salida para controlar la cantidad de veces que se repite el GIF. El valor predeterminado es un bucle infinito si no se utiliza esta opción. Un valor de -1no es un bucle.

Opciones y filtros utilizados:

  • -tpara establecer la duración en segundos de cada entrada.

  • -loop 1repite la imagen, de lo contrario tendría una duración de 1 fotograma.

  • -frameratepara establecer la velocidad de fotogramas de la imagen de entrada (el valor predeterminado cuando no se declara es 25). Útil para hacer GIF.

  • escalaconalmohadillapara ajustar las imágenes de entrada a un tamaño específico y uniforme (usado en el ejemplo n.° 3).

  • desteñirpara aparecer y desaparecer. des la duración del desvanecimiento. stes cuando empieza.

  • concatpara concatenar (o "unir") cada imagen.

  • formatopara generar un esquema de submuestreo de croma que sea compatible con reproductores que no estén basados ​​en FFmpeg si genera MP4 y codifica con libx264 (el codificador predeterminado para salida MP4 si su compilación lo admite).

  • dividirpara hacer copias de una salida de filtro. Necesario por los filtros de la paleta* para hacer todo con un solo comando.

  • paletagenyuso de paletapor hacer un GIF bonito.


fundido cruzado

ejemplo de fundido cruzado

Ejemplo donde cada imagen se muestra durante 5 segundos y cada una tiene un fundido cruzado que dura 1 segundo.Cada entrada de imagen tiene el mismo ancho, alto y relación de aspecto de muestra.Si varían en tamaño, adapte el ejemplo n.° 3 anterior.

salida MP4

ffmpeg \
-loop 1 -t 5 -i 1.png \
-loop 1 -t 5 -i 2.png \
-loop 1 -t 5 -i 3.png \
-loop 1 -t 5 -i 4.png \
-loop 1 -t 5 -i 5.png \
-filter_complex \
"[1]format=yuva444p,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+4/TB[f0]; \
 [2]format=yuva444p,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+8/TB[f1]; \
 [3]format=yuva444p,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+12/TB[f2]; \
 [4]format=yuva444p,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+16/TB[f3]; \
 [0][f0]overlay[bg1];[bg1][f1]overlay[bg2];[bg2][f2]overlay[bg3]; \
 [bg3][f3]overlay,format=yuv420p[v]" -map "[v]" -movflags +faststart out.mp4

Con audio

ffmpeg \
-loop 1 -t 5 -i 1.png \
-loop 1 -t 5 -i 2.png \
-loop 1 -t 5 -i 3.png \
-loop 1 -t 5 -i 4.png \
-loop 1 -t 5 -i 5.png \
-i music.mp3 \
-filter_complex \
"[1]format=yuva444p,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+4/TB[f0]; \
 [2]format=yuva444p,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+8/TB[f1]; \
 [3]format=yuva444p,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+12/TB[f2]; \
 [4]format=yuva444p,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+16/TB[f3]; \
 [0][f0]overlay[bg1];[bg1][f1]overlay[bg2];[bg2][f2]overlay[bg3]; \
 [bg3][f3]overlay,format=yuv420p[v]" -map "[v]" -map 5:a -shortest -movflags +faststart out.mp4

Fundido cruzado entre dos vídeos con audio

Seleccione un segmento de 5 segundos de cada entrada y agregue un fundido cruzado de 1 segundo:

ffmpeg -i input0.mp4 -i input1.mp4 -filter_complex \
"[0:v]trim=start=5:end=10,setpts=PTS-STARTPTS[v0];
 [1:v]trim=start=12:end=17,setpts=PTS-STARTPTS+4/TB,format=yuva444p,fade=st=4:d=1:t=in:alpha=1[v1];
 [v0][v1]overlay,format=yuv420p[v];
 [0:a]atrim=start=5:end=10,asetpts=PTS-STARTPTS[a0];
 [1:a]atrim=start=12:end=17,asetpts=PTS-STARTPTS[a1];
 [a0][a1]acrossfade=d=1[a]" \
-map "[v]" -map "[a]" output.mp4

Salida GIF

ffmpeg \
-framerate 10 -loop 1 -t 5 -i 1.png \
-framerate 10 -loop 1 -t 5 -i 2.png \
-framerate 10 -loop 1 -t 5 -i 3.png \
-framerate 10 -loop 1 -t 5 -i 4.png \
-framerate 10 -loop 1 -t 5 -i 5.png \
-filter_complex \
"[1]format=rgba,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+4/TB[f0]; \
 [2]format=rgba,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+8/TB[f1]; \
 [3]format=rgba,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+12/TB[f2]; \
 [4]format=rgba,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+16/TB[f3]; \
 [0][f0]overlay[bg1];[bg1][f1]overlay[bg2];[bg2][f2]overlay[bg3];[bg3][f3]overlay,split[v0][v1]; \
 [v0]palettegen[p];[v1][p]paletteuse[v]" -map "[v]" out.gif

Utilice la -loopopción de salida para controlar la cantidad de veces que se repite el GIF. El valor predeterminado es un bucle infinito si no se utiliza esta opción. Un valor de -1no es un bucle.

Respuesta2

Escribí un script bash general que toma una ruta haciauna carpeta de imágenesy genera un video fundido con ffmpeg:

https://gist.github.com/anguyen8/d0630b6aef6c1cd79b9a1341e88a573e

Básicamente, el script mira las imágenes en una carpeta e imprime un comando similar a la respuesta de @Lordneckbeard anterior y ejecuta el comando. Este script ayuda cuando tienes muchas imágenes en una carpeta y no quieres escribir manualmente un comando deprimentemente largo.

información relacionada