Cómo crear un video de imágenes usando FFmpeg?

¿Es posible utilizar ffmpeg crear un video a partir de un conjunto de secuencias, donde el número no empieza desde cero?

Por ejemplo, tengo algunas imágenes [test_100.jpg, test_101.jpg, test_102.jpg, …, test_200.jpg], y quiero convertirlas a un video. He intentado el siguiente comando, pero no funcionó (parece que el número debe comenzar desde cero):

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

Cualquier consejo?

No es necesario cambiar el nombre de los archivos si se utiliza el -start_number la -start_number manera:

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

Donde n es el comienzo de la secuencia de imágenes fijas.

Tenga en cuenta que esto funcionará siempre y cuando la secuencia esté ininterrumpida una vez que se inicie. Si hay vacíos y desea que todos los fotogramas incluidos, a continuación, la renumeración puede ser necesario para llenar los vacíos.

Hay algunos otros interruptores que puede ser útil.

Utilizo el trazador de líneas siguiente para conseguir una tarifa de marco más lenta y 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 en 3 fotogramas por segundo para que pueda ver cada fotograma por un corto período de tiempo. La opción -s vuelve a ajustar las imágenes a la resolución deseada para administrar el tamaño del vídeo resultante.

(En el shell de Windows, reemplace -i Imgp%04d.jpg por -i "Imgp%%04d.jpg" . Crédito por esto a Mike Fitzpatrick https://superuser.com/a/344178/153054 )

Puede utilizar este fragmento de código a continuación:

  cat *.jpg | ffmpeg -f image2pipe -r 1 -vcodec mjpeg -i - -vcodec libx264 out.mp4 

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

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

Si tiene un gran número de imágenes para cambiar el nombre, puede utilizar el siguiente comando para aliviar la carga. El comando, usando la sintaxis del shell bourne, enlaza simbólicamente todos los archivos del directorio actual que coinciden con * jpg al /tmp' directory in the sequence of img001.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 

Entonces corre:

 ffmpeg -f image2 -i /tmp/img%03d.jpg /tmp/a.mpg 

Por lo que sé, no se puede iniciar la secuencia en números aleatorios (no recuerdo si debería empezar a 0 o 1), además, no puede tener lagunas, si lo hace, ffmpeg asumirá que la secuencia ha terminado y Deje de añadir más imágenes.

Además, como se indica en los comentarios a mi respuesta, recuerde que necesita especificar el ancho de su índice. Me gusta:

Image% 03d.jpg

Y si usas un tipo de índice% 03d, necesitas poner los nombres de tus ficheros con 0, como:

Image001.jpg image002.jpg image003.jpg

Etc.

De los documentos de ffmpeg:

Uso de un patrón glob

Ffmpeg también soporta globos estilo bash (* representa cualquier número de caracteres).

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

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

Por lo tanto, siempre y cuando sus archivos están ordenados, utilizando el -pattern_type glob debería funcionar para usted.

Estoy de acuerdo con Francisco, pero como una solución, sólo podría escribir un guión rápido para mover o crear enlaces simbólicos a los archivos con los números de secuencia que necesita ffmpeg. La secuencia de comandos podría llamar a ffmpeg y, a continuación, quitar los vínculos o mover los archivos de nuevo a sus ubicaciones originales.

buscar

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

He utilizado el codificador flv ya que mi video iba en un reproductor flash (Jwplayer)

Ffmpeg -i% d.jpg -vcodec flv test.flv

Puede hacer esto con convert -morph :

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