fundido cruzado entre 2 videos usando ffmpeg


27

He estado tratando de lograr una transición de fundido cruzado entre 2 videoclips usando ffmpeg, pero hasta ahora he fallado. Soy nuevo en ffmpeg y confío principalmente en ajustar lo que puedo encontrar en la documentación y ejemplos existentes en línea. Por lo que he leído hasta ahora, usar el filtro de mezcla o superposición debería ayudar a lograr lo que busco, pero no puedo entender los detalles de la línea de comandos para que funcione.

Los filtros de desvanecimiento y concat son excelentes para la desvanecimiento gradual del video 1, el desvanecimiento en el video 2 y concat las transiciones de tipo clip 2 en 1, pero agradecería ayuda para obtener un comando para pasar del video 1 al video 2 sin ninguna yendo a negro en el medio. No pude encontrar ningún ejemplo para este problema exactamente en ninguna parte, ¿tal vez estoy buscando las palabras clave incorrectas?

Más específicamente, mis videos son mp4 (video h264, sin sonido, en caso de que sea importante), cada uno dura 5 segundos y estoy después de una transición de aprox. 4.5s de video 1 a 0.5s de video 2.

Similar a lo que hace este tutorial usando MLT y marcos (vea 2:25 para ver un ejemplo de desvanecimiento), aunque estoy buscando una manera de hacerlo solo en ffmpeg sin llamar a ningún otro programa. http://www.youtube.com/watch?v=3PRZ9L_KLdI

Cualquier sugerencia o tal vez una línea de comando para obtener un desvanecimiento como este sería muy apreciada, ¡muchas gracias!


Respuestas:


23

Sugiero hacer eso:

  • Cree un fondo negro con la misma duración y resolución que el video de salida debe ser
  • Agregar canal alfa a cada video
  • Agregue desvanecimiento al efecto alfa a cada video
  • Use superposición en cada video con fondo negro

Entonces, el comando para agregar fundido cruzado a 2 videos (5 segundos) cada uno debería ser:

ffmpeg -i 1.mp4 -i 2.mp4 -f lavfi -i color=black -filter_complex \
"[0:v]format=pix_fmts=yuva420p,fade=t=out:st=4:d=1:alpha=1,setpts=PTS-STARTPTS[va0];\
[1:v]format=pix_fmts=yuva420p,fade=t=in:st=0:d=1:alpha=1,setpts=PTS-STARTPTS+4/TB[va1];\
[2:v]scale=960x720,trim=duration=9[over];\
[over][va0]overlay[over1];\
[over1][va1]overlay=format=yuv420[outv]" \
-vcodec libx264 -map [outv] out.mp4

Esto desvanecerá el primer video a alfa a cuarto segundo (st = 4) durante 1 segundo (d = 1), se desvanecerá en el segundo a 0 segundo (st = 0) durante 1 segundo (d = 1) y moverá su pantalla tiempo de avance a 4 segundos (+ 4 / TB). Luego, solo cortamos 9 segundos de color negro, lo escalamos para dar salida al tamaño del video y superponemos las cosas.

Espero eso ayude.


Hola @ptQa, muchas gracias, el efecto de fundido cruzado funciona de maravilla. Aunque lo que sucede en el video de salida es que solo muestra una sección superior izquierda de los videos originales y falta el resto del cuadro. Miré la resolución, la entrada es de 960 x 720 y la salida es de 320 x 240, pero no reduce el video completo, sino que corta una sección de 320 x 240 en la esquina superior izquierda y muestra que en el video de salida, el resto de faltan los videos de entrada. ¿Hay alguna adición a su línea de comando que evite esto?
Mugba

Oh, lo tengo, también debes escalar el color negro a la resolución que deseas obtener. Ver respuesta actualizada. He agregado escala para filtrar el gráfico.
ptQa

Eso lo resolvió, gracias. Subí un video de muestra que muestra el fundido cruzado en caso de que alguien quiera verlo en acción, youtu.be/JqorgXAjjTo
Mugba

El mismo problema; Tengo una variante de esto trabajando en algunos de mis propios videos, gracias. Pregunta: ¿Cómo se modificaría esto para también desvanecer las pistas de audio de los videos, siguiendo el mismo patrón que el desvanecimiento del video?
Jim Miller

1
Por cierto, creo que hay un error en el comando de muestra de la respuesta, debería ser -i 1.mp4 -i 2.mp4..., ¿verdad?
Jim Miller

7

Así es como lo hice:

  • ffmpeg versión N-77197-gdf2ce13
  • 2 videos de 4 segundos cada uno.
  • Necesito unirlo con desvanecimiento entre ellos.
  • Los videos son de 25 fps.

1) Agregue desvanecimiento (claro a oscuro) al final de la primera y desvanecimiento (oscuro a claro) al comienzo del segundo:

ffmpeg -i 1.mp4 -y -vf fade=out:76:24 1f.mp4

ffmpeg -i 2.mp4 -y -vf fade=in:0:25 2f.mp4

76:24 significa que el desvanecimiento comenzará el fotograma 76 y finalizará 24 fotogramas más tarde = 1 desvanecimiento.

0:25 significa que el desvanecimiento comenzará el fotograma 0 y finalizará 25 fotogramas más tarde.

2) Combina los 2 videos

Convertir todo a TS

ffmpeg -i 1f.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts 1f.ts

ffmpeg -i 2f.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts 2f.ts

Unir

ffmpeg -i "concat:1f.ts|2f.ts" -bsf:a aac_adtstoasc -c copy output.mp4

Gracias a:

http://www.bogotobogo.com/FFMpeg/ffmpeg_fade_in_fade_out_transitions_effects_filters.php


66
Esto no es un fundido cruzado.
Gyan

44
Lo que dijo @Mulvya. Un fundido cruzado desvanece un clip al mismo tiempo que otro se desvanece. El primer clip tiene su transparencia aumentada constantemente durante la duración del fundido cruzado; el segundo tiene su transparencia constantemente disminuida.
intuido

7

ffmpeg-concat es la forma más fácil de lograr lo que desea y le permite usar un montón de transiciones sexys de OpenGL, con el fundido cruzado predeterminado.

ffmpeg-gl-transition es un filtro de ffmpeg personalizado que le permite usar GLSL para realizar una transición fluida entre dos transmisiones de video. Este filtro es significativamente más fácil de usar y personalizar que las alternativas enumeradas aquí.

Este filtro admite una gran lista de tipos de transición, con el fundido cruzado predeterminado.

./ffmpeg -i 0.mp4 -i 1.mp4 -filter_complex "gltransition=duration=4:offset=1.5" out.mp4

44
¿Has considerado enviar un parche a FFmpeg?
llogan

1
Definitivamente lo haré, solo necesito solucionar algunos pequeños problemas y probar más primero. ¡Buena llamada!
fisch2

¿Está esto en el FFmpeg oficial? Parece que no puedo localizarlo
kraftydevil
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.