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

163
ffmpeg -r 1/5 -start_number 2 -i img%03d.png -c:v libx264 -r 30 -pix_fmt yuv420p out.mp4

Esta línea funcionó bien, pero quiero crear un archivo de video a partir de imágenes en otra carpeta. Los nombres de las imágenes en mi carpeta son:

img001.jpg
img002.jpg
img003.jpg
...

¿Cómo podría ingresar archivos de imágenes desde una carpeta diferente? Ejemplo:C:\mypics

ffmpegProbé este comando pero generé un video con la primera imagen (img001.jpg) solamente.

ffmpeg -r 1/5 -start_number 0 -i C:\myimages\img%03d.png -c:v libx264 -r 30 -pix_fmt yuv420p out.mp4
usuario3877422
fuente

Respuestas:

167

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

Si su video no muestra los cuadros correctamente Si encuentra problemas, como que la primera imagen se omite o solo se muestra para un cuadro, use el filtro de video fps en lugar de -r para la tasa de cuadros 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 video de formato se puede agregar a la cadena de filtros para reemplazar -pix_fmt yuv420p como "fps = 25, format = 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é debajo de los parámetros, funcionó para mí

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

los siguientes parámetros también funcionaron, pero siempre omiten la primera imagen

"e:\ffmpeg\ffmpeg.exe" -r 1/5 -start_number 0 -i "E:\images\01\padlock%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 a continuación.

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

file 'E:\images\png\images__%3d.jpg'
file 'E:\images\jpg\images__%3d.jpg'

Ejemplo de uso de la siguiente manera;

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

-safe 0 parámetro evita error de nombre de archivo inseguro

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

kan
fuente
"Si su video no muestra los cuadros correctamente Si encuentra problemas, como que la primera imagen se omite o solo se muestra para un cuadro, use el filtro de video fps" Lo siento, pero ¿podría explicar qué quiere decir con "fps filtro de video "exactamente?
arnuschky
3
Hasta donde sé, el parámetro -r es una velocidad de cuadro variable, esto significa que FFMPEG podría caer o duplicar cuadros para lograr la velocidad de cuadro de salida deseada. Usando el filtro fps “-vf fps = value”, forzar a FFMPEG a producir una velocidad de cuadro constante. Consulte Crear una presentación de diapositivas de video a partir de imágenes - FFmpeg , y esto ¿Cuál es la diferencia (técnica) entre -r y el filtro fps? . Entonces, el uso del parámetro -r a veces se salta la primera imagen ..
Jan
El primer comando en esta lista ffmpeg -r 1/5 -i img%03d.png -c:v libx264 -vf fps=25 -pix_fmt yuv420p out.mp4parecía funcionar, pero al final resultó en un video que ningún jugador podía leer (en Ubuntu). VNC dijo: "átomo de moov no encontrado". Tratar de remediar esto qt-faststartprodujo el error "el último átomo en el archivo no era un átomo de moov"
sh37211
148

-pattern_type glob

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

Vídeo 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 algo de música, corte cuando el audio presumiblemente sea más largo cuando finalicen 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 demos en YouTube:

Sea un hippie y use el formato de video sin patente 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

Sus imágenes, por supuesto, deben ordenarse alfabéticamente, generalmente como:

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

y así.

También me aseguraré primero de que todas las imágenes que se usen tengan la misma relación de aspecto, posiblemente cortándolas con imagemagicko con nomacs de antemano, para que ffmpeg no tenga que tomar decisiones difíciles. En particular, el ancho tiene que 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: /ubuntu/648603/how-to-create-an-animated-gif-from-mp4-video-via-command-line/837574#837574

Agregue un poco 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: un

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 a un archivo?

Es genial observar cuánto comprime el video la secuencia de imágenes mucho mejor que ZIP, ya que puede comprimir a través de cuadros con algoritmos especializados:

  • opengl-rotating-triangle.mp4: 340K
  • opengl-rotating-triangle.zip: 7.3M

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

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

Configuración de estudio de caso de diapositivas realista y completa paso a paso

Crear presentaciones de diapositivas es un poco más que ejecutar un solo comando ffmpeg, así 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.
# /unix/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 tenemos 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

entonces la relación de aspecto clásica de 480p (640x480 == 4/3) parece apropiada.

Realice una conversión con un cambio de tamaño mínimo para igualar los anchos (TODO se automatiza para cualquier ancho, aquí solo miré manualmente la identifysalida y reduje el ancho y la altura 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 desde:

ffprobe raw.mp4

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

Ahora, convierta las imágenes a la relación de aspecto objetivo de 480p 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 hubo que recortar algo, 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 o similar relación de aspecto para evitar esos problemas en primer lugar.

Sobre las opciones de CLI

Sin embargo, -globtenga en cuenta que a pesar del nombre, 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 30hace que el -framerate 1video sea de 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:

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

Probado en

ffmpeg 3.4.4, vlc 3.0.3, Ubuntu 18.04.

Bibliografía

Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
fuente
Si está utilizando python y subprocess.call para iniciar ffmpeg, no debe usar comillas simples 'en los nombres de los archivos de entrada y salida. De lo contrario, no encontrará los archivos.
RunOrVeith
Esto sería genial para mí, pero mi compilación del paquete npm ffmpeg-staticno implementa glob. ( Pattern type 'glob' was selected but globbing is not supported by this libavformat build)
Sebi
-pix_fmtTrailing options were found on the commandline.error causado
Anthony Kong
@AnthonyKong No pude reproducir ffmpeg -framerate 1 -pattern_type glob -i '*.png' -c:v libx264 -r 30 -pix_fmt yuv420p out.mp4en Ubuntun 19.10 ffmpeg 4.1.4 ahora, ¿cuál es su versión y comando exacto?
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
20

Versión simple de los documentos

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

ffmpeg -framerate 24 -i Project%03d.png Project.mp4
Joshua Pinter
fuente
1
No se puede reproducir esta salida: [h264 @ 0x7f148cc3cc40] el acelerador de hardware no pudo decodificar la imagen
Bram
hola, ¿cómo puedo ejecutar ese comando? Solo estoy encontrando eso, ¿pueden ayudarme?
Inocente
@Inocente desde su terminal o consola.
Joshua Pinter
lo tengo hombre pero el proyecto% 3d.png no seleccionó todas mis imágenes en una carpeta con el nombre Project001.png, Project002.png y así sucesivamente, solo obtuvo 2 imágenes, ¿qué debo hacer para obtener todas mis imágenes y convertirlas a video
Inocente
¿Estás usando %3do %03d?
Joshua Pinter
10

cat *.png | ffmpeg -f image2pipe -i - output.mp4

de wiki

Hambre
fuente