Estoy usando FFmpeg para extraer imágenes de un video, 1 fotograma cada 6 segundos:
Normal command on Dos ( Windows 8 OS) > ffmpeg -i in.mkv -r 1/6 %4d.png
Lleva demasiado tiempo ya que la velocidad es muy baja, alrededor de 15-20.
Así que uséskip_frame nokey
ffmpeg -skip_frame nokey -i "in.mkv" -vsync 0 -frame_pts true -r 1/6 %4d.png
Este extrae a mayor velocidad, alrededor de 200 (diez veces más rápido).
Pero el problema es que omite muchas imágenes y arroja un error:
la aplicación proporcionó dts no válidos y que no aumentaban monótonamente al muxer en la secuencia
Entonces usé este comando:
ffmpeg -i in.mkv -vf "select='if(not(floor(mod(t,6)))*lt(ld(1),1),st(1,1)+st(2,n)+st(3,t));if(eq(ld(1),1)*lt(n,ld(2)+1),1,if(trunc(t-ld(3)),st(1,0)))'" -vsync 0 %4d.png
(Proporcionado aquí -¿Cómo capturar los primeros X fotogramas cada X segundos en un PNG con FFmpeg?)
Esto me da una velocidad de 25-30.
¿Hay alguna forma de lograr una mayor velocidad -skip_frame
?
Respuesta1
Ok, el código que publiqué arriba en la publicación original es la única solución que he encontrado hasta ahora para una extracción de imágenes más rápida. A veces me da velocidad hasta 50.
ffmpeg -i in.mkv -vf "select='if(not(floor(mod(t,6)))*lt(ld(1),1),st(1,1)+st(2,n)+st(3,t));if(eq(ld(1),1)*lt(n,ld(2)+1),1,if(trunc(t-ld(3)),st(1,0)))'" -vsync 0 %4d.png
Si está interesado en la extracción aleatoria de imágenes (basada en fotogramas clave) para obtener una mayor velocidad, utilice -skip_frame nokey.