¿Cómo hacer que FFMPEG se una a archivos de imagen no secuenciales? (saltar por 3s)


27

Tengo un montón de imágenes que siguen este patrón.

0001.png
0004.png
0007.png
0010.png
0013.png
0016.png
0019.png
...

Están en el orden correcto, pero FFMPEG ignora cualquier cosa después del primer archivo, porque no puede encontrar un 0002.png. ¿Cómo puedo hacer que se una a estos archivos?

Lo intenté

ffmpeg -i %04d.png out.avi

2
¿Qué hay de cambiarles el nombre temporalmente, hacer el AVI y luego cambiarlos de nuevo al esquema (3x-2) .png? Bulk Rename Utility @ bulkrenameutility.co.uk/Main_Intro.php es un renombrador gratuito, umm, masivo.
Gyan

Respuestas:


18

con ffmpeg 0.11.1 es tan fácil como:

ffmpeg -f image2 -i %*.png out.avi

Desde la manpágina, en un ejemplo bajo "Conversión de formato de archivo de video y audio":

Al importar una secuencia de imágenes, -itambién es compatible con la expansión interna de patrones comodín tipo shell (globbing). Para reducir la posibilidad de interferir con sus nombres de archivo reales y la expansión global de la shell, debe activar los metacaracteres globales al prefijarlos con un solo %carácter, como en foo-%*.jpeg, foo-%?%?%?.jpego foo-00%[234%]%*.jpeg.

Actualización por comentarios: en versiones recientes, ahora debe usar la -i '*.png'sintaxis.


3
Esto no me ha funcionado con ffmpeg o avconv en Ubuntu 13.04
hellocatfood

2
Esto parece no ser una opción más.
Timmmm

2
El glob_sequencetipo de patrón está en desuso, pero el globtipo de patrón no. La respuesta de Mulvya y Peter Cordes funciona.
dr. Sybren

1
Pattern type 'glob_sequence' is deprecated: use pattern_type 'glob' instead
Serge Stroobandt

1
Solo como aclaración, ya que esta página es actualmente el principal resultado en Google para ese mensaje de advertencia ( Pattern type 'glob_sequence' is deprecated...): el comando dado por rymo arriba (específicamente -i %*.png) causará la advertencia. Para eliminarlo, use la sintaxis ligeramente diferente en la respuesta de Peter Cordes ( -i '*.png').
James

19

Además de la solución en mi comentario, debería poder usar esta sintaxis de la documentación de ffmpeg :

ffmpeg -f image2 -pattern_type glob -i '*.png' out.avi

Las comillas son importantes, necesita ffmpeg para ver *, no hacer que el shell lo expanda.


No funciona para mí, pero probablemente sea porque tengo una versión anterior. Estoy aceptando este porque es más probable que ayude a los futuros usuarios.
Brigante

De acuerdo con la documentación de ffmpeg , debe usar '* .png' en lugar de% 04d.png con el tipo de patrón glob.
Amigo de George

Eso seleccionaría todos los pngs presentes en la carpeta, además de 00xx.png, mientras que el OP quiere poner en cola solo los pngs% 04d sin preocuparse por la continuidad de la numeración.
Gyan

2
Estoy bastante seguro de que necesita poner *.pngcomillas simples (así '*.png') para evitar que se expanda con shells de estilo Unix (así, OSX y Linux, etc.).
evilsoup 05 de

1
Lamentablemente, los desarrolladores de ffmpeg hacen que la compatibilidad con el almacenamiento de archivos sea una opción . Las compilaciones estándar de Windows no lo incluyen.
Timmmm

9

Desde http://www.ffmpeg.org/faq.html : si tiene un gran número de imágenes para cambiar el nombre, puede usar el siguiente comando para aliviar la carga. El comando, usando la sintaxis de shell bourne, vincula simbólicamente todos los archivos en el directorio actual que coinciden con * jpg al directorio '/ tmp' en la secuencia de 'img001.jpg', 'img002.jpg' y así sucesivamente.

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


Utilicé esto para combinar múltiples secuencias seqA-[0001-n].png, seqB-[0001-n].pngetc. Mucho más fácil que perder el tiempo con el globing de image2 y el filtro concat.
z0r

Para mí esto no funcionó hasta que sustituye for i in *jpgcon for i in /full/path/*jpg, porque todos los enlaces simbólicos se rompieron
Jezzamon

4

De hecho, sugeriría lo mismo que sugirió Mulvya. Siempre que he necesitado hacer cosas como esta cuando se trata de representaciones de animación en 3D, he cambiado el nombre de los archivos para que sean secuenciales. Es más fácil trabajar de esa manera en muchos programas diferentes a menos que necesite conservar los nombres de los archivos por alguna razón. Total Commander también es una gran herramienta para renombrar múltiples.


Terminé haciendo algo similar (un script de cambio de nombre de Python).
Brigante

3

Para la parte de la secuencia que falta, usé 2 liner

CONCAT=$(echo $(ls *.png | sort -n -t _ -k 2) | sed -e "s/ /|/g")
ffmpeg -framerate 25 -i "concat:$CONCAT" -c:v libx264 -profile:v high -pix_fmt yuv420p output.mp4

Espero que esto ayude a alguien en el futuro

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.