Tengo cuadros 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 lo intento:
ffmpeg -i data/input-%4d.png -r 1 data/output.mp4
Me sale algo que VLC no quiere jugar :)
Ahora, si tomo el primer video (el 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 cuadros 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 es tan importante para mí.
fuente
ffmpeg
es lo suficientemente inteligente como para saber el códec de vídeo sólo de la extensión del archivo de formato contenedor,.mp4
. Intente agregar-vcodec libx264 -vpre hq
a la línea de comando, para indicarle el códec y los parámetros de codificación.-r 1
.Respuestas:
Si desea una línea para FFMPEG que genere un video que se reproduce a 1 fotograma por segundo, lo que desea hacer es especificar la velocidad de fotogramas para la entrada y la salida, de esta manera:
Esto
-r 1
significa que el video se reproducirá a 1 de las imágenes originales por segundo.Esto
-r 10
significa que el video se reproducirá a 10 cuadros por segundo.(El
-pix_fmt yuv420p
solo está ahí para garantizar la compatibilidad con una amplia gama de programas de reproducción. Se requiere aquí, por ejemplo, para que el reproductor de Windows Media pueda reproducir el video).Probé muchas velocidades de fotogramas de salida diferentes, y 10 parece ser el número más bajo que puede usar que todavía 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 "ralentizar" que mencionó, y dependiendo del códec puede no producir un video mucho más grande que un verdadero 1-FPS vídeo.
Para probar esto, acabo de producir un verdadero video de 1 FPS, que salió a 2.24 kiB. Luego produje un video con las mismas imágenes de entrada pero salida a 24 FPS, y salió a 5,76 kiB. Eso es un poco más del doble del tamaño, y no se acerca a 24 veces el tamaño. :)
fuente
Use ambos
-framerate
y-r
Por ejemplo, para tener un video final que se parece a 1FPS:
Esto es similar a lo que es convertir cuadros PNG a video a 1 FPS | Unix & Linux Stack Exchange dice, pero necesitaba en
-framerate
lugar de-r
que funcione.Esto se menciona en la wiki en: http://trac.ffmpeg.org/wiki/Slideshow#Framerates
Establece la velocidad de fotogramas de salida
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 baja fps de imágenes usando ffmpeg | Desbordamiento de pilaVLC puede reproducir el video normalmente.
Probado en Ubuntu 16.10, VLC 2.2.4,
ffmpeg
3.0.5, en un directorio con 10 PNG.Ver también: /programming/19267443/vlc-freezes-for-low-1-fps-video-created-from-images-with-ffmpeg
fuente
-r
y-framerate
?man
páginas, avísame ;-) Una cita significativa es "-r Como un Opción de entrada, ignore las marcas de tiempo almacenadas en el archivo y, en su lugar, genere marcas de tiempo suponiendo 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 ".¿Qué pasa si aumenta su segundo ejemplo ligeramente de la siguiente manera:
La
-r 1
necesidad de venir antes de los archivos .png, no después.De la documentación de FFmpeg :
fuente
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 . Entonces, todos los videos con 10 FPS o más no deberían ser un problema. Por lo tanto, actualmente no hay una forma limpia de obtener un video con 1 FPS que se pueda reproducir en VLC ( no te rindas, sigue leyendo ).
Una solución alternativa 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 desea generar un video con 1 FPS (que se puede reproducir en VLC), debe duplicar cada imagen varias veces (digamos 10 veces) y luego decirle a FFMPEG para generar un video de 10 FPS. De esta forma, obtendremos un video con un total de cuadros de 120, donde cada imagen se reproducirá durante 1 segundo (ya que se duplica 10 veces), lo cual es simplemente falso para 1 FPS.
Prefiero usar el
fps
parámetro en lugar de-r
(que se muestra en otra respuesta), que en algunos casos puede ser problemático (de acuerdo con la documentación oficial ).Como la entrada
-framerate
es más baja que la salidafps
, FFMPEG duplicará fotogramas para alcanzar la velocidad de fotogramas de salida deseada (que es 10 según el comando anterior).También es importante notar que el orden de
-framerate
y-vf fps
es importante , ya que esta configuración se aplicará al siguiente video (entrada o salida) mencionado. Eso es de acuerdo con los documentos oficiales :fuente