-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 imagemagick
o 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 identify
salida 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, -glob
tenga 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 30
hace que el -framerate 1
video 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