Tengo fotogramas de video en formato PNG a 1 FPS y estoy tratando de convertirlos en un video usando ffmpeg.

Si hago algo como esto:

ffmpeg -i data/input-%4d.png data/output.mp4

Obtengo un video a 25FPS que es básicamente un avance muy rápido de la entrada (que se captura a 1FPS).

Si intento:

ffmpeg -i data/input-%4d.png -r 1 data/output.mp4

Obtengo algo que VLC no quiere reproducir 🙂

Ahora, si tomo el primer video (el de FF) y aplico un filtro para ralentizarlo (por ejemplo, -filter:v "setpts=24.0*PTS"), puedo hacer que se reproduzca como un video de 1 FPS, pero, por supuesto, el precio es el tamaño del archivo. Está generando un montón de fotogramas repetidos, supongo.

Entonces, la pregunta es ¿cómo creo un video que tiene exactamente 1 FPS y realmente se reproduce a esa velocidad? El formato de salida, por cierto, no » Eso es importante para mí.

Comentarios

  • Yo ‘ no estoy seguro ffmpeg es lo suficientemente inteligente como para descubrir el códec de video solo desde la extensión de archivo de formato contenedor, .mp4. Intente agregar -vcodec libx264 -vpre hq a la línea de comandos, para indicarle el códec y los parámetros de codificación.
  • En realidad lo resolvió bien, y como mencioné, funcionó bien y solo produjo resultados extraños cuando agregué -r 1.
  • Creo que puede tener mejor suerte con una respuesta ffmpeg en stackoverflow.com o superuser.com .

Responder

Si desea un resumen de FFMPEG que genere un video que se reproduzca a 1 fotograma por segundo, lo que desea hacer es especificar la velocidad de fotogramas tanto para la entrada como para la salida, así:

ffmpeg -r 1 -i datos / entrada-% 4d.png -pix_fmt yuv420p -r 10 datos / salida.mp4

El -r 1 significa que el video se reproducirá a 1 de las imágenes originales por segundo.
El -r 10 significa que el video se reproducirá a 10 cuadros por segundo.

(El -pix_fmt yuv420p está ahí para garantizar la compatibilidad con una amplia gama de programas de reproducción. Se requiere aquí, por ejemplo, para que el video se pueda reproducir en Windows Media Player.)

Probé muchas velocidades de cuadros de salida diferentes, y 10 parece ser el número más bajo que puede usar que aún producirá un video que reproducirá VLC.

Por supuesto, el comando anterior significa que cada imagen original se está multiplicando, pero es un método más simple que el de «ralentizarlo» que mencionaste, y dependiendo del códec puede que no produzca un video mucho más grande que un video de 1 FPS real.

Para probar esto, acabo de producir un video de 1 FPS real, que salió a 2.24 kiB. Luego produje un video con las mismas imágenes de entrada pero con una salida a 24 FPS, y salió a 5.76 kiB. Eso es un poco más del doble del tamaño, y ni mucho menos 24 veces el tamaño. 🙂

Comentarios

  • +1 en -pix_fmt. Fácil de olvida que algunas personas insisten en usar WMP 🙂
  • ¿Por qué querrías que el formato de salida sea 10 fps mientras que la entrada es solo 1? ¿No ‘ crear marcos redundantes al 90% que son exactamente iguales?
  • @Herbert crea marcos redundantes para que pueda obtener una velocidad de fotogramas de hasta 10, lo cual se hace solo para que VLC no ‘ t quejarse , y visualmente no ‘ t cambia el video. El codificador es lo suficientemente inteligente como para ver que los fotogramas son idénticos, por lo que no ‘ t terminas con un archivo mucho más grande
  • @chiliNUT claro, el tema del fotograma clave, que no todos los formatos, pero la mayoría de los formatos cuerdos lo harán. Gracias !

Responder

Use ambos -framerate y -r

Por ejemplo, para tener un video final que parezca 1FPS:

ffmpeg -framerate 1 -pattern_type glob -i "*.png" \ -c:v libx264 -r 30 -pix_fmt yuv420p out.mp4 

Esto es similar a lo que Conversión de cuadros PNG a video a 1 FPS | Unix & Linux Stack Exchange dice, pero necesitaba -framerate en lugar de -r para que funcione.

Esto se menciona en la wiki en: http://trac.ffmpeg.org/wiki/Slideshow#Framerates

Establece la velocidad de fotogramas de salida en 30, que VLC puede manejar, y copia cada imagen 30 veces, de modo que el video de salida parece estar a 1 FPS. Ver también: Problemas de reproducción en VLC con video de fps bajo de imágenes usando ffmpeg | Stack Overflow

VLC puede entonces reproducir el video normalmente.

Probado en Ubuntu 16.10, VLC 2.2.4, ffmpeg 3.0.5, en un directorio con 10 PNG.

Consulte también: https://stackoverflow.com/questions/19267443/vlc-freezes-for-low-1-fps-video-created-from-images-with-ffmpeg

Comentarios

  • ¿Qué ‘ es la diferencia entre -r y -framerate?
  • @Royi No ‘ no lo sé realmente, excepto que es lo único que funcionó para mí 🙂 Pero si lograste extraerlo de las páginas man, avíseme 😉 Una cita significativa es » -r Como opción de entrada, ignore cualquier marcas de tiempo almacenadas en el archivo y, en su lugar, generan marcas de tiempo asumiendo una velocidad de fotogramas constante fps. Esto no es lo mismo que la opción -framerate utilizada para algunos formatos de entrada como image2 o v4l2 (solía ser la misma en versiones anteriores de FFmpeg). En caso de duda, utilice -framerate en lugar de la opción de entrada -r. »

Answer

¿Qué sucede si aumenta un poco su segundo ejemplo de la siguiente manera:

$ ffmpeg -r 1 -i data/input-%4d.png -c:v libx264 out.mp4 

El -r 1 debe ir antes de los archivos .png, no después.

De la documentación de FFmpeg :

Como regla general, las opciones se aplican al siguiente archivo especificado. Por lo tanto, el orden es importante y puede tener la misma opción en la línea de comando varias veces. Cada aparición se aplica al siguiente archivo de entrada o salida.

Comentarios

  • Desafortunadamente, esto No funciona. Sin embargo, mencionar que el pedido es importante me ahorró mucho tiempo. Gracias.

Respuesta

Este es un error en VLC (que todavía existe en la versión 3.0.6). Después de algunos experimentos, me di cuenta de que VLC se bloquea para videos con FPS de menos de 10 . Por lo tanto, todos los videos con 10 FPS o más no deberían ser un problema. Por lo tanto, actualmente no existe una forma limpia de obtener un video con 1 FPS que se pueda reproducir en VLC ( don «t Ríndete, sigue leyendo ).

Una solución es, como se muestra en la respuesta anterior, simular el efecto de 1 FPS duplicando las imágenes (cuando en realidad tenemos un FPS igual a 10 o más, lo cual está bien para VLC).

Ejemplo: si tiene una carpeta con 12 imágenes y le gustaría generar un video con 1 FPS (que se puede reproducir en VLC), entonces necesita duplicar cada imagen varias veces (digamos 10 veces), y luego decir FFMPEG para generar un video de 10 FPS, de esta forma obtendremos un video con un total de 120 cuadros, donde cada imagen se reproducirá durante 1 segundo (ya que se duplica 10 veces), que es simplemente una falsificación por 1 FPS.

Prefiero usar el parámetro fps en lugar de

(que se muestra en otra respuesta) que, en algunos casos, puede ser problemático (de acuerdo con documentación oficial ).

ffmpeg -framerate 1 -i "img (%d).jpg" -c:v libvpx-vp9 -vf "fps=10,format=yuv420p" out.mkv 

Como la entrada -framerate es menor que la salida fps, FFMPEG duplicará los fotogramas para alcanzar la velocidad de fotogramas de salida deseada (que es 10 según el comando anterior).

También es Es importante notar que el orden de -framerate y -vf fps es importante , ya que esta configuración se aplicará al siguiente video mencionado (entrada o salida). Eso es de acuerdo con los documentos oficiales :

las opciones se aplican al siguiente especificado expediente. Por lo tanto, el orden es importante …

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *