Saltar al contenido

¿Cómo crear un video a partir de imágenes con FFmpeg?

Luego de tanto trabajar ya encontramos el arreglo de esta dificultad que tantos lectores de nuestro sitio han presentado. Si tienes alguna información que aportar no dudes en compartir tu información.

Solución:

Vea Crear una presentación de diapositivas de video a partir de imágenes – FFmpeg

Si su video no muestra los fotogramas correctamente Si tiene problemas, como que se omite la primera imagen o solo se muestra para un cuadro, utilice el filtro de video fps en lugar de -r para la velocidad de fotogramas de salida

ffmpeg -r 1/5 -i img%03d.png -c:v libx264 -vf fps=25 -pix_fmt yuv420p out.mp4

Alternativamente, el filtro de formato de video se puede agregar a la cadena de filtros para reemplazar -pix_fmt yuv420p igual que “fps = 25, formato = yuv420p”. La ventaja de este método es que puede controlar qué filtro va primero

ffmpeg -r 1/5 -i img%03d.png -c:v libx264 -vf "fps=25,format=yuv420p" out.mp4

Probé los siguientes parámetros, funcionó para mí

"e:ffmpegffmpeg.exe" -r 1/5 -start_number 0 -i "E:images1padlock%3d.png" -c:v libx264 -vf "fps=25,format=yuv420p" e:out.mp4

Los siguientes parámetros también funcionaron, pero siempre se salta la primera imagen.

"e:ffmpegffmpeg.exe" -r 1/5 -start_number 0 -i "E:images1padlock%3d.png" -c:v libx264 -r 30 -pix_fmt yuv420p e:out.mp4

hacer un video a partir de imágenes colocadas en diferentes carpetas

Primero, agregue rutas de imagen a imagepaths.txt como abajo.

# this is a comment details https://trac.ffmpeg.org/wiki/Concatenate

file 'E:imagespngimages__%3d.jpg'
file 'E:imagesjpgimages__%3d.jpg'

Ejemplo de uso de la siguiente manera;

"h:ffmpegffmpeg.exe" -y -r 1/5 -f concat -safe 0 -i "E:imagesimagepaths.txt" -c:v libx264 -vf "fps=25,format=yuv420p" "e:out.mp4"

-seguro 0 el parámetro previene Nombre de archivo inseguro error

Enlaces relacionados

FFmpeg haciendo un video a partir de imágenes colocadas en diferentes carpetas

FFMPEG Una guía intermedia / secuencia de imágenes

Concatenar – FFmpeg

-pattern_type glob

Esta gran opción facilita la selección de imágenes en muchos casos.

Video de presentación de diapositivas con una imagen por segundo

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

Agregue un poco de música, corte cuando el audio presumiblemente más largo cuando terminen las imágenes:

ffmpeg -framerate 1 -pattern_type glob -i '*.png' -i audio.ogg 
  -c:a copy -shortest -c:v libx264 -r 30 -pix_fmt yuv420p out.mp4

Aquí hay dos demostraciones en YouTube:

  • https://www.youtube.com/watch?v=grV64VE1U6c
  • https://www.youtube.com/watch?v=_6D05gCWh_I

Sea un hippie y use el formato de video libre de patentes de Theora:

ffmpeg -framerate 1 -pattern_type glob -i '*.png' -i audio.ogg 
  -c:a copy -shortest -c:v libtheora -r 30 -pix_fmt yuv420p out.ogg

Por supuesto, sus imágenes deben estar ordenadas alfabéticamente, generalmente como:

0001-first-thing.jpg
0002-second-thing.jpg
0003-and-third.jpg

etcétera.

También me aseguraría primero de que todas las imágenes que se utilizarán tengan la misma relación de aspecto, posiblemente recortándolas con imagemagick o nomacs de antemano, para que ffmpeg no tenga que tomar decisiones difíciles. En particular, el ancho debe ser divisible por 2, de lo contrario, la conversión falla con: “ancho no divisible por 2”.

Video de velocidad normal con una imagen por cuadro a 30 FPS

ffmpeg -framerate 30 -pattern_type glob -i '*.png' 
  -c:v libx264 -pix_fmt yuv420p out.mp4

Así es como se ve:

GIF generado con: https://askubuntu.com/questions/648603/how-to-create-an-animated-gif-from-mp4-video-via-command-line/837574#837574

Agrégale algo de audio:

ffmpeg -framerate 30 -pattern_type glob -i '*.png' 
  -i audio.ogg -c:a copy -shortest -c:v libx264 -pix_fmt yuv420p out.mp4

Resultado: https://www.youtube.com/watch?v=HG7c7lldhM4

Estos son los medios de prueba que he usado: a

wget -O opengl-rotating-triangle.zip https://github.com/cirosantilli/media/blob/master/opengl-rotating-triangle.zip?raw=true
unzip opengl-rotating-triangle.zip
cd opengl-rotating-triangle
wget -O audio.ogg https://upload.wikimedia.org/wikipedia/commons/7/74/Alnitaque_%26_Moon_Shot_-_EURO_%28Extended_Mix%29.ogg

Imágenes generadas con: ¿Cómo usar GLUT / OpenGL para renderizar en un archivo?

Es genial observar cuánto comprime el video la secuencia de imágenes mucho mejor que ZIP, ya que es capaz de comprimir cuadros con algoritmos especializados:

  • opengl-rotating-triangle.mp4: 340K
  • opengl-rotating-triangle.zip: 7,3 millones

Convierta un archivo de música en un video con una imagen fija para subir a YouTube

Respondido en: https://superuser.com/questions/700419/how-to-convert-mp3-to-youtube-allowed-video-format/1472572#1472572

Configuración completa del estudio de caso de presentación de diapositivas realista paso a paso

Crear presentaciones de diapositivas es un poco más que ejecutar un solo comando ffmpeg, por lo que aquí va un ejemplo detallado más interesante inspirado en esta línea de tiempo.

Obtenga los medios de entrada:

mkdir -p orig
cd orig
wget -O 1.png https://upload.wikimedia.org/wikipedia/commons/2/22/Australopithecus_afarensis.png
wget -O 2.jpg https://upload.wikimedia.org/wikipedia/commons/6/61/Homo_habilis-2.JPG
wget -O 3.jpg https://upload.wikimedia.org/wikipedia/commons/c/cb/Homo_erectus_new.JPG
wget -O 4.png https://upload.wikimedia.org/wikipedia/commons/1/1f/Homo_heidelbergensis_-_forensic_facial_reconstruction-crop.png
wget -O 5.jpg https://upload.wikimedia.org/wikipedia/commons/thumb/5/5a/Sabaa_Nissan_Militiaman.jpg/450px-Sabaa_Nissan_Militiaman.jpg
wget -O audio.ogg https://upload.wikimedia.org/wikipedia/commons/7/74/Alnitaque_%26_Moon_Shot_-_EURO_%28Extended_Mix%29.ogg
cd ..

# Convert all to PNG for consistency.
# https://unix.stackexchange.com/questions/29869/converting-multiple-image-files-from-jpeg-to-pdf-format
# Hardlink the ones that are already PNG.
mkdir -p png
mogrify -format png -path png orig/*.jpg
ln -P orig/*.png png

Ahora echamos un vistazo rápido a todos los tamaños de imagen para decidir la relación de aspecto final:

identify png/*

que salidas:

png/1.png PNG 557x495 557x495+0+0 8-bit sRGB 653KB 0.000u 0:00.000
png/2.png PNG 664x800 664x800+0+0 8-bit sRGB 853KB 0.000u 0:00.000
png/3.png PNG 544x680 544x680+0+0 8-bit sRGB 442KB 0.000u 0:00.000
png/4.png PNG 207x238 207x238+0+0 8-bit sRGB 76.8KB 0.000u 0:00.000
png/5.png PNG 450x600 450x600+0+0 8-bit sRGB 627KB 0.000u 0:00.000

por lo que la relación de aspecto clásica de 480p (640×480 == 4/3) parece apropiada.

Haga una conversión con un cambio de tamaño mínimo para igualar los anchos (TODO automatice para cualquier ancho, aquí solo miré manualmente identify salida y ancho y alto reducidos en uno):

mkdir -p raw
convert png/1.png -resize 556x494 raw/1.png
ln -P png/2.png png/3.png png/4.png png/5.png raw
ffmpeg -framerate 1 -pattern_type glob -i 'raw/*.png' -i orig/audio.ogg -c:v libx264 -c:a copy -shortest -r 30 -pix_fmt yuv420p raw.mp4

Esto produce un resultado terrible, porque como se ve en:

ffprobe raw.mp4

ffmpeg solo toma el tamaño de la primera imagen, 556×494, y luego convierte todas las demás a ese tamaño exacto, rompiendo su relación de aspecto.

Ahora convierta las imágenes a la relación de aspecto de 480p objetivo automáticamente recortando según ImageMagick: ¿cómo recortar mínimamente una imagen a una determinada relación de aspecto?

mkdir -p auto
mogrify -path auto -geometry 640x480^ -gravity center -crop 640x480+0+0 png/*.png
ffmpeg -framerate 1 -pattern_type glob -i 'auto/*.png' -i orig/audio.ogg -c:v libx264 -c:a copy -shortest -r 30 -pix_fmt yuv420p auto.mp4

Así que ahora, la relación de aspecto es buena, pero inevitablemente se tuvo que hacer algunos recortes, lo que cortó partes interesantes de las imágenes.

La otra opción es rellenar con fondo negro para tener la misma relación de aspecto que se muestra en: Cambiar el tamaño para que quepa en un cuadro y establecer el fondo en negro en la parte “vacía”

mkdir -p black
ffmpeg -framerate 1 -pattern_type glob -i 'black/*.png' -i orig/audio.ogg -c:v libx264 -c:a copy -shortest -r 30 -pix_fmt yuv420p black.mp4

Sin embargo, en términos generales, idealmente podrá seleccionar imágenes con la misma relación de aspecto o similar para evitar esos problemas en primer lugar.

Acerca de las opciones de CLI

Sin embargo, tenga en cuenta que a pesar del nombre, -glob esto no es tan general como los patrones de Shell Glob, por ejemplo: -i '*' falla: https://trac.ffmpeg.org/ticket/3620 (aparentemente porque el tipo de archivo se deduce de la extensión).

-r 30 hacer el -framerate 1 video 30 FPS para superar errores en reproductores como VLC para velocidades de cuadro bajas: VLC se congela para video de 1 FPS bajo creado a partir de imágenes con ffmpeg Por lo tanto, repite cada cuadro 30 veces para mantener el efecto deseado de 1 imagen por segundo.

Próximos pasos

También querrás:

  • corte la parte del audio que desee antes de unirlo: corte los videos según la hora de inicio y finalización usando ffmpeg

    ffmpeg -i in.mp3 -ss 03:10 -to 03:30 -c copy out.mp3
    

TODO: aprenda a cortar y concatenar varios archivos de audio en el video sin archivos intermedios, estoy bastante seguro de que es posible:

  • ffmpeg cut y concat línea de comando única
  • https://video.stackexchange.com/questions/21315/concatenating-split-media-files-using-concat-protocol
  • https://superuser.com/questions/587511/concatenate-multiple-wav-files-using-single-command-without-extra-file

Probado en

ffmpeg 3.4.4, vlc 3.0.3, Ubuntu 18.04.

Bibliografía

  • http://trac.ffmpeg.org/wiki/Slideshow wiki oficial

Versión simple de los documentos

Funciona particularmente bien para imágenes de Google Earth Studio:

ffmpeg -framerate 24 -i Project%03d.png Project.mp4

Reseñas y calificaciones

Ten en cuenta compartir este post si si solucionó tu problema.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

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