Como fazer com que o FFMPEG se junte a arquivos de imagem não sequenciais? (pule por 3s)


27

Eu tenho um monte de imagens que seguem esse padrão.

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

Eles estão na ordem correta, mas o FFMPEG ignora qualquer coisa após o primeiro arquivo, porque não consegue encontrar um 0002.png. Como faço para ingressar nesses arquivos?

eu tentei

ffmpeg -i %04d.png out.avi

2
Que tal renomeá-los temporariamente, criar o AVI e renomeá-los novamente para o esquema (3x-2) .png? Utilitário de renomeação em massa @ bulkrenameutility.co.uk/Main_Intro.php é um renomeador em massa gratuito, umm.
Gyan

Respostas:


18

com o ffmpeg 0.11.1 é tão fácil quanto:

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

Na manpágina, em um exemplo em "Conversão de formato de arquivo de vídeo e áudio":

Ao importar uma sequência de imagens, -itambém suporta a expansão de padrões curinga do tipo shell (globbing) internamente. Para diminuir a chance de interferir nos nomes de arquivos reais e na expansão glob do shell, você deve ativar os metacaracteres glob prefixando-os com um único %caractere, como em foo-%*.jpeg, foo-%?%?%?.jpegou foo-00%[234%]%*.jpeg.

Atualização por comentários: nas versões recentes, você deve agora usar a -i '*.png'sintaxe.


3
Este não foi trabalhar para mim usando ffmpeg ou avconv no Ubuntu 13.04
hellocatfood

2
Parece não ser mais uma opção.
Timmmm 27/01

2
O glob_sequencetipo de padrão está obsoleto, mas o globtipo de padrão não está. A resposta de Mulvya e Peter Cordes funciona.
dr. Sybren

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

11
Assim como esclarecimento, uma vez que atualmente esta página é o principal resultado do Google para essa mensagem de aviso ( Pattern type 'glob_sequence' is deprecated...): o comando fornecido pelo rymo acima (especificamente -i %*.png) fará com que o aviso seja exibido . Para eliminá-lo, use a sintaxe um pouco diferente na resposta de Peter Cordes ( -i '*.png').
James

19

Além da solução alternativa no meu comentário, você deve poder usar esta sintaxe da documentação do ffmpeg :

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

As aspas são importantes, você precisa do ffmpeg para ver o *, não precisa que o shell o expanda.


Não funciona para mim, mas é provavelmente porque tenho uma versão mais antiga. Estou aceitando este porque é mais provável que ajude futuros usuários.
Brigand

De acordo com a documentação do ffmpeg, você deve usar '* .png' em vez de% 04d.png com o tipo de padrão glob.
Friend Of George

Isso selecionaria todos os pngs presentes na pasta, além de 00xx.png, enquanto o OP deseja enfileirar apenas os% 04d pngs sem se preocupar com a continuidade da numeração.
Gyan

2
Tenho certeza de que você precisa colocar *.pngaspas simples (assim '*.png') para evitar que seja expandido por shells no estilo Unix (assim, OSX e linux etc.).
precisa saber é

11
Infelizmente, os desenvolvedores do ffmpeg fazem com que o suporte ao globbing de arquivos seja uma opção ! As construções padrão do Windows não o incluem.
Timmmm 27/01

9

Em http://www.ffmpeg.org/faq.html : Se você tiver um grande número de fotos para renomear, use o seguinte comando para aliviar a carga. O comando, usando a sintaxe bourne shell, vincula simbolicamente todos os arquivos no diretório atual que correspondem * jpg ao diretório '/ tmp' na sequência de 'img001.jpg', 'img002.jpg' e assim por diante.

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


Eu usei isso para combinar várias seqüências seqA-[0001-n].png, seqB-[0001-n].pngetc. Muito mais fácil do que brincar com o image2 globbing e o filtro concat.
Z0R

Para mim isso não funcionou até que eu substituído for i in *jpgcom for i in /full/path/*jpg, porque todos os links simbólicos foram quebrados
Jezzamon

4

Na verdade, eu sugeriria a mesma coisa que Mulvya sugeriu. Sempre que eu precisava fazer coisas assim ao lidar com renderizações de animação em 3D, renomeia os arquivos para torná-los seqüenciais. É mais fácil trabalhar dessa maneira em vários softwares diferentes, a menos que você precise preservar os nomes dos arquivos por algum motivo. O Total Commander também é uma ótima ferramenta para renomeação múltipla.


Acabei fazendo algo semelhante (um script de renomeação do Python).
Brigand

3

Para a parte da sequência que faltava, usei 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 isso ajude alguém no futuro

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.