Agregue una superposición de imágenes frente al video usando ffmpeg

31

Tengo muchos videos y necesito poner una imagen delante de ellos durante aproximadamente 5 segundos, pero agregarlo manualmente y renderizarlo cada vez tomaría mucho tiempo, por lo que pregunto si es posible hacerlo a través de ffmpeg y si podría, por favor, ayudarme ya que no tengo experiencia con ffmpeg. Ya encontré algunos comandos pero ninguno de ellos 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
Azthy
fuente
1
¿Acabas de copiar ese comando o lo escribiste según tus necesidades? Lo pregunto porque este comando implica 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?
PTS
Lo copié de algún lado, todo lo que necesito es poner la imagen frente al video.
Azthy

Respuestas:

44

Puede hacer una superposición de imágenes simple utilizando 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:25 significa que queremos colocar la imagen 25px a la derecha y 25px hacia abajo, originando desde la esquina superior izquierda (0: 0).

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

[0:v][1:v]significa que queremos que el primer archivo de video con el que importamos -i, en nuestro caso input.mp4 o cómo ffmpeg lo ve 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 el video 0 y el video 1. [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 ffmpeg elige, agregue la imagen y / o las opciones de codificación de audio que desea utilizar. El codificador de video predeterminado será x264. Consulte la guía de codificación H.264 para ver las posibles configuraciones.

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

Si desea transcodificar audio, elimine la -c:a copyparte. Puede que tenga que 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.

PTS
fuente
La siguiente iteración del comando anterior funcionó para mí en Android ya que el original da un error como aac es una característica experimental: ffmpeg -i input.mp4 estricta -2 -i image.png -filter_complex [0: v] [1: v] overlay = 25:25: enable = 'between (t, 0,20)' output.mp4
muneikh
¿hay alguna manera de colocar en la parte inferior sin saber la altura? o bien a la derecha sin saber el ancho?
chovy
claro, solo analice el video con ffprobe y extraiga las dimensiones del video de la salida. Tal vez también hay una opción integrada en ffmpeg, pero no estoy al tanto.
PTS
3
Su comando reemplaza un fragmento del archivo de video original, pero un usuario puede querer agregar (aumentando así la duración del video) una imagen antes y / o después del video. Por favor, ayuda con esto
porton
1
@laurent que depende de su archivo fuente y / o salida. pix_fmt significa formato de píxel. Hay muchos formatos de píxeles diferentes disponibles para diferentes códecs, especificando uno para asegurarse de que no termine con algo que no funciona para usted. yuv420p es el formato de píxeles más compatible cuando se trata de h264, pero también hay yuv422p y yuv444p, por ejemplo.
PTS