Problemas al hacer un bucle de una transmisión con FFMpeg

Estoy tratando de superponer un video encima de una imagen. El problema al que me enfrento es que la duración del video que quiero es más larga que la duración del video de entrada.

Para resolver este problema, trato de generar un bucle de transmisión y codificar la duración que quiero usando el parámetro "t".

Estoy usando el filtro setpts para asegurarme de que mi formato de contenedor (.mp4) acepte marcos pasados ​​reescribiendo sus marcas de tiempo:

ffmpeg -loop 1 -i image.jpg -stream_loop -1 -i video.mov  -filter_complex "[1:v]setpts=N/(FRAME_RATE*TB)[1v];[0:v][1v]overlay=x=main_w*0.44:y=main_h*0.33[out]" -map [out] -t 00:00:15  out.mp4

Entonces el comando dice lo siguiente:

  1. tome una entrada infinita donde cada cuadro es image.jpg
  2. toma otra entrada infinita (video.mov) haciendo un bucle (-stream_loop -1)

Cada fotograma pasará por el filtro:

  • setpts reescribirá las marcas de tiempo para la fuente 1 (video.mov)
  • overlay colocará cada cuadro editado con setpts de video.mov encima de cada cuadro de la entrada inicial (image.jpg - 0:v)

Esto debería continuar hasta que se cree un archivo con 00:00:15 segundos.

Este comando genera ese archivo pero el video.mov no está en bucle, una vez que el primer bucle finaliza, el último cuadro se repite hasta que finaliza la película de salida.

FYI: Hice un par de pruebas más:

ffmpeg -stream_loop -1 -i movie.mov -filter_complex "[0:v]setpts=N/(FRAME_RATE*TB)[out]" -map [out] -t 00:00:30 output.mp4

Esto funciona bien, genera una película con una duración de 30 segundos con la película de entrada en bucle para llenar la película de salida

por otro lado, si agrego un archivo de entrada más:

ffmpeg -stream_loop -1 -i movie.mov -loop 1 -i image.jpg -filter_complex "[0:v]setpts=N/(FRAME_RATE*TB)[out]" -map [out] -t 00:00:30 output.mp4

Esto no creará una película con 30 segundos, aunque una de las entradas nunca se usa, ffmpeg crea un archivo de película con solo un bucle de movie.mov y la misma duración de movie.mov.

¿Algún consejo por favor?

¡Muchos gracias!

Ze

Respuestas (1)

Prueba con el filtro de película en su lugar

ffmpeg -loop 1 -i image.jpg -filter_complex \
        "movie=video.mov:loop=999,setpts=N/(FRAME_RATE*TB)[1v]; \
        [0:v][1v]overlay=x=main_w*0.44:y=main_h*0.33[out]" \
       -map [out] -t 00:00:15  out.mp4
¡Funciona de maravilla! ¿Alguna idea de por qué stream_loop no funciona?
Estoy especulando aquí, pero el valor de stream_loop se registrará en la misma variable compartida que el argumento de bucle del demuxer de imágenes, y en realidad no se registra correctamente. El filtro de película crea su propio contexto local. Pero esto es sólo una conjetura.