Como criar um vídeo a partir de imagens usando o FFmpeg?

82

É possível usar ffmpeg criar um vídeo a partir de um conjunto de sequências, onde o número não começa do zero?

Por exemplo, tenho algumas imagens [test_100.jpg, test_101.jpg, test_102.jpg, ..., test_200.jpg] e quero convertê-las em um vídeo. Eu tentei o seguinte comando, mas não funcionou (parece que o número deve começar do zero):

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

Algum conselho?

    
por JakeGould 13.05.2010 / 19:58

12 respostas

72

Não há necessidade de renomear arquivos se estiver usando a opção -start_number da seguinte forma:

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

onde n é o início da sequência de fotos.

Note que isto funcionará enquanto a sequência estiver ininterrupta quando for iniciada. Se houver lacunas e você quiser que todos os alvos sejam incluídos, renumeração pode ser necessária para preencher as lacunas.

Existem alguns outros switches que você pode achar úteis.

Eu uso o seguinte liner para obter uma taxa de quadros mais lenta e compactar as imagens e ter um vídeo resultante menor:

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

A opção -r 3 define a taxa de quadros do vídeo resultante como 3 quadros por segundo, para que eu possa ver cada foto por um curto período de tempo. A opção -s redimensiona as imagens para a resolução desejada para gerenciar o tamanho do vídeo resultante.

(No shell do Windows, substitua -i Imgp%04d.jpg por -i "Imgp%%04d.jpg" . Acrescente isso a Mike Fitzpatrick link )

    
por 28.08.2012 / 15:19
34

você pode usar este snippet de código abaixo:

 cat *.jpg | ffmpeg -f image2pipe -r 1 -vcodec mjpeg -i - -vcodec libx264 out.mp4
    
por 08.11.2012 / 15:33
17

Você pode encontrar um script de exemplo na documentação do ffmpeg :

3.2 How do I encode single pictures into movies?

If you have large number of pictures to rename, you can use the following command to ease the burden. The command, using the bourne shell syntax, symbolically links all files in the current directory that match *jpg to the /tmp' directory in the sequence ofimg001.jpg', 'img002.jpg' and so on.

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

Then run:

ffmpeg -f image2 -i /tmp/img%03d.jpg /tmp/a.mpg
    
por 18.07.2010 / 19:02
11

Até onde eu sei, você não pode iniciar a sequência em números aleatórios (não lembro se você deve iniciar em 0 ou 1), mais, não pode ter lacunas, se isso acontecer, ffmpeg assumirá a sequência acabou e parou de adicionar mais imagens.

Além disso, conforme declarado nos comentários da minha resposta, lembre-se de que você precisa especificar a largura do seu índice. Como:

imagem% 03d.jpg

E se você usar um tipo de índice% 03d, precisará preencher seus nomes de arquivo com 0, como:

image001.jpg image002.jpg image003.jpg

etc.

    
por 13.05.2010 / 20:15
10

De documentos do ffmpeg:

Usando um padrão glob

O ffmpeg também suporta globbing estilo bash (* representa qualquer número de qualquer caractere).

Isso é útil se suas imagens são sequenciais, mas não necessariamente em ordem numericamente sequencial, como nos exemplos anteriores.

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

Portanto, contanto que seus arquivos sejam classificados, a opção -pattern_type glob funcionará para você.

    
por 13.07.2014 / 09:11
5

Eu concordo com o Francisco, mas como uma solução alternativa, você poderia simplesmente escrever um script rápido para mover ou criar links simbólicos para os arquivos com os números de sequência que o ffmpeg precisa. O script pode então chamar o ffmpeg e depois remover os links ou mover os arquivos de volta para seus locais originais.

    
por 13.05.2010 / 20:23
1

procure

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

Eu usei o codificador flv desde que meu vídeo estava indo em um flash player (Jwplayer)

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

    
por 11.11.2011 / 19:04
0

Você pode fazer isso com convert -morph :

convert *.jpg -delay 10 -morph 10 %05d.jpg
    
por 15.01.2016 / 00:22
0

A partir da documentação , parece que você pode simplesmente usar *

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 melhorar a qualidade, a taxa / fps pode ser importante (por exemplo, primeiro especificando a taxa de quadros muito baixa / alta e depois passar de um segundo filtro que tornará o vídeo em câmera lenta normal)

    
por 29.01.2016 / 13:05
0

Eu sei que essa é uma pergunta antiga, mas eu a deparei no Google enquanto procurava a mesma resposta. Nenhuma das respostas aqui me satisfez completamente, então eu fiz mais pesquisa e leitura e este é um comando que eu criei para o meu próprio problema.

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

A razão pela qual eu usaria um comando como este é ...

  1. Cat e -f image2pipe oferecem mais controle sobre as imagens que você usar. Por exemplo, ele permite que você use recursos bash como suporte expansão e outros comandos como o grep para ajustar seus resultados você deve escolher.
  2. Menos opções para lembrar.
  3. Eu recomendo que NÃO use -r e use apenas -framerate. No meu experiência -r tende a perder quadros com mais frequência.
  4. Menos complexo, nenhum comutador desnecessário em uso e funcionará como está. Você pode adicionar mais complexidade (por exemplo, especificando codificador) e afinar para atender às suas necessidades.
por 04.08.2016 / 01:44
0

No meu caso, foi um pouco mais complicado por causa dos números nos arquivos. Veja como minhas imagens se parecem:

$ 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

e aqui está o comando que usei:

ffmpeg -i 2014_aq_unprocessed\ %3d.jpg  -vcodec mpeg4 test.avi
    
por 30.10.2017 / 19:28

Tags