2010-05-13 17:58:09 +0000 2010-05-13 17:58:09 +0000
89
89

¿Cómo crear un vídeo a partir de imágenes con FFmpeg?

¿Es posible utilizar ffmpeg para crear un vídeo a partir de un conjunto de secuencias cuyo número no empiece por cero?

Por ejemplo, tengo algunas imágenes [test_100.jpg, test_101.jpg, test_102.jpg, …, test_200.jpg], y quiero convertirlas en un vídeo. He probado el siguiente comando, pero no ha funcionado (parece que el número debería empezar por cero):

ffmpeg -i test_%d.jpg -vcodec mpeg4 test.avi

¿Algún consejo?

Respuestas (10)

84
84
84
2012-08-28 13:19:14 +0000

No es necesario renombrar los archivos si se utiliza el interruptor -start_number de esta manera:

ffmpeg -start_number n -i test_%d.jpg -vcodec mpeg4 test.avi

donde n es el inicio de la secuencia de fotogramas.

Nota, esto funcionará siempre que la secuencia sea ininterrumpida una vez que comience. Si hay huecos y quiere que se incluyan todos los fotogramas, entonces puede ser necesario renumerar para rellenar los huecos.

Hay algunos otros interruptores que puede encontrar útiles.

Yo utilizo el siguiente para conseguir una velocidad de fotogramas más lenta y para comprimir las imágenes y tener un vídeo resultante más pequeño:

ffmpeg.exe -f image2 -framerate 25 -pattern_type sequence -start_number 1234 -r 3 -i Imgp%04d.jpg -s 720x480 test.avi

La opción -r 3 establece la velocidad de fotogramas del vídeo resultante a 3 fotogramas por segundo para que pueda ver cada fotograma durante un corto período de tiempo. La opción -s reescala las imágenes a la resolución deseada para gestionar el tamaño del vídeo resultante.

(En el intérprete de comandos de Windows, sustituya -i Imgp%04d.jpg por -i "Imgp%%04d.jpg". El crédito por esto es para Mike Fitzpatrick https://superuser.com/a/344178/153054 )

17
17
17
2010-07-18 17:02:21 +0000

Puede encontrar un script de ejemplo en la documentación de ffmpeg :

3.2 ¿Cómo codifico imágenes individuales en películas?

Si tiene un gran número de imágenes que renombrar, puede utilizar el siguiente comando para aliviar la carga. El comando, que utiliza la sintaxis del shell bourne, enlaza simbólicamente todos los archivos del directorio actual que coincidan con *jpg con el /tmp' directory in the sequence ofimg001.jpg’, `img002.jpg’ y así sucesivamente.

x=1; for i in *jpg; do counter=$(printf %03d $x); ln "$i" /tmp/img"$counter".jpg; x=$(($x+1)); done

Luego ejecuta:

ffmpeg -f image2 -i /tmp/img%03d.jpg /tmp/a.mpg
14
14
14
2014-07-13 07:11:20 +0000

De ffmpeg’s docs:

Using a glob pattern

ffmpeg also supports bash-style globbing (* represents any number of any characters).

Esto es útil si sus imágenes son secuenciales pero no necesariamente en un orden numérico secuencial como en los ejemplos anteriores.

ffmpeg -r 1 -pattern_type glob -i 'test_*.jpg' -c:v libx264 out.mp4

Por lo tanto, siempre que sus archivos estén ordenados, el uso del interruptor -pattern_type glob debería funcionar para usted.

11
11
11
2010-05-13 18:15:35 +0000

Por lo que sé, no puedes empezar la secuencia en números aleatorios (no recuerdo si debes empezarla en 0 o 1), además, no puede tener huecos, si los tiene, ffmpeg asumirá que la secuencia ha terminado y dejará de añadir más imágenes.

Además, como se indica en los comentarios de mi respuesta, recuerda que debes especificar el ancho de tu índice. Por ejemplo

image%03d.jpg

Y si utiliza un tipo de índice %03d, necesita rellenar sus nombres de archivo con 0, como :

imagen001.jpg imagen002.jpg imagen003.jpg

etc.

5
5
5
2010-05-13 18:23:37 +0000

Estoy de acuerdo con Francisco, pero como solución podría escribir un script rápido para mover o crear enlaces simbólicos a los archivos con los números de secuencia que ffmpeg necesita. El script podría entonces llamar a ffmpeg y luego eliminar los enlaces o mover los archivos a sus ubicaciones originales.

2
2
2
2016-08-03 23:44:55 +0000

Sé que esta es una pregunta vieja pero me encontré con ella en Google mientras buscaba la misma respuesta. Ninguna de las respuestas aquí me satisfizo completamente así que hice más búsqueda y lectura y este es un comando que se me ocurrió para mi propio problema.

cat {0032..1501}*.png | ffmpeg -f image2pipe -framerate 5 -i - -s 720x480 test2.avi

La razón por la que usaría un comando como este es…

  1. Cat y -f image2pipe te dan un control más fino sobre las imágenes que utilizas. Por ejemplo, te permite utilizar funciones de bash como la expansión de corchetes y otros comandos como grep para afinar tus resultados si así lo deseas.
  2. Menos interruptores que recordar.
  3. Recomiendo NO usar -r, y en su lugar usar -framerate. En mi experiencia, -r tiende a perder fotogramas con más frecuencia.
  4. Menos complejo, no hay interruptores innecesarios en uso y funcionará tal cual. Puede añadir más complejidad (por ejemplo, especificar el codificador) y ajustar para satisfacer sus necesidades.
0
0
0
2019-08-22 09:59:39 +0000

-pattern_type glob ejemplos concretos con audio

Esta opción fue mencionada en: https://superuser.com/a/782520/128124 pero aquí hay algunos ejemplos concretos de su uso, incluso de añadir audio al vídeo de salida.

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

Añadirle música, cortar el audio 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 demos en YouTube:

Sea un hippie y utilice el formato de vídeo sin patente 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 deberían, por supuesto, estar ordenadas alfabéticamente, normalmente como:

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

y así sucesivamente.

Ver también: http://unix.stackexchange.com/questions/68770/converting-png-frames-to-video-at-1-fps/339399#339399

Vídeo a velocidad normal con una imagen por fotograma a 30 FPS

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

Esto es lo que parece:

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

Añadirle 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

Convertir un archivo de música en un vídeo con imagen fija para subirlo a YouTube

Respondido en: ¿Cómo convertir un MP3 a un formato de vídeo permitido por Youtube?

Obtener algunas imágenes sintéticas de entrada

Estas son las imágenes de prueba que he utilizado en esta respuesta:

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: https://stackoverflow.com/questions/3191978/how-to-use-glut-opengl-to-render-to-a-file/14324292#14324292

Es genial observar como el vídeo comprime la secuencia de imágenes mucho mejor que ZIP ya que es capaz de comprimir a través de los fotogramas con algoritmos especializados:

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

Sobre las opciones del CLI

Tenga en cuenta, sin embargo, que a pesar del nombre, -glob esto no es tan general como los patrones del 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 vídeo -framerate 1 sea de 30 FPS para superar los fallos de reproductores como VLC para bajas velocidades de fotogramas: https://stackoverflow.com/questions/19267443/playback-issues-in-vlc-with-low-fps-video-from-images-using-ffmpeg/41797724#41797724 Por tanto, repite cada fotograma 30 veces para mantener el efecto deseado de 1 imagen por segundo.

Siguientes pasos

También querrás:

TODO: aprender a cortar y concatenar múltiples archivos de audio en el vídeo desde la línea de comandos:

Testado en

ffmpeg 3.4.4, vlc 3.0.3, Ubuntu 18.04.

Bibliografía

0
0
0
2017-10-30 18:28:51 +0000

En mi caso, fue un poco más complicado debido a los números de los archivos. Así es como se ven mis imágenes:

$ ls | head -5
2014_aq_unprocessed 001.jpg
2014_aq_unprocessed 002.jpg
2014_aq_unprocessed 003.jpg
2014_aq_unprocessed 004.jpg
2014_aq_unprocessed 005.jpg

y este es el comando que utilicé:

ffmpeg -i 2014_aq_unprocessed\ %3d.jpg -vcodec mpeg4 test.avi
0
0
0
2016-01-29 12:05:41 +0000

A partir de la documentación , parece que se puede utilizar simplemente \N*

For example, for creating a video from filenames matching the glob pattern foo-*.jpeg:

ffmpeg -f image2 -pattern_type glob -framerate 12 -i 'foo-*.jpeg' -s WxH foo.avi

Como nota, para que afecte mejor a la calidad, la tasa/fps podría ser importante (por ejemplo, especificar primero una tasa de fotogramas muy baja/alta y luego pasar de un segundo filtro que haga el vídeo a cámara lenta a uno normal?)

0
0
0
2016-01-14 23:22:34 +0000

Puedes hacerlo con convert -morph :

convert *.jpg -delay 10 -morph 10 %05d.jpg

Si quieres usar ffmpeg, yo usé

ffmpeg -pattern_type glob -i '*.jpg' -vf "setpts=10*PTS" movie.mp4

donde el 10*PTS le dice a ffmpeg que lo ralentice 10 veces. También puede tener fracciones allí para acelerarlo.

Preguntas relacionadas

6
10
7
5
37