Agregue una superposición de imagen frente al video usando ffmpeg

Tengo muchos videos y necesito poner una imagen delante de ellos durante unos 5 segundos, pero agregarla manualmente y renderizarla cada vez llevaría mucho tiempo, así que pregunto si es posible hacerlo a través de ffmpeg y si podría, por favor, ayudarme con eso ya que no tengo experiencia con ffmpeg. Ya encontré algunos comandos, pero ninguno funcionó. Este por ejemplo.

ffmpeg -itsoffset 5 -i in.mp4 -r 25 -loop 1 -i intro.png -filter_complex "[1:v] fade=out:125:25:alpha=1 [intro]; [0:v][intro] overlay [v]" -map "[v]" -map 0:a -acodec copy out.mp4
¿Simplemente copió ese comando o lo escribió de acuerdo con sus necesidades? Lo pregunto porque este comando involucra cosas como un desvanecimiento y todo tipo de otras cosas que no están cubiertas en su pregunta. ¿Solo necesita superponer una imagen o necesita más que eso?
Lo copié de algún lado, todo lo que necesito es poner la imagen delante del video.

Respuestas (2)

Puede hacer una superposición de imagen simple usando la siguiente sintaxis:

ffmpeg -i input.mp4 -i image.png \
-filter_complex "[0:v][1:v] overlay=25:25:enable='between(t,0,20)'" \
-pix_fmt yuv420p -c:a copy \
output.mp4

overlay=25:25significa que queremos colocar la imagen 25px a la derecha y 25px hacia abajo, desde la esquina superior izquierda (0:0).

enable='between(t,0,20)'significa que queremos que la imagen se muestre entre el segundo 0 y el 20.

[0:v][1:v]significa que queremos que el primer archivo de video que importamos -i, en nuestro caso input.mp4 o como lo ve ffmpeg, el archivo de entrada de video número 0, esté debajo del archivo de entrada de video 1, en nuestro caso image.png. :vsolo significa que queremos la pista de video de estas fuentes de archivo. [0:a]significaría que queremos la primera pista de audio importada. Que también vendría de input.mp4 pero apuntaría a la pista de audio en lugar de la pista de video en el archivo mp4.

Si desea una determinada calidad/configuración de imagen y no la configuración que elige ffmpeg, agregue las opciones de codificación de imagen o audio que desea usar. El codificador de video predeterminado será x264. Consulte la guía de codificación H.264 para conocer las posibles configuraciones.

El -acodec copy/ -c:a copyque tiene en su comando fe simplemente reutilizaría el audio del archivo fuente. Aunque, por supuesto, no puede hacer eso con el video (en este caso), debe transcodificarse porque estamos creando una nueva fuente de video.

Si desea transcodificar audio, elimine la -c:a copyparte. Es posible que deba especificar explícitamente un codificador, por ejemplo, -c:a aac -strict experimental. Consulte la guía de codificación AAC para obtener más información.

La siguiente iteración del comando anterior me funcionó en Android, ya que el original da un error como aac es una característica experimental: ffmpeg -i input.mp4 strict -2 -i image.png -filter_complex [0:v][1: v] superposición = 25:25: habilitar = 'entre (t, 0,20)' salida.mp4
¿Hay alguna forma de colocar en la parte inferior sin saber la altura? o el extremo derecho sin saber el ancho?
claro, simplemente analice el video con ffprobe y extraiga las dimensiones del video de la salida. Tal vez también haya una opción integrada en ffmpeg pero no estoy al tanto.
¿Hay algún método o cálculo que haga que la imagen aparezca en el centro?
Su comando reemplaza un fragmento del archivo de video original, pero es posible que un usuario desee agregar (aumentando así la duración del video) una imagen antes y/o después del video. por favor ayuda con esto
@porton Esta pregunta se trataba de agregar una superposición, si necesita ayuda con un problema diferente, siéntase libre de abrir una nueva pregunta en la parte superior derecha de esta página con el botón "Hacer una pregunta".
¿Podemos usar GIF en lugar de PNG para el mismo propósito?@PTS
Claro, todos los formatos compatibles con FFMPEG. También puede usar un archivo de video.
Creo que la opción experimental estricta ya no es necesaria.
@PTS De hecho, esa es exactamente la pregunta que se hace aquí, que no respondió en absoluto . En ninguna parte preguntó cómo superponer una imagen sobre el video, sino cómo insertarla antes de que comience el video (usando el filtro de superposición ). Tenga en cuenta la redacción de la pregunta, el -itsoffset en su código de ejemplo y la alternativa indeseable (presentándola por separado).
Es posible que lo haya intentado debido a la redacción aparentemente confusa. Si no fuera lo que quería, probablemente no lo habría aceptado como respuesta a esta pregunta. Si tiene un problema con eso, siempre puede hacer una nueva pregunta que cubra el caso que está buscando.
¿Y para qué sirve el pix_fmtargumento? Veo esto en la mayoría de los comandos ffmpeg, pero ya sea que lo incluya o lo elimine, el resultado es el mismo. ¿Es realmente útil ponerlo en el comando?
@laurent eso depende de su archivo fuente o salida. pix_fmt significa formato de píxel. Hay muchos formatos de píxel diferentes disponibles para diferentes códecs, especificar uno garantiza que no termine con algo que no funcione para usted. yuv420p es el formato de píxel más compatible cuando se trata de h264, pero también hay yuv422p y yuv444p, por ejemplo.
@Deepak si tiene una nueva pregunta, abra una. Sin embargo, puede intentar codificar su imagen en un video de una duración específica. Nuevamente, abra una nueva pregunta, los comentarios no son el lugar para esto.
wow, ¡esto funcionó de inmediato para mí! Gracias
¿Hay alguna manera de cambiar el tamaño de la imagen antes de superponerla, o hay que hacerlo de antemano?
@BallpointBen ¿Encontraste una manera de cambiar el tamaño?

Esta es una adición a la excelente respuesta de PTS y una respuesta para chovy. Si desea colocar la superposición en la esquina inferior derecha, FFMPEG puede calcularlo muy fácilmente.

Utilice el comando modificado:

ffmpeg -i input.mp4 -i image.png \
-filter_complex "[0:v][1:v] overlay=W-w:H-h:enable='between(t,0,20)'" \
-pix_fmt yuv420p -c:a copy \
output.mp4

Ww significa ancho de video principal menos ancho de superposición, y lo mismo para Hh.

Gracias por decir la respuesta secreta: qué es Ww, no se dice claramente en la documentación al respecto.
@AlexSham Wes un ffmpegalias para el ancho del video sobre el que se superpone, y wes el alias para el ancho de la imagen que se superpone. Lo mismo con Hy h. Estos también pueden denominarse main_w(o _h) y overlay_w(o _h)
Gracias por este truco. ¿Qué pasa si w es más grande que W o h es más grande que H? Mi objetivo es centrar la superposición en el video sin importar cuáles sean sus tamaños. Me temo que ffmpeg podría lanzar una excepción si hay valores negativos. ¿También hace filter_complexque el video de salida tenga siempre el mismo tamaño que el video de entrada? ¿O lo hace del mismo tamaño que el tamaño más grande del video de entrada y el png superpuesto?
No estoy seguro de la funcionalidad si la superposición es más grande, ya que es un caso de uso inusual. ¿Quizás algo como (Ww)/2?