FFMPEG: ¿es posible compensar los fotogramas de salida de una selección de fotogramas específicos?

Estoy haciendo algunas transcodificaciones de ffmpeg (4.1.3) extrayendo cuadros específicos de la fuente, en este caso, la fuente puede ser una película o una secuencia de imágenes, todo funciona bien con el siguiente comando:

ffmpeg -i source.mov -vf select='eq(n\,2)+eq(n\,80)+eq(n\,150)' -vsync 0 -frame_pts 1 frames_%04d.jpeg

En el caso de una secuencia de imágenes de origen, solo necesito especificar el número de inicio (ya que mis cuadros generalmente comienzan en 100 o más):

ffmpeg -start_number 94 -i source.%04d.png -vf select='eq(n\,2)+eq(n\,80)+eq(n\,150)' -vsync 0 -frame_pts 1 frames_%04d.jpeg

Pero el problema es que los números de cuadro que obtengo coinciden con los números exactos que solicité, que son los requeridos del filtro de selección y comienzan en 0, en el ejemplo de la secuencia de imágenes, pueden ver que en realidad comienza en el cuadro 94, y técnicamente las películas replican lo mismo, su primer cuadro es el mismo que el 94 en la secuencia de imágenes, y me encantaría tener una forma de compensar los números de salida con un cierto número para que coincidan con el cuadro "fuente" correspondiente .

Ya intenté agregar un -start_number al final antes de la salida, que funciona con transcodificaciones regulares, pero parece que no funciona en combinación con -frame_pts

Me encantaría poder hacer algo como esto:

ffmpeg -start_number 94 -i source.%04d.png -vf select='eq(n\,2)+eq(n\,80)+eq(n\,150)' -vsync 0 -start_number 94 -frame_pts 1 frames_%04d.jpeg

Y obtenga los marcos 96, 174 y 244 en lugar de 2, 80 y 150.

Hay una manera de hacer eso ?

¡Gracias de antemano!

Respuestas (2)

start_numberse ignora con frame_pts, por lo que se necesita una solución alternativa. Hay una opción genérica output_ts_offsetdisponible, pero requiere una marca de tiempo en lugar de un número de fotograma, por lo que primero establecemos la velocidad de fotogramas de las imágenes de entrada en 1.

Usar

ffmpeg -start_number 94 -framerate 1 -i source.%04d.png -vf select='eq(n\,2)+eq(n\,80)+eq(n\,150)' -vsync 0 -output_ts_offset 94 -frame_pts 1 frames_%04d.jpeg

Probablemente solo necesite ajustar los pts con: setpts=PTS+(94*TB). Tendría que ajustar ese 94 para cada número de inicio diferente
Entonces:

ffmpeg -start_number 94 -i source.%04d.png -filter_complex select='eq(n\,2)+eq(n\,80)+eq(n\,150)';setpts=PTS+(94*TB) frames_%04d.jpeg

También vsynces un poco innecesario cuando se envía a jpg.

EDITAR: Se corrigió la setpts-Expresión, porque fui estúpido la primera vez. EDIT2: parece que ni siquiera puedo leer la pregunta correctamente ... Se corrigió la setpts-Expresión nuevamente

El vsync predeterminado para las imágenes es CFR, por lo que ffmpeg duplicará los fotogramas cuando las marcas de tiempo entre los fotogramas de salida sean mayores que las esperadas para los fotogramas adyacentes. Se necesita vsync 0 para deshabilitar eso.